* New: Hurricane::Triange as been renamed into Hurricane::Polygon.
Add support for convex polygons. Polygon are approximateds by
excess by a manhattan rectilinear polygon (with potentially
thousands of vertexes). To reduce the memory footprint,
compaction techniques reducing by at least a factor 4 has been
implemented. We could go further by only storing the non-repetitive
part of the edge (defined by the integral fraction dY/dY).
We will see, if the program slows too much.
The manhattan approximate is always computed but displayed
only if the polygon grid step is greated than 4 pixels.
The level of approximation of the polygons can be controlled
through the "DbU::_polygonStep" parameter.
* Change: In CRL/coriolisInit.py and CRL/helpers/Technology.py, regroup
all DbU related parameters into "technoConfig" (i.e. suppress
"viewerConfig"). Update all the relevant technology.conf configuration
files.
Change the loader behavior so that "technoConfig" is read first
and is now responsible for creating the Technology of the DataBase.
* New: In Hurricane::CellWidget, added support for displaying mahanttanized
polygons.
* Change: In documenation/scripts/expample/polygons.py, perform (I hope)
a comprehensive test of the polygons (check all slopes, clockwise and
conter-clockwise).
* New: In Hurricane::DbU, added template to manage vector<> of DbU.
Support for the "polygonStep" parameter.
* Bug: In Hurricane::Cell_SubCells collection, order the set<> of Cell
with Entity::CompareById instead of pointer values.
* Bug: In Hurricane::Component_ConnexComponents::Locator, sort the
set<> of Components with Entity::CompareById instead of pointers.
* Bug: In Hurricane::Occurrence::operator<(), uses Ids to compare
both _entity and _sharedPath. Check for NULL pointers.
* Change: In Hurricane::IntrusiveMap, add a debug output in _resize()
like for IntrusiveSet.
Note to myself : despite their names, InstrusiveMap are hash
tables and not map<> in the STL sense.
* Bug: In CRL Core, Vst parser, sort the CellVectorMap on Ids.
* Bug: In CRL::NamingScheme::toVhdl(), sort the set<Cell*> models on Ids.
* Bug: In CRL::toVhdlName(), sort the set<Cell*> models on Ids.
* Bug: In CRL::getInstancesCount(), sort the map<Cell*,size_t>
gatesByMaster on Ids.
* Bug: In Hurricane::Cell::uniquify(), a set<Cell*> sorted on pointers
was remaining. Now sorted on Entity::Id.
* Bug: In CRL::VhdlEntity, in the driver, the components where driven
in pointer order (set<> again). Now use ids.
* Bug: In CRL/etc/scn6m_deep_09/technology.conf, the symbolic extentions
for VIAs and layers were wrong. Have to be multiplied by two.
* Change: In AnabaticEngine, AutoContact and AutoSegment LUTs are now
sorted on Entity::Id. Should not have had any impact, but better
safe than sorry.
* Change: In KatanaEngine, Symmetric contraint map<> is now sorted on
Entity::id. Idem for TrackSegmentLut.
* New: In Hurricane::Entity, add an id counter limit and a memory size
limit. The two limits are checked only when a new Entity object is
created. This should help avoiding massive memory links.
* New: In CRL Core, add a "crlcore.groundName" and a "crlcore.powerName"
parameter to specify the name of the ground/power signals to be
created if they are missing in a Cell. For Alliance libraries it
would be "vss" & "vdd" (default values), but for real technologies,
it is often "gnd!" & "vdd!".
The Blif parser is modificated to make use of it.
* Bug: In AnabaticEngine::unify(), set the resulting unified segment in
the center of the GCells common side. Gcells under a segment are
found by using the edge that cover the segment axis. When we have
a "bend" GCell stack and the axis is wrong, they could be ommited.
This was causing deleted segments to be not removed from some
Edges, then core dump.
* Change: In Anabatic::AutoSegment::create(), smarter choosing of the
reference contact, select the fixed or terminal one instead of
always the source one.
* New: In Anabatic::Edge::isEnding(), new function to check if a
segment going through an Edge is starting/ending in either source
or target GCell of the edge (active only when running in channel
mode).
* New: In Anabatic::Edge::add(), a segment takes part in the occupancy
only if it is not ending in either source or target (channel mode
only). The occupancy due to terminal is pre-computed in Katana.
* New: In Anabatic::Edge::ripup(), in channel mode, never ripup a
segment which is ending in either source or target (we *have* to
access this edge to connect to the terminal).
* Bug: In Anabatic::GCell::hcut() and vcut(), force the update of
the Edge which is on the side that will get splitted by the cut.
It's capacity will be reduced to it must be updated.
* Change: In Anabatic::GCell::updateGContacts() add a flag to conditionnally
update horizontals or verticals only. We may require only a partial
update when resizing the GCell in only one direction.
This, again, related to the fact that we compute the GCells under
a segment thanks to it's axis position, so we need to be very careful
when modificating axis.
* Change: In Katana::Block::resizeChannels(), only update GContact vertical
position. Do not disturb X positions of segments.
* Bug: In Katana::GlobalRoute::DigitalDistance, in channel mode, some
Edges can have a zero capacity, but still be reachable if the net has
a terminal in either source or target. Look for this case and return
a distance of zero instead of "unreachable". This was causing the
global routing not to complete in channel mode.
For computing the edge distance, makes the vertical edges much more
long (10 times) than the horizontal ones as the vertical capacity is
very limited. Hard coded for now, should make it a parameter in the
future.
* Change: In KatanaEngine::annotateGlobalGraph(), decrease the capacity
of edges with reserveCapacity for each terminal inside a GCell.
Both north and south edges are decreased as we a terminal will
block both north and south edges.
As a counterpart, the Edge capacity is not decreased when the
global router connect to a terminal.
* Change: In Katana::RoutingEvent::revalidate(), when in repair stage,
do not expand the slack for horizontal segments in channel mode.
So they may not overlap the standard cell row.
* Bug: In Stratus documentation, do not use the french option in babel,
the documentation is in english!
* New: In Documentation, added Hurricane/Python tutorial, part for drawing
layout.
* New: In Commons, inspector support for std::pair<T,U>.
* New: In Hurricane::Layer, ContactLayer & ViaLayer, support for non
square VIAs. The hole (cut) remains square, but the various metal
extensions can now be different in X and Y. The ::getEnclosure()
method now takes a flag EnclosureH / EnclosureV.
* New: In Hurricane::DbU, inspector support for:
std::pair<DbU::Unit,DbU::Unit>
std::array<DbU::Unit,3>
Must be defined here as DbU do not exists yet in Commons.h
* Bug: In Hurricane::Interval::getSize(), when the interval is "full span",
do not return the difference between min and max, but directly DbU::Max.
(the previous result was -1 !)
* New: In CRL Core Python/Technology.py, support for non square VIAs in
the configuration files. Applied to FreePDK 45.
* New: In CRL::RoutingGauge, added a "symbolic" flag to tell if a gauge
is for symbolic layout or not. Exported to Python.
* New: In Anabatic::AutoHorizontal::updatePosition(), differentiated
computation for soure or target taking account of the VIA extension
in the right segment metal (due to non-square VIAs).
* Change: In Anabatic::AutoHorizontal::_makeDogleg(), the dogleg is
UP for HV gauges and DOWN for VH.
* New: In Anabatic::AutoSegment::_initialize(), create a cache of the
various extension length for each layer (viaToTop, viaToBottom,
viaToSame).
New implementation of getExtensionCap() using the previous cached
extension table. See updatePositions().
New static functions to access the extension cache in the header:
getViaTotopCap() ...
* Change: In Anabatic::AutoSegment, in various update methods, updateOrient()
must always be called *before* updatePositions() as extensions are
dependant on source/target.
* New: In Anabatic::AutoSegment::getEndAxes() compute the position of the
first source and last target position (center/axes) on an *aligned*
set of segments.
* New: In Anabatic::AutoSegment, add a new state flag SegAxisFixed to
signal segments that can be put on only one track. Specific case
to VH gauge for a M1 vertical terminal with a M2 vertical segment.
The M2 is effectively bound to the M1 axis position.
* Bug: In Anabatic::NetBuilderVH::_do_xG_xM1_xM3(), in case of E/W global
and only one RoutingPad the connexion to the RoutingPad was duplicated.
It was valid, but totally stupid.
* Bug: In Anabatic::Session::_canonize(), for an aligned segment set,
intersect the user constraints from all segments instead of only
considering the canonical one.
Issue a warning about too tight constraints only for symbolic
gauges. It may be correct for the real ones.
* New: In Katata::DataNegociate::update(), more accurate computation
of the perpandicular free interval. Use segment extension cap
calculation. Create a special case for fixed axis segments allowing
them to find alternative free interval, try under source and under
target as they are likely to be draggable segments.
* Change: In Katana::Manipulator::relax(), use the extension cap value
to compute the axis of the perpandicular segemnts.
* Change: In Katana::Manipulator::moveUp(), now move up the whole set
of aligned segments instead of just the canonical one.
* Change: In Katana::NegociateWindow::loadRoutingPads(), more accurate
TrackMarkers insertions for fixed terminals.
* New: In Katana::RoutingEvent::Key::Compare::operator(), segments with
fixed axis are processed prior to any others.
* New: In Katana::RoutingEventLoop, store segment pointers instead of
ids to generate more accurate error messages.
* Change: In Katana::RoutingPlane::create(), perform local track
assignment only for HV gauges.
* Change: In Katana::SegmentFsm::_slackenLocal(), add a "dragMinimize"
step in the automaton. Mutliple states transitions can occurs in
a row if an action fails.
* New: In Katana::Session::_toIntervalAxis(), normalize interval
bounds so they are on track positions (by shrinking the interval).
* Bug: In Katana::TrackMarker CTOR, the weigh computation was wrong.
* Change: In Anabatic::GCell::doGrid(), remove the "3 slice height"
limit (for small digital analog blocs).
* Bug: In Anabatic::NetBuilder::setStartHook(), perform a check for
a RoutingPad still on a Plug. Diplay an error instead of crashing.
* Bug: In CRL::RoutingLayerGauge::getTrackIndex(), the upper bound
of the track interval must be included instead of excluded.
* New: In Hurricane::Cell, add a StayOnPlugs flags for flattenNets().
To keep the RoutingPad occurrences on Plug instead of selecting
physical components.
* New: In Isobar::PyNet, add setAutomatic() and isAutomatic() to the
interface.
* Bug: In Katana::protectRoutingPads(), do not create protections on
PinOnly layers (mostly metal1).
* Change: In Hurricane::Backtrace constructor, add a boolean parameter
to enable/disable the actual backtrace generation.
* Change: In Hurricane::Error constructor, disable by default the
backtrace generation. The backtrace is useful when the Error is
thrown, and the program therefore stopped. But in many case we
just issue the error message on the console and try to continue.
But if the backtrace is enabled, it terribly slow down the
program.
Have to think about an clean way to re-enable the trace only
when the exception is thrown.
* 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, 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.