* 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 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: 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 AnabaticEngine::invalidateRoutingPads() this method is a temporary
workaround for a Hurricane problems. When an instance is moved, the
RoutingPads that use it must be moved accordingly, but they are not
invalidated so they stay in the wrong QuadTree.
New method ::_resizeMatrix() to be called when the associated Cell
is resized.
* Bug: In AutoHorizontal::getConstraints() and AutoVertical::getConstraints(),
the *target* constraints where never merged.
* Change: In AutoHorizontal::getCells() and AutoVertical::getGCells(),
now return a boolean to tell if it was ok (must not encounter a NULL
GCell while progessing from source to target).
* New: In Anabatic::Configuration and Anabatic:Session, create new methods:
- getDHorizontalLayer()
- getDhorizontalDepth()
- getDHorizontalWidth()
- getDHorizontalPitch()
And so on for Vertical and Contact.
They supply depth-independant informations about the H/V layers to
build the initial detailed routing.
The AutoSegment::create() methods have been modificated accordingly.
* New: In Anabatic::GCell, add two new types "StdCellRow" and "ChannelRow"
for implementing 2-Metal blocks.
Rename the GCell::setXY() method in GCell::setSouthWestCorner(),
move the contents of GCell::updateContactsPosition() into it and
suppress it.
WARNING: In case of a GCell shrink this may cause problems. But for
now we only expand...
New method GCell::getNetCount() to count the number of Net going
though the GCell.
* Change: In Anabatic::Edge, add specific support for capacity of 2-Metal
routing channels.
* Change: In Anabatic::Dijsktra various methods, replace the "gcell->isMatrix()"
calls by "not gcell->isAnalog()". Add more check so that the methods
pertaining to the analog routing (GRData) are not called in digital
mode.
* New: In Anabatic::Dijkstra::materialize(), add support for 2-Metal specific
cases. That is, always break in case of vertical pass-through or
U-turn. The global routing must always be broken in H-Channel.
* New: In Anabatic::GCell & Anabatic::Edge, make use of the Session mechanism
to ensure the revalidation. The "::revalidate()" method is then moved
as "::materialize()" (overload of Go) and "::_invalidate()" becomes
"::invalidate()"
* Change: In LoadGlobalRouting, cosmetic rename of SortHkByX in SortHookByX.
* New: In GCellTopology, added support for building 2-Metal topologies.
* ForkStack is now an object attribute as many methods do need it.
* To push segments/hook on the stack, a new method "push()" is
available. Perform NULL and fromHook checking. Can also setup
_southWestContact or _northEastContact if it is the "from" edge.
* N/S/E/W edges are now vector as in digital channel mode there
can be more than one.
* Added build topological build methods:
- doRp_2m_Access() RoutingPad stem access.
- _do_2m_1G_1M1() North or south access.
- _do_2m_2G_1M1() North AND south access.
- _do_2m_xG() H-Channel routing.
* New: In Anabatic::Matrix, new ::resize() function, as Cell can be resizeds.
* New: In Anabatic::Vertex, new static method ::getValueString() for a
friendly text rendering.
* New: In Katana::DigitalDistance, support for channel routing.
* Change: In KatanaEngine::digitalSetup() and KatanaEngine::runGlobalrouter(),
for channel routing, calls to setupPowerRails() and
protectRoutingPads() must be called after the core block has
been fully dimensionned.
::runGlobalrouter() contains the code tasked with the grid creation
and channel sizing.
* New: In KatanaEngine: Added support for core block, for 2-Metal routing.
May be expanded for over-the-cell routing in the future.
Added methods :
- isDigitalMode()
- isAnalogMode()
- isMixedMode()
- isChannelMode()
- getBlock() / addBlock()
- setupChannelMode()
- createChannel()
* New: In Katana, new class Block to manage core blocks and perform
channel routing.
* New: In Katana::Session, new convenience method "isOpen()".
* 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: 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 Anabatic::Dijsktra, correct the indentation in cdebug calls
(lots of them causing a big shift right).
* New: In Anabatic::TrackSegment, new helper structure SideStack to
manage a set of aligned GCells and their various sides sizes.
* Change: In Anabatic::TrackSegment::computeOptimal(), more accurate
computation of attractors from global segments and variable size
GCells using SideStack.
* Change: In Katana::DataSymmetric::checkPairing(), increase the tolerance
for misaligned symmetrics from 2 to 5 tracks (should be enough for our
narrow channel routing).
* New: In Katana::TrackSegment, add a first flag to enable locking of
priority. If it is set, calls to either "computePriority()" or
"forcePriority()" will have no effect. Added the uint32_t flags
paraphernalia.
* New: In ::computeNetPriority(), overall function to control the call
of TrackSegment::computeAlignedPriority(). The call is done from
NegociateWindow::run().
* New: Katana::TrackSegment::computeAlignedPriority(), order the
TrackSegments aligneds through doglegs to the one with the highest
priority is routed first and others progressively from him. Done by
forcing an ever decreasing priority on the aligneds ones.
The amount of decrease is small so the aligned segments got routed
(ordered) in close, if not contiguous, sequence. Priority is locked
for the order to remain.
* Bug: In Katana::TrackSegment::computePriority(), correct computation
of the priority when there is more than 10 free tracks
(a DbU::toLambda() call was missing, leading to very big priorities).
* Change: In katana::TrackCost CTOR, do not compute a distance to fixed
in the case of analog segments, this is backfiring.
Slight change of the compare function when delta differs. Seems
to improve a little.
* In Katana::AutoSegments_Aligneds, allow the the caller to select
if we are propagating through source or target only (or both).
Note that if no flag is given, it is assumed that we want to
propagate the old way on both source and target.
* In Katana::TrackElement, Katana::TrackSegment and Katana::RoutingEvent,
move the event priority from RoutingEvent to TrackSegment.
Add accessor and mutators associated in TrackElement (virtual
methods).
* 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 Anabatic::AutoSegments collections, change the type of all
the flags that where in "unsigned int" (32 bits) to Flags (uint64_t)
as there is now more than 32 flags for functions.
* New: In Ababatic::Constants, added new flag Flags::WithPerpands, which
makes the number of flags tip over 32 bits, thus making mandatory
to uses Flags and not unsigned int.
* New: In Anabatic::AutoSegments_Perpandiculars, manage a new flag
Flags::WithDoglegs to allow to propagate through global segments that
are connecteds via doglegs on local segments. Meaning that there is
a good chance that they could be aligned.
Slighly change the way we propagate on aligned segments: no longer
check for VTee or HTee, but only for same direction and layer as
master.
* New: In Anabatic & Katana, replace all the "int", "long" and their
variants by the less implementation ambiguous "int32_t", "int64_t"
(and variant). This should help to better detect bit trucation in
flags.
Use the type to give a hint about the flags kind:
- Type "Flags", for flags shared among Anabatic & Katana
functions/methods (may also appear in some objects states).
- Type "uint32_t" for flags belonging to an object internal
state of from Hurricane functions flags (those should be
grouped in a Flag subclass in a perfect world).
* 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).
- Data management concerning Analog GCells optimized
- Improvements of analog paths estimation:
- Save intervals to memorize paths
- Handle equal distance paths
* 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.
- [Modified] Minor bug fixed
in Dijkstra:
- [Add]: Global routing for analog circuits is enhanced by intervals definition to estimate more precise wirelengh and wire positions. The distance calculation for analog cases has been moved to the horus tool in AnalogGlobalRoute.h.
* Change: In Anabatic::Dijkstra the _distanceCb attribute got copied
from the setDistance() argument. To be able to access the duplicated
distance (and therefore access/modify it) the function now return a
pointer to it. Done with the "target()" accessor of std::function<>.
* Change: In Katana::GlobalRouting::runGlobalRouter() use the new
Disjkstra::setDistance() to be able to call setNet() on the right
object.
* 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.