* New: In Anabatic, rename GCellTopology to NetBuilder, expose the class
(no longer in a local namespace).
NetBuilder become a base class performing the walkthrough the Net
tree. Derived class are tasked to build routing for specific gauge.
NetBuilderHV is created to manage all gauge with metal2 horizontal
and metal3 vertical.
In our terminolgy we consider that the first routing metal is
metal2. Metal1 is used inside the standard cells.
* 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.
* Bug: In Hurricane::Occurrence_Contains(), when the Instance to match
is set to NULL, that means we have to accept *all* instances instead
of rejecting them all. This bug was making the Cell::flattenedNets()
to do nothing in digital mode.
* New: Occurrence_Contains filter that tells if an instance is part of
an Occurrence. Checks for two cases:
- The Instance is part of the *path* of the Occurrence.
- The Instance is the associated entity itself.
* New: In Cell::flattenNets() adds a new parameter Instance* to
allow partial flatten of one instance only.
* Bug: In Anabatic::Disjstra::_materialize() check that the
NetRoutingState exists before trying to access it...
in Dijkstra.cpp/.h, Edge.cpp/.h, GCell.cpp/.h:
*Change: GlobalRouting wires can have different wires' width. One Net's wires has one width only.
in NetRoutingProperty.cpp/.h, PyNetRoutingProperty.cpp/.h:
*New: A wire width parameter is added. It can be set through python script.
* New: In Katana::TrackCost, the TrackElement and it's optional
symmetric are now kept as attribute of a TrackCost. The cost
is completly computed inside the constructor.
TrackCost now support any mix of symmetric event and wide
segments.
The cost is now computed by adding directly to the current
one instead of creating secondaries that are merged afterwards.
As a consequence, remove all copy construction and merge
capabilities.
All the various methods used to compute the cost are renamed
"addOverlapcost()" in all the various related objects.
As a reminder, the overal cost method call is as follow:
1. TrackCost constructor on a TrackElement.
2. Call TrackElement::addOverlapcost()
3. For all Track under the TrackElement, call
Track::addOverlapCost()
4. For all other TrackElement intersecting with
the overlap interval call:
TrackElement::incOverlapCost()
5. The callback overlap function for segments
is called (defined in NegociateWidow).
Don't confuse:
- TrackElement::addOverlapCost(), which compute the cost of
inserting the segment inside a track (or a set of).
- TrackElement::incOverlapCost(), which compute the cost of
overlaping with this already inserted segment. It is the
other way around of the previous one.
* Change: In Katana::SegmentFsm, use a vector of pointer to TrackCost
instead of an object to avoid copy construction.
* Bug: In Hurricane::Interval, the ::getSize() method was returning a negative
length when the Interval was empty. Now return zero. This was causing
slight cost functions side effect when computing the overlap of a segment
with another one belonging to the same net (i.e. shareDelta)
* Bug: In Katana::AutoSegment::computeOptimal(), checks that the optimal
position for the axis is indeed inside the GCell interval.
* Bug: In Katana::DataSymmetric::getSymmetrical(Interval&), reverse the shrink
applied to GCells sides. Interval are of the type [min:max[ so after
symmetric transformation they become ]smax:smin]. Apply a correction so
that they are [smax:smin[ and could be merged with the paired interval
(the one without symmetry applied).
* Bug: In katana::TrackCost::consolidate(), the overlap (now) always positive,
and must be *substracted* to the "delta" (not *added*).
* Bug: In Katana::_computeNetOptimals(), now skip the already processeds
AutoSegments instead of re-processing them.
* New: In Katana::AutoSegment::computeOptimal(), improved computation of
the axis hint:
- For analog net, propagate through the simple doglegs to find
attractors.
- Restrict the allowed interval to the union of GCell sides and
segments constraints that are terminals.
- Consider a local as "long" if it's length exceed 20 the P-pitch.
(maybe make that a tool parameter).
* 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)
* New: In Katana::Configuration, added "katana.profileEventCosts" to
triggers the event's profiling.
* New: In Katana::NegociateWindow::_negociate(), save a profiling
trace of all the events and their priority, separated by metal,
for later analysis (see doChip.py in alliance-check-toolkit).
* New: In Katana::RoutingEvent::Key::Compare(), start implementing
new segment freedom degree functions.
* Change: In Hurricane::Net::_getString(), put a more complete
information about the Net instead of just only it's name.
* Bug: In Katana, reorder the various stages so that they are
executed in the exact same sequence as in "doChip.py" so now
routing in graphic mode and text mode gives exactly the same
results.
* Bug: In Katana::PyKatanaEngine, runGlobalRouter do not take any
argument.
* 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.
* New: In Katana::SegmentFsm, the object is now able to handle two events
at the same time. The master and it's symmetric. When there is no
symmetric, the corresponing data is just left blank. This makes a
bigger object, but as there is only one when running, it is not an
issue.
Candidates tracks are now an vector of array<2> (pairs), the
TrackCost::Compare() functor has to be wrapped through CompareCostArray.
The compined TrackCost of the two tracks is accumulated into the first
element.
Everything related to events gets duplicated: _event is now _event1
and _event2, and so on.
As there can be now two Manipulator actions done with SegmentFsm,
this class now completly hide the Manipulator level from the
RoutingEvent processing.
New function ::bindToTrack() to perform the track insertion.
* New: In Katana::TrackCost, add a new ::merge() function.
* New: In Katana::TrackElement and Katana::TrackSegment, add symmetric
management. Allows to know if a TrackElement has a symmetric and to
access it.
* New: In Katana::DataSymmetric, add new overload for ::getSymmetrical()
to handle DbU::Unit and intervals.
* Change: In Katana::RoutingEvent, remove all direct uses of Manipulator
objects. Now any change to the event associated segment must go through
call to Segment Fsm.
* Change: In Katana, adjust the debug level so internal informations are
put below level 156.
* New: In Hurricane::DbU, in ::getValueString(), special display when the
value is Min or Max (more helpful than a gigantic number).
* Change: In Hurricane::CellPrinter::pageDecorate(), the size of the
cartouche was computed for a DPI of 150. Now it is computed to
expand as the DPI increase (scale from the 150 DPI values).
* 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.
- GlobalRouting takes into account self symmetries and symmetries in pair of nets according to an axis. Self symmetries are symmetries considering one net symmetric to an axis. During the materialize step, they are routed symmetrically according to the axis. Symmetries in pair of nets follow the same principle but with 2 nets.
In LocalGlobalRouting.cpp:
- Minor bug fixed
- Verbose commented
in NetRoutingProperty.cpp/.h:
- Some flags methods methods added
* Change: In Hurricane::Timer, measuring memory usage through the increase
of sbrk() gives erroneous results. Under Linux, now read the
/proc/[pid]/statm which gives the real size of the virtual memory
of the process. There is also code for reading /proc/[pid]/mmap
but it gives only the resident size of the process (i.e. swapped
pages are *not* accounteds).
* Change: In Katabatic, Anabatic, Kite & Katana now reports the total
memory size of the program.
* New: In Hurricane::NetRoutingProperty, added various flags for
symmetric support, axis and slave net (if any).
Json support is not complete yet: have to remember how to
get the slave net when present.
* 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::Net::setExternal(), do not perform an UpdateSession
inside this function, it leads to unbearibly slow operation in the
clock-tree plugin.
* Bug: In Kite, backport corrections done in Katana and also relevant
for Kite.
* New: In Cumulus.ChipPlugin.py add support for Python profiling with
cProfile. Disabled under normal operation, but will certainly come in
handy sometimes.
* Bug: In Hurricane::JsonWriter, add support for "long long". Needed on
32 bits architectures to write DbU that are now int64_t which
resolves to "long long".
* 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.
* Change: In PyHurricane.h, in HCATCH macro, show the backtrace when
catching a C++ exception. No need to use the "hex" stream manipulator
if we cast into (void*).
* New: In Hurricane::UpdateSession, added "reset()" static function to
close all the currently opened sessions.
* New: In Hurricane::ExceptionWidget::catchAllwrapper(), close all
pending UpdateSession if the user choose to resume.
* Change: In Hurricane::Go, instead of immediatly materializing a newly
created Go (inserting it in a QuadTree) delay it until the closing
of the UpdateSession. We call "invalidate()" in "_postCreate()"
instead of "materialize()". This way, the abutment box of Gos is
taken into account only when the session is closed. There was a
problem when the abutment box was changing after the object creation
misleading the algorithm of the QuadTree. This was occuring only
when an object was created, not modificated, because in the later case
the Session mechanism was used. Now, the Session mechanism is used
in all cases.
As a side effect, it will speed up the parser by making all QuadTree
insertions in one step.
* Change: In Hurricane::JsonCell, forgot to call Cell::materialize() when
the Cell is completed (as was done in ordinary parsers). The call is
made in the destructor of the JsonCell.
* Change: In Hurricane::Cell, add QuadTree in the inspector support.
* Bug: In Hurricane, in StaticObservable::getObserver(), if the slot
pointer is NULL, do not try to access the owner. Returns NULL, so
the caller can be aware of the situation...
* Change: In Hurricane, in BreakpointWidget & ExceptionWidget some
cosmetic changes (fonts and window sizes).
* Bug: In Anabatic, In AutoHorizontal::getConstraints(), take into account
the constraints from the source AutoContact, as it holds the constraints
transmitted by the RoutingPads and sets up by propageConstraintsFromRp().
It is likely to be a bug affecting the original Katabatic as well.
* Change: In Anabatic, in RawGCellsUnder(), check that the segment is not
completly oustside the cell abutment box and truncate the coordinates
to the part that is inside. Use the "shrink" if we reach the east/north
border.
* Change: In Anabatic, in Configuration, no more decorator because we will
use a true derived relationship. Katana *derives* from *Anabatic* and do
not *decorate* it, so the Configuration can do the same. It also implies
that we directly create a Katana engine, not an Anabatic one.
* Change: In Anabatic, in Session, do not allow the opening of the Session
in a standalone fashion (with a static method). Instead it must be opened
using the relevant method of the Anabatic/Katana engine. This ensure we
are opening the right Session type.
* Change: In Anabatic, in AutoSegment_Aligneds() collection the seed segment
is not part of the collection by default, but will be included if the
Flags::WithSelf is set.
* Change: In Configuration, all the flags value are now defined in two steps.
Declared in the header and initialized in the module. This is to prevent
the fact that on some cases, in relation with the Python "extern C" part
modules, we need a true allocated variable. It was causing weird linking
problems.
A side effect is that they can no longer be used as entry is switches,
have to replace them by if/else.
* New: In Anabatic, new GCell::getNeighborAt() utility function.
* Bug: In Anabatic, in GCell::doGrid(), tag all the GCells of the grid with
the grid type... Back annote all the edges capacity (north & east) with
the reserved local capacity.
* New: Complete portage of Kite over Anabatic. The new engine is christened
"Katana" for Kite-Analogic. When it's capabilities and performances
will be on a part with Kite, it is to completly replace it (and take
back the "Kite" name). Preliminary tests seems to show that, contrary
to intuition (because built on a more complex/slower grid), it is even
slightly faster than Kite 8-).