* Change: In CRL Core, etc/, update the configuration files of real
technologies. Mostly for FreePDK 45. This work is also done for
AMS c35b4 (350nm) but in a private (SoC) git repository.
Added a new parameter 'lefImport.minTerminalwidth' for the
minimum size (width) of a metal1 terminal in standard cells.
Corrected bug of the minimum trace level which must be
initialized to a great value and *not* zero;
* Change: In CRL Core, BlifParser, detect when there is no tie low
or tie high defined, issue an error (connexion left open) but
continue.
* New: In CRL::RoutingLayerGauge, new overlad of getTrackPosition()
with the parameter set of getTrackIndex(). Used to know if a
terminal is on-grid or not.
* New: In CRL::LefImport, smarter management of metal1 pins. Adds a
_pinPostProcess() function to select the external components
among the various shapes. If the gauge is VH, all the pin rectangles
are translateds into vertical segments (even if the metal1 gauge
says the tracks are horizontals).
The _pinPostProcess() function adds as external components of
a net, only the segments of a sufficent width as given in
'lefImport.minTerminalWidth' and that are on-grid.
* Change: In Hurricane::Technology, in all the layer connexity methods
(getLayers(), getMetalAbove(), getCutAbove(), getViaBetween(), ...)
the "useWorking" parameter is replaced by a more accurate "useSymbolic".
BEHAVIOR CHANGE: formerly, if a symbolic layer was requested, and
none was found, NULL was returned. Now, if the symbolic layer is not
found, we try to return the associated real one (same layer mask,
but not flagged as symbolic, and usually with a lowercase name).
All thoses changes have been propagated to Python bindings.
* Change: In Hurricane::BasicLayer and derived classes, rename the
"isWorking" attribute into "isSymbolic" (to match the technology
renaming).
* Change: In Hurricane::Cell::flattenNets(), ignore power, ground and
blockage nets for the flatten.
* Change: In CRL Core, in coriolisInit.py and Technology.py helpers,
rename the tables describing the technology as follow:
- symbolicLayersTable --> compositeLayersTable
- workingLayersTable --> symbolicLayersTable
- symbolicRulesTable --> layersExtensionsTable
This is to give the table names a more clearer semantic after
merging real technologies configurations (testbench AMS c35b4).
In particular, we need to define a composite layer for the
real VIAs, and not only the symbolic ones. And with correct
enclosures expressed in real dimensions (microns).
* Bug: In Hurricane the ::tstream class must be initialized with a
minLevel of 10000 instead of zero, as the minLevel go *towards*
zero as the debug slice [min:max[ is expanded by DebugSession.
This default value must be repeated in the CRL::System CTOR
and in the coriolis2/etc/commons/misc.conf.
* Bug: In Hurricane::IntrusiveSet, uses "tsetw(n)" dedicated cdebug
stream manipulator instead of the STL one.
* New: In Anabatic::NetBuilder, set all the attributes as private and
create accessors and mutators.
Finish virtualising all GCell build methods and transfer them
into the NetBuilderHV class.
Build methods now return a boolean to tell if the GCell was
processed or not, to allow cascading in the "big switch".
Reorganise the "big switch" in separate sections only partially
cascading.
Truly fuse the *big switch* for channel routing and over-the-cells.
Create a new method "_do_globalSegment()" to delagate the
drawing of global segments between two GCell to the derived classes.
* New: In CRL Core, AllianceFramework::getCell(), adds a new Catalog::State
flags to request the loading of a "foreign" cell. That is, a Cell which
is *not* in the Alliance libraries, but in *any* library starting from
the root library. This is a temporary hack to allow the Blif parser to
run.
* New: In CRL Core, RoutingGauge::getHorizontalGauge() and
RoutingGauge::getVerticalGauge() to avoid relying on either metal names
or depth to know the vertical and horizontal default routing
informations. They return the metal layers gauges *closests* to the
substrate which are likely to have the lesser pitch.
* New: In CRL Core, BlifParser, new configuration parameters:
"etesian.cell.zero" & "etesian.cell.one" to figure out what are the
tielow and tiehigh cells (instead of having the ones from sxlib
hardwired).
* New: In Etesian, add support for non-square routing pitchs, that is,
the lowest vertical and horizontal pitches are not equal. Needs to
work with two pitches (H & V) instead of one.
The Configuration associated class now also provides the
RoutingGauge (not only the CellGauge).
Use a new Configuration setting "etesian.feedNames" to set up
the names of the filler cells. This a string of comma separated
cell names.
* New: In Anabatic, Session::_getNearestGridPoint(), use the new
non-square grid scheme.
* New: In CRL Core, added LEF importer for real technologies. This is
still a work in progress. Exported in Python interface.
* Bug: In CRL Core, CellGauge::getRecord() correctly display DbU
attributes.
* Change: In Unicorn, mofificate ImportCell and ImportCellDialog to
support the LEF importer. Add a template layer so we can work with
loaders returning Cell* or Library*.
* Change: In Unicorn::UnicornGui::getCellFromDb(), in addition to the
Alliance loader, uses the DataBase::getCell() too (for Cells that
are *not* in Alliance).
* Change: In CRL Core, in coriolis2/etc the file an directory structure
describing the technonolies is modified.
Before, one technology was split in two: the symbolic part that
may be shared across multiple real technology and the real technology
itself. To configure this we needed in ".coriolis2/techno.py" two
variables:
* symbolicTechnology.
* realTechnology.
After, we duplicate the symbolic technology in each real ones, so
to configure we only have to refer to one technology with the
variable:
* technology.
Pure sympolic technologies are still availables, associated with
a dummy real one.
We provides:
* 180/scn6m_deep_09 for MOSIS 180nm
* 45/freepdk_45 for FreePDK 45nm (work in progress).
* symbolic/cmos for classical Alliance symbolic.
* Change: In CRL Core python/helpers, SymbolicTechnology.py and
RealTechnology.py are now grouped under Technology.py.
* New: Hurricane::DataBase::getCell() method to search a cell through
all the libraries of *all* the frameworks, not just Alliance.
Also exported in Python interface.
* Bug: In Technology::getNthMetal() the function was not returning the
right metal, there was an offset of one. And when the offset was
0, no metal was even returned. Same fix goes for getNthCut().
The fault was in Mask<>::nthbit().
* Change: In Hurricane::CellWidget, the initial window size is too tiny.
Increase the size from 250 to 500 pixels.
* New: In CRL Core Python helpers, add a "showPythonTrace()" function to
custom display the Python stack trace in case of exception. It ha
been made to look like a gdb trace.
* In Unicorn, cgt.py, use showPythonTrace().
* New: As, starting from version 5.8, LEF/DEF parser/drivers are
availables under Apache 2.0 license, integrate them inside the
project. Rewrite the Makefiles into CMakeLists.txt, build only
the C++ version. Create an entry for the LEF/DEF doc in the
documentation.
* New: In CRL Core, etc/cmos/kite.conf new routing gauge "sxlib-2M" for
two metals only technologies.
* New: In CRL Core, python/helpers/kite.py, new parameter to set the
routing gauge to be used: "kite.routingGauge" (default: "sxlib").
* Change: In CRL/AllianceFramework.cpp, forgot to put the Cell gauges
and RoutingGauges in the object Records (Inspector).
* New: In pyCRL/PyAllianceFramework.cpp, export the setRoutingGauge()
function.
* New: In Anabatic::AutoContact and the derived classes, manages wide
wires. The contact self dimension itself according to the segments
it is connected to. Special case for the AutoContactTerminal which
also read the size of the component it is anchored upon.
New refresh method "updateSize()" and flag CntInvalidatedWidth.
to compute the size.
In AutoContactTerminal, compute the constraint box according to
the width of the segment.
* New: In Anabatic::AutoSegment, flags are now implemented as "static const"
attributes of the class. The flags are stored into a uint64_t as
they are more than 32.
Added new flag "SegWide" and associated predicates.
* Change: In GCellTopology::_doHChannel() and GCellTopology::_doVChannel(),
uses the simpler overload of AutoSegment::create() in order to detect
the wire width automatically.
* New: In Katana::Manipulator, split insertToTrack() and forceToTrack()
into a one-track method and a segment level method that iterate over
the track span of the segment.
* New: In Katana::SegmentFsm, for each cost in the table, now allow access
to a specific track. So the base functions have now two parameters:
"icost" and "itrack" (has a cost can have multiple tracks in the case
of wide segments).
* Change: In Katana::TrackElement, remove the index of the element inside
it's track, as for a wide segment it will not be meaningful for the
non-base track. This means that we have to use the Track::find()
method each time instead.
Remove the wide flag, as it is a duplicate of the one in AutoSegment.
Added a getTrackCount() method to tell the number of track the
segment is inserted into. Needed in the Track destroy step to delete
a segment only when the last track that refers it is destroyed.
Added getSymmetricAxis() to correct the computation of the symmetric
base track in case of wide segment as the base track is not centered
but the the leftmost one.
* Change: In Track::insert() insert wide segments in their whole track span.
* Change: In TrackCost, create an array of costs according to the segment
track span.
* Change: In TrackSegment::create(), now activate the factory and create
wide segments.
* Bug: In Katana::AutoSegments_Perpandicular, correct the debug indentation
problem (ever shifting to the right).
* New: In Anabatic_AutoSegments collection, added a Flag to the constructors
to allow different behavior between digital and analog modes.
For "Aligneds" and "Perpandiculars" collections, now manage a new
Flag WithDoglegs to follow aligned globals through local doglegs
(for analog nets).
Adjust the log level of collections to 144 (formerly 145).
* New: In Anabatic::AutoSegment, new flag SegAnalog for segments that are
part of an analog net.
Note that with this flag, we reach the 32 bits limit...
* Change: In Anabatic::Constants, Flags are now declared as BaseFlags
objects and *not* uint64_t. This avoids overload resolution problems with
arithmetical overload of the operators.
The BaseFlags/Flags types are now completly "isolated" from the
uint64_t, it has the advantage of showing where unwanted previous implicit
conversions where occuring.
* Change: In Katana::Constants, Flags values are now of BaseFlags type instead
of uint64_t.
* Change: In Anabatic::Dijkstra, lots of log cleanup.
* Change: In Anabatic::GCell::getSide(), make the "shrink" parameter visible
to allow to substract the topmost and rightmost track for axis span
computation in AutoSegment::computeOptimal(). Used for analog mode.
* Change: In NetRoutingState, added a flag for analog mode. Use uint32_t
for the flags type.
* New: In Isobar, export the NetRoutingState and NetRoutingExtension objects.
* Change: In all top CMakeLists.txt, force the use of Python 2.7 as
we do not compile against 3.x flavors. Do not use the "EXACT"
flags as it will not recognize 2.7.x versions.
* Change: In Katana::RoutingEvent::Key::Compare(), preliminary
experiments shows that the best sorting order is:
- Lower layer first (i.e. M2 -> M3 -> M4 -> ... )
- Longer segments first.
The later seems to be counter-intuitive. Guess is that placing
the small ones first generate a more important fragmentation of
the big ones. They are placed too early and are difficult to move
afterwards.
Another feature to test is *not* inserting pushed left/right
segments if they are not *already* routed.
* Change: In PyKatanaEngine.runNegociate() now takes a flag argument,
provided through the new PyKatanaFlags exported object.
(doChip.py must be changed accordingly)
* Change: In Hurrican::Component::_preDestroy(), the cascaded destruction
of slaves Components and subsequent ring merge and Rubber creation
was using set<> sorted on pointer values. This was making the order
of destruction of the slaves components non-deterministic. Now the
sets are sorted according to their id (see Entity).
* Change: In Hurricane::SharedProperty, the _ownerSet is now a vector<>
instead of a set<>. This will slow the search process, but hopefully
this is needed only during construction/destruction of a Property
so the slow down shouldn't be too much.
This has also an impact on Hurricane::Relation.
* Bug: In Hurricane::CellWidget, when setting up a state of a CellWidget,
the selection was not copied. Now copy the SelectorCriterion (clone).
* New: In Hurricane::SelectorCriterion, add a clone() method.
* Change: In CRL Core, in etc/common/display.conf, for the Printer.Coriolis
style, lower the thresold of display for the substrate layers so they
are shown even in small zoom mode.
* Change: In Hurricane::BaseFlags, store flags in uint64_t instead of
unsigned int because we start to need more than 32 different flags
in some tools.
* New: In ::getString() & ::getRecord() templates, add support for
std::array<>.
* Change: In CRL::ToolEngine, add support for timer (time & memory
measurements) displaced from Katabatic. This way all ToolEngine
can use this feature. The _postCreate() method display the
memory just after ToolEngine allocation.
* Change: In Etesian::EtesianEngine, make use of the ToolEngine
builtin timer (remove the local one). Forgot to call the base
class _postCreate() and _preDestroy().
* Change: In Anabatic::AnabaticEngine, make use of the ToolEngine
builtin timer (remove the local one).
* New: In Anabatic, new AutoSegments_Connecteds() collection. This
Collection allows a deterministic walkthough *all* the AutoSegments
connected either to source or target of one AutoSegment.
* New: In Anabatic::AutoContactTerminal::isEndPoint() to check if an
AutoContactTerminal is the *only one* anchored on a RoutingPad,
thus being a true "end point" and not a kind of feed-through.
* New: In Katana::KatanaEngine, added support for symmetric nets.
Created new class DataSymmetric to store symmetric information
of a net (mainly the paired AutoSegments).
Added KatanaEngine::runSymmetricRouter(), for now only build
the DataSymmetric informations. More to come...
* Change: In Katana::GraphicKatanaEngine::_runTest(), now perform
symmetric information building the non-symmetric routing.
* Bug: In Anabatic::singleGCell(), in some analogic design, there may be
not a single METAL1 in the GCell. Issue a clean warning instead of
going ashtray.
* Change: In CRL.etc/technology.cong & CRL.etc/display.conf, add a "metbot_r"
as a real layer when "metbot" symbolic layer is distinct from a normal
metal.
* New: In CRL.python.helpers, all methods make use of the quiet mode to
allow completly silent initialisation.
Introduce isderived() function to check the derivation relationship
of two C++ encapsulated classes by Isobar. The Python isinstance do
not work, all C++ wrapped classes are of the base type 'type'.
isderived() uses the MRO mechanism (Method Resolution Order) as a
workaround. I can't find in the documentation if it's the expected
behavior or if i did miss something in when building my classes.
* Bug: In CRL.python.coriolisInit(), when it's not set, the stratus1.mappingName
configuration variable is equal to "" and *not* "not_set".
* Bug: In Etesian::EtesianEngine::toColoquinte(), followup of the previous
bug, bad FIXED/PLACED test when the AB is set.
* Bug: In Hurricane::DbU, replace long by DbU::Unit (aka int64_t) in all
remaining occurrences.
* Change: In Hurricane::DbU::getValueString(), rewrite using ostringstream.
* Change: In Hurricane, in PyHurricane.h, PyAny_AsLong<> template to
convert any kind of Python integer into DbU, making sure we always
use 64 bits integers (long long for 32 bits and long for 64 bits).
PyDbU_FromLong<> template to peform the reverse, DbU to Python
integer in 64 bits (either using PyLong_FromLong() or
PyLong_FromLongLong()).
* Bug: In Isobar, in PyArg_ParseTuple(), never use the "l" direct
converter when reading a DbU. Instead read a PyObject then convert
using PyAny_AsLong<>. This ensure to never do a truncature.
* Bug: In CRL::ToolBox::attachPlugOrPin(), simply returns when there is
no plugs/pins to connect instead of doing an assert().
* Change: In Hurricane, more informative trace information for Python
ProxyProperty managment.
* Bug: In Stratus, when merging nets with the "<=" operator some table
of lookup of Hurricane Net are not updated correctly. As I don't
understand well enough the Stratus code **is is not corrected**.
* Change: In bootstrap/FindBootstrap.cmake, new setup_qwt() macro to
link with the Qwt library build with Qt 5 *or* Qt 4 and not the
first found.
* Change: In Hurricane/DbU, uses <int64_t> instead of <long> to always be
sure that we use 64 bits integers for coordinates.
* Change: In Katana/KatanaEngine::_gutKatana() checks that the
RoutingPlanes have been allocateds before trying to delete them.
* New: In Anabatic::AutoSegment, introduce a the kind (associated to a
flag) "LongLocal". Analog GCells can be very wide, so at least some
carefuly choosen long local segments must be took into account as
attractors in the computation of the optimal axis.
* New: In Anabatic::AutoSegment::computeOptimal(), take LongLocal into
account as attractors.
* Change: In ::GCellTopology constructors compare the layers of the
RoutingPads using layer masks instead of Layer pointers. Allows to
find both "METALx" (symbolic) and "metalX" (real).
* Change: In ::GCellTopology::_doHChannel(), _doChannel(), _doStrut()
and _doDevice(), tag long locals as "LongLocal". This need to be
reviewed as it as bind done a bit too quickly.
* Change: In Anabatic::AutoSegment, due too a much bigger span of the
analogic GCells the _optimalMin & _optimalMax bitfields must use
16 bits instead of 8 (they where overflowed).
* New: In Katana, reorganisation of the initialization procedure to fit
both digital and analogic cases. Create an analogInit() method.
* Change: In Katana::RoutingEvent, the _tracksNb and _tracksFree bitfields
where too short for the Analog GCell size, now uses 16 bits instead of
6.
* Bug: In Katana::GraphicKatanEngine::drawGCell(), skip drawing of a
GCell if *both* width and height are under 150 pixels.
* New: In Katana::Session, add a new isOpen() method.
* Bug: In Anabatic::RawGCellsUnder, *again*, the north and east borders
of the whole area *are* includeds (shut up disgraceful warning).
* New: In Anabatic::GCell, add a display mode to select between boundary
display (for analogic) and density display (for numeric).
* Bug: In KatanaEngine::runGlobalRouter(), do not check if an Edge cannot
be desatured when the vector or overloaded Edges is empty.
(one less disgraceful warning)
* New: In GraphicKatanaEngine::drawGCell(), support for drawing the GCells
in density mode. Use the fire scale and the MaxDensity mode.
Setup the GCell drawing mode in GraphicKatanaEngine::initGCell().
* Change: In GraphicKatanaEngine::drawEdge(), adjust the various thresholds
for showing the Edge and its label.
* New: In CRL Core, adds "anabatic.gcell.displayMode" to the set of Anabatic
parameters.
Adjust the showing threshold for GCells in "display.conf" so when the
zoom level is low, we still can see the density map.
* Bug: In Hurricane, in NetlistWidget CTOR, the horizontal header was set
up assuing that there was (at least) three sections (column) in the
model, which was wrong. Now it is done in the setCell() method which
know the exact number of sections.
It was a bug in both Qt 4 & 5, but was showing only under Qt 5.
* Bug: In Anabatic::GCell, when width and/or heigh is null, do not try to
compute densities as it will trigger a divide by zero (and do not make
much sense anyway).
* Change: In CRL Core, in cmos/alliance.conf, honor the ALLIANCE_TOP variable
if it is found in the user's environement.
* New: In Bootstrap, add cmake detection for libbfd.
* New: In Hurricane, in Backtrace, add BFD support to read debuginfo from
the shared libraries (aka DSO) when compiled with "-g". This avoid the
tedious step of running gdb after generating a core dump. It is also
mandatory in ExceptioWidget to known from where an exception was thrown
as Qt::notify() block all C++ exceptions.
Currently works only under Linux (gcc or clang), may be extended in
the future.
The BFD reading is based on the small utility from:
Don Hatch (hatch@plunk.org)
http://www.plunk.org/~hatch/goodies/backtracefilt.C
And small trinket: adjust the size of the window for high DPI screens.
* New: In CRL Core & Unicorn add link toward libbfd, if needed.
* Bug: In Anabatic:
- In _propagate(), on reaching a target, forgot to remove it from
the queue before pushing it back with the new distance. It also
simplificate the core algorithm as target as treated normal nodes.
* New: In Anabatic:
- Update cdebug to use the fastest macro version.
- More readable drawings of GCells and Edges.
- Added timer support.
- The distance is now computed in DbU::Unit (aka long) and not in
normalized float.
- The distance function is now a callback (std::function<>) that
can be changed (a default is provided at initialization).
- New concept of branch in the agglomerated connex component.
Each trace back part create a "branch" (tagged with a "branchId").
When a node is reached with the same distance, but from two
different branches, choose the the branch that was lastly created.
This create a slightly different tree which grows outward from
the newest branches.
- Makes the horizontal edges *slightly* longer than the vertical ones
to skew the tree to use vertical edges, as it is usually less
congested than the horiontal one (due to metal1 cell terminals).
It is also my understanding that it is useful to reduce the
number of vias, whithout introducing a via cost.
* New: In Bootstrap:
- Script sprof.py to perform sprof & demangle libraries execution
profile.
* ToDo: In Anabatic:
- Corner optimization. Sometimes when two corners are possible, the
wrong one is choosen. That is, one of it's edge cannot be used for
further grow of the tree.
* Change: In Hurricane Commons.h, even when cdebug print nothing, it slow
down the program (three times for Kite!). Create a macro cdebug_log
which calls cdebug *only* if the debug level is active.
* Change: In Hurricane::Observer, simplification of the template so that
we can use it directly instead of creating a derived class with an
implementation of Observer::notify(). Now the implemenation is the
same for all and just calls a notify() method on the owner object.
Create a StaticObservable for fast access of the observers. This
is mainly a fixed size table (array<>) with oberservers at known
indexes. This way we can go from the obervable to the observer
owner in one indirect access (or so I hope).
* Change: In Hurricane::CellViewer, use the new observers.
* Change: In Hurricane::ControllerWidget, use the new observers.
* Change: In Hurricane::CellWidget, set the winidow initial size to a
more sensible 500px.
* Change: In CRL::LibraryManager, use the new observers.
* Change: In CRL::LibraryManager, use the new observers.
* Change: In CRL, in display.conf & technology.conf, modification for
the ST hcmos9gp capacitors.