When a long *horizontal* wire connect to a cluster, an antenna effect
may be created *before* the METAL3 is deposited, if the cluster's diode
is not *directly* connected to the gate through *only* METAL2. So, we
add a "forced halo" where the long horizontal connecting wires will be
broken by a diode *near* the gate. This problem do not occur for long
connecting METAL3, as the diode will be connected by then. Note that
we are hard-coding the gauge routing direction in the algorithm.
With that modification, only one antenna effect remains in LibreSOC
LS180. May be corrected by post-treatement.
* New: In Anabatic::DiodeCluster::mergeForcedhalo() add specific secondary
areas where diode must be insterted in addition to the one of the
RroutingPad cluster. To "isolate" the cluster from long horizontal
wires.
Protecting clusters of sinks is not enough. There can be very long
wires that far exceed the protection capacity of one diode. Instead
of putting a bunch of diodes near the sinks, we choose to put them
regularly along the interconncting wires.
With this approach we are down to 7 antenna violations on LibreSOC
LS180 test chip.
This will get less good results on arlet6502 & ao6800 because of the
core being a long way from the I/O pads. Should create jumpers on thoses,
but it is for later.
First part of the antenna effect protection : diode insertions.
Anabatic::antennaProtect(Net*) and it's supporting infrastructure
has been rewritten & simplificated. Must be used in conjuction
with the "Flexlib" bloat model of Etesian. A cursory description
of the algorithm has been added in the source file.
* New: GCell::hasNet() to tell if net is going through a GCell,
either as a straigth wire or has a local GContact (turn,
branch, terminal).
* New: Etesian::BloatFlexib class (tagged "Flexlib") suited for
flexlib uses. It is derived from "nsxlib".
To have enough space to insert all the wanted diodes, we
enlarge "mx2_x2" & "mx3_x2" of resp. 1 and 2 pitches.
This is an empiric finding, Yosys seems very fond of thoses
gates and we often see them underneath area where no space
was available to put a diode... May need some more fine grained
analysis.
* Change: In AutoSegment::canMoveUp(), hard code for FlexLib a track
reserve of one when trying to move up.
In FlexLib, the router promotes too easily METAL2 towards METAL4,
clogging the higher level. So we end up with the METAL2 level
under-saturated and the METAL4 over saturated, leading to routing
failures.
Now we assume that there is "one track less available" in METAL4.
As for now, solves the problem for LibreSOC.
* Bug: In NetBuilderHV::_do_xG_1PinM2(), for METAL2 pins on the EAST
side, we were computing the track from the XMax position of the
GCell. Now, with complete discoupling of the routing pitches and
GCell size, this is most of the time false.
Replace with a true computation of the last track of routing
area.
* Bug: In NetBuilderHV::_do_xG_1PinM2(), when the M2 pin is on the *east*
side and there are three globals, we must swap htee1 & htee2.
Otherwise, we the SW/NE contacts do not have the right numbers
of free segments attach.
* New: In AnabaticEngine::cleanupGlobal(), check that no global component
is left behind, sure sign that the global to detailed building went
wrong.
* New: In AnabaticEngine::_gutAnabatic(), perform progessive compaction
of segment of null length.
CAUTION: Reduced segments *may* not be null length segments.
They are "less or equal" than one perpandicular pitch and
can have their layer put into the perpandicular one.
They non-null one *must* be excluded for the compaction.
Null segments are compacted starting from the one connecteds to
non-null length segments. This is to avoid the compaction starting
in the middle of a whole set of zero-segments that will block further
compaction.
This behavior was causing "zero-length" segment on orphaned layers
that were causing minumal area DRC errors.
* Change: AutoSegment::canReduce() is modified so it now takes a flag
argument to tell it to look for collapisble zero-length segments.
* New: AutoSegment::getNonReduceds(): returns the number of non-zero
length segments connecteds to the current one.
* Change: In AutoSegment::reduceDoglegLayer(), use the perpandicular
width of the routing layer instead of the regular (parallel) one.
This was causing DRC errors.
* Change: In AutoSegment::canReduce(), no longer allow short METAL2
connected only to VIA12 to be reduced in METAL1, as we do not
control the METAL1 level of layers. This problem started to
show when connecting to diodes (antenna).
Should get rid of METAL1 DRC violations.
* Change: In AutoSegment::isMiddleStack(), reject configurations where
we have a Tee in the same direction as the segment. That is, (HTee + H)
or (VTee + V). It is unlikely that the two segments of the tee will
be of null size.
* Change: In AutoSegment::isMiddlestack(), we where previously only
detecting (turn+turn) or (turn+terminal) topologies. This was
too restrictive. Added (terminal+XTee) when the tee is perpandicular
to the segment, for example horizontal + VTee.
Fix minimal area DRC error in METAL2 for TSMC.
We use the segments extensions (dxTarget & dyTarget) to enlarge if
needed the segments. This new implementation is completely at
Anabatic level and should not be seen (i.e. managed) at Katana level.
* Change: In AutoHorizontal & AutoVertical, change the semantic of
getSourceU() and getTargetU(). formerly they where the end
position of the segment (with extension included), now they
gives the position of the anchor contacts, that is the axis
of the perpandiculars.
* New: AutoSegment::getLength() is still a proxy toward the
Segment::getLength() which returns the length of segment with
dxSource & dxTarget. We introduce a getAnchoredlength()
which returns the length between the centers of the S/T
anchors. That is axis to axis.
This is this length which is now used througout Anabatic.
* New: In AutoSegment::_extentionCaps, add a fourth item to hold
the segment minimal length (to respect minimal area given
the wire width).
* New: In AutoSegment::getExtensionCap(), if the segment has
a non-zero S/T extension, returns it instead of the S/T
contact extension *if it is greated*. The check of the
extension can be disabled by the Flag::NoSegExt flag.
* Change: In AutoSegment::isMiddleStack(), security check on
the presence of source and targets. More accurate detection
of perpandicular in "same layer" with a non-zero length,
So the area is OK, even with a short segment.
* New: AutoSegment::expandToMinLength(), check if a segment is
under the minimal length and expand it if need be by playing
with the dxTarget & dxSource. Tag minimal segments with the
AutoSegment::SegAtMinArea flag. Also try to keep the segment
*inside* it's former (supposedly wider) interval.
* New: AutoSegment::unexpandToMinLength(), to be called on a
formerly minimal sized segment which as grown up. Reset
it's S/T extensions to zero and unset the flag SegAtMinArea.
* Change: In AutoHorizontal::updateOrient(), when the extension
are non-zero, also swap them if needed, to keep the exact
footprint of the segment.
* New: In AutoSegment::revalidate(), check that the segment
respect the minimal length (area), and expand it if needed.
Conversely, if the segment has grown up from a minimal
length state, reset it's extensions to zero.
* Change: In Anabatic::Session::revalidate(), invalidateds
segments are now sorted in such a way that the "middle stack"
ones are revalidateds last. Not recall 100% why...
* New: In Katana::TrackCost, add a computation of the free interval
length we are into (if any). Not used yet, keep it for future
use.
* Change: In KatanaEngine::finalizeLayout(), remove the call to
segments minimum area protection. It is now obsoleted by the
new implementation in Anabatic.
* Change: In Track::check(), call the minimum size/area checker
Track::checkMinArea().
* New: In AutoSegment::getExtensionCap(), when a routing layer has a
minimal area defined, compute the minimal wire length (given it's
width). Then, for segments identified as "MiddleStack" (local
with turns at each end towards opposite layers), if their length
is below minimal, return a longer extention cap.
This may be optimized because with this, the segment extension
is symmetric on both side while it could be made assymetric.
* Change: In NetBuilder::getPositions(), ordering of source/target points
is now integrated to this function instead of left to the caller.
In case of real (non-symbolic) routing gauge, skrink the ends of
half the wire width.
* Change: In NetBuilderHV::doRp_AutoContacts(), in case of non-METAL1
RoutingPad, put the axis of the segment on the nearest track.
Issue a warning if we have to shift, as it may be a potential
source of routing problems.
* New: Anabatic::Session::getNearestTrackaAxis(), proxy to compute
track positions, knowing the design abutment box.
* Bug: In Katana::PreProcess::propagateCagedConstraints(), when
looking at all the slave components anchoreds on a RoutingPad,
if they do not have an AutoSegment lookup, skip them instead
of crashing.
* New: In cumulus/plugins.block.Block.placeMacro(), new method to
place a macro cell, partly delegating to the Macro block wrapper.
Must be called *after* both core and corona abutment boxes have
been set.
Adjust the macro block position so the METAL2 & METAL3 pins
are exactly on pitch regarding the full routing grid. The reference
being the corona.
A shift, less than one pitch may be applied, leading in some
cases of overlapping abutment boxes. But this shouldn't be a
problem.
The macro to place is designated through a path of instances
names, rooted at the *core* (not the corona). Meaning that the
head instance must be one of the core.
* Change: In cumulus/plugins.chip.Chip, the complete chip I/O pads
plus corona and core placement is moved out from doPnR() and
put into doChipFloorplan(). It is now mandatory to call this
method *before* doPnR().
Those methods are now cleanly separated so we can perform macro
block placement or any inner core floorplaning operations between
them.
* Change: In cumulus/plugins.macro.Macro, instead of creating large
pads for the I/O pins so whatever the block position, they will
be under a grid point, create a simple dogleg to put them on
grid.
To ensure that they are "on grid", the block pins must be
in METAL2 (horizontal E/W) or METAL3 (vertical N/S) and the block
is assumed to be placed so the bottom left corner of it's
abutment box is exactly on one grid point for M2/M3.
This should be done by Block.placeMacro().
* New: In KatanaEngine::exportExternalnets(), for commercial tools to
correctly regenerate the external pins from GDSII files it seems
necessary that all segments needs to have TEXT label. So make them
external components.
* New: In Anabatic::NetBuilder::_do_1G_1M3(), RoutingPad in METAL3 from
blocks are most likely to be offgrid in real mode, we must account
for that case. When an offgrid METAL3 is found, a strap of METAL2
is added, as it may be less than one pitch, it will be reduced into
METAL3 often.
* New: In Anabatic::NetBuilder::doRp_Access(), Support for offgrid METAL2
is added but not enabled yet. Seems to need more polishing.
* Bug: In Anabatic::GCell::updateDensity(), the GoStraight flag is now
set in this function when the density of blockage is above 40%.
(should be parametrized in the future). This is linked with the
Katabatic TrackFixedsegment bug.
* Bug: In Anabatic::GCell::Key::Compare, the densities of the GCell
where sorted in the *wrong* order, that is *less denser first*.
This was making the layer assignment working on it's head.
WTF, how did it ever work.
Also sort on global saturation.
* Change: In EtesianEngine::globalPlace(), disable the call to
antennaProtect(). First reason is that, after all, Coloquinte
do not handle so well the resizing of the cells "on the fly",
it overspill the boundaries sometimes. Second reason is that
as we cannot know the routing tree at this stage, we will not
be able to choose the correct points for diode insertions.
We only have a Steiner tree wich may not be the same as a
density driven Dijkstra.
* Change: In Etesian::Area, the Occurrence to the Instances where
not stored in a uniform way. Some where starting from the
placed sub-block, some where starting from the top level
(corona), making their processing (and remembering it) tricky.
Now, they are all expressed from the top cell (corona).
The coordinate system is now systematically the one of the
top block (*not* the block).
Create various overloaded functions EtesianEngine::toCell()
and EtesianEngine::toBlock() to ease Occurrence & coordinate
translations.
* New: In Etesian::Slice::createDiodeUnder(), add a X position hint.
Search is done by going through the whole slice range and
minimizing the distance to the hint. If it starts to be too
slow, we may optimize.
* Bug: In EtesianEngine::toColoquinte(), the placement of the top
level external pins was not taken into account (this at last
explain their weird positioning).
* New: AnabaticEngine::antennaProtect(), new algorithm to avoid
antenna effect. This step must be done *after* global routing
and *before* detailed routing. This way we have access to the
real routing and can mend it (along with the netlist) to
insert diodes at the rigth points.
From the global routing we build clusters (DiodeCluster) of
RoutingPads connected through a set of wire whose total length
is below the antenna effect threshold. Long wires connecting the
clusters are also tagged because we need to put a diode between
them and the first RoutingPad of the cluster. This is to avoid
a long METAL2 wire connecting to the RoutingPad before the diode is
connected through METAL3 (in case of misalignment).
This protection is not even enough. For *very long* wires, we
needs to put *more* than one diode (this is to be implemented).
Integrate new features and bug fixes so the Arlet 6502 benchs successfully
passes real DRC with reference industrial tools. Short summary:
* Manage minimum area for VIAs in Katana::Tracks.
* Allow different wire width for wires perpandicular to the prefered
routing direction.
* StackedVIAs used in the clock tree no longer assume an uniform
routing grid (same offset & pitch all the way up).
* Some hard-coded patches in PowerRails for FlexLib.
* New: In CRL/symbolic/cmos/kite.py & cmos45/kite.py, update the
RoutingLayerGauges by adding the new PWireWidth parameter.
Always zero in case of symbolic layout (too fine tuning).
* New: In CRL::RoutingGauge, add accessor to PWireWidth parameter.
Modify the clone method.
* New: In CRL::RoutingLayerGauge, add new parameter "PWireWidth"
to give the width of a wire when it not drawn in the prefered
routing direction. If it is set to zero, the normal width is
used.
* New: In CRL::PyRoutingGauge, export the updated constructor
interface. It is *not* backward compatible, one must add the
PWireWidth parameter in the various kite.py configuration
files (in etc/).
* Change: In AnabaticEngine::_gutAnabatic(), disable the minimum
area detection mechanism, replaced by a more complete one in
Katana::Track. Left commented out for now, but will be removed
in the future.
* Change: In Anabatic::AutoContact::updateLayer(), now systematically
calls setLayerAndWidth() to potentially resize the VIAs. This is
needed in real mode as VIAs are *not* macro-generated but have
their real final size.
* Change: In Anabatic::AutoContact::setLayerAndWidth(), select the
width and height of the contact using the gauge wire width *and*
perpandicular *wire width*.
* Change: In Anabatic::AutoSegment::_initialize(), the "VIA to same cap"
to PWireWidth/2, this will be the size of the VIA in the
non-preferred direction at the end cap (non-square in real mode).
* Change: In Anabatic::AutoSegment::getExtensionCap(), makes different
cases for symbolic and real. Use raw length in real, add half the
wire width in symbolic.
Add a flag to get the extension cap *only*, not increased of
half the minimal spacing.
* Change: In Anabatic::AutoSegment::bloatStackedStrap(), enhanced,
but finally unused...
* New: In Anabatic::AutoSegment::create(), use the PWireWidth when
the segment is not in the preferred routing direction (and of
minimal width).
* New: In Anabatic::Configuration, add new getPWirewidth(),
DPHorizontalWidth() and DPVerticalWidth() accessors.
* Change: In AnabaticEngine::setupPreRouteds(), skip components in
in "cut" material. We are only interested in objects containing
some metal (happens in real mode when VIAs cuts are really there).
* New: In Katana::PowerRailsPlanes::Rail::doLayout(), add an hard-coded
patch that artificially enlarge the *wide wire* so the spacing for
wide wire is enforced. For now, two pitches on each side for
"FlexLib" gauge.
* New: In Katana::Track, add support to find and correct small wire
chunks so they respect the minimum area rules.
Two helper functions:
* ::hasSameLayerTurn(), to find if a a TrackElement as non-zero length
perpandicular is same layer connected to it.
* ::toFoundryGrid(), to ensure that all coordinates will be on the
foundry grid (may move in a more shared location).
* ::expandToMinArea(), try to expand, *in the routing direction*
the too small wire so it respect the minimal area. Check for the
free space in the track.
Track::minExpandArea() go through all the TrackElements in the track
to look for too small ones and correct them.
* Change: In Katana::RoutingPlane, add an accessor to get the tracks.
* New: In KatanaEngine::finalizeLayout(), add a post-treatment to find
for minimal area violations.
* Change: In cumulus/plugins.block.configuration.GaugeConf, add a
routingBb attribute that will serve as a common reference to all
the functions calculation track positions. We must not have two
different reference for the core and the corona. The reference
is always the corona when we working on a complete chip.
* New: In cumulus/plugins.block.configuration.GaugeConf.getTrack(),
Simplified and more reliable way of getting tracks positions.
Use the routingBb.
* New: In cumulus/plugins.block.configuration.GaugeConf.rpAccess(),
Make use of getTrack() to get every metal strap on the right
X/Y position.
* New: In cumulus/plugins.block.configuration.GaugeConf.expandMinArea(),
As those wires are left alone by the router, it is our responsability
to abide by the minimal area rule here. Hence the code duplication
from the router (bad).
Mainly wires made for the clock tree, I mean.
* Bug: In cumulus/plugins.chip.configuration.ChipConf.setupICore(),
the core instance must be placed on the GCell grid, defined by the
slice height (X *and* Y).
* Bug: In cumulus/plugins.chip.corona.Builder(), forgot to use bigvia
for the corners of the inner ring.
* Bug: In cumulus/plugins.chip.pads.corona._createCoreWire(), hard-coded
patch for LibreSOCIO, the power/ground connectors toward the core
are too wide and can create DRC errors when put side by side.
Shrink them by the minimal distance.
* Bug: In Anabatic::AutoSegment::reduce(), no longer reduce *again*
an already reduced segment.
This bug was seen through a side effect, it was causing the
"reduced perpandicular" counter to be incremented too much and
so it cannot get back to zero, blocking the layer reduction
(AutoSegment::reduceDoglegLayer()) and some bad VIAs where left
over.
More debug information in reduce & raise functions.
* Change: In Katana::Session::_revalidate(), process to be raised
segments *before* segments that can be reduceds.
* New: In Hurricane::Layer, add support for a minimal area (given in
microns). Exported in the Python interface.
* New: In Anabatic::AutoSegment::bloatStackedStrap(), method to
enlarge too small vertically stacked VIAs. For now just create
a square ensuring the minimal area. Potentially cause DRC error in
some cases so needs to be refined.
* New: In Anabatic::_gutAnabatic(), check for too little stacked VIAs
and display a report.
* New: In Hurricane::NetRoutingProperty, add and change the meaning
of the following flags:
- ManualGlobalRoute : now means that a global routing *trunk*
is present, made of "gmetalh", "gmetalv" & "gcontact".
- Manualdetailroute : added, get the former meaning of
ManualGlobalRoute, that is, the detailed routing is
already present for this net, but can be changed by the
detailed router. Implies that it respect the Terminal,
HTee & VTee structuration.
* New: Add Anabatic::Diskstra::loadFixedGlobal(), to account
a manually global net into the edges capacities.
* New: In Anabatic::Edges::ripup(), exclude manually global routed
segments from the ripup. Change the segment sorting function
so that thoses segments are put in head of list (considered
as "smaller").
* Change: In AnabaticEngine::setupPreRouteds(), now detect manual
global routed and manual detail routed signals, and tag them
accordingly.
* New: In AnabaticEngine::Configuration & Session, add proxies
for the global routing layers ("gmetalh", "gmetalv", "gcontact").
* New: In Anabatic::Constants, add flags for global fixed and
detail routed nets.
* Change: In KatanaEngine::updateEstimateDensity(), now use int64_t
for flute coordinates.
* New: Add CRL::RoutingGauge::hasLayer(), to know if a layer is
managed by the gauge (comparison by mask).
* In NetBuilder::_do_xG_1PinM3(), in the three global case, an
incorrect connexion was made.
* In NetBuilder::_do_2G_xM1_1PinM2(), in the global E+W case,
segment between vtee1 <-> turn1 must be vertical.
* Bug: In Anabatic::AutoHorizontal::_slacken(), when creating the target
dogleg, if the target was a fixed pin (M2) on the east side, the
vertical was put righ on the side, which is *not* an allowed track.
The exact east side is not covered by a vertical track (this comes
from a policy adpopted for the GCell, to avoid overlapping tracks
on the border). So we got an error message when katana tries to
bind it to a track. Now shift one perpandicular pitch to the *left*
for the EAST pins.
* Change: In Anabatic::NetBuilderHV::_do_1G_xM1_1PinM2(), the M2 pin
(horizonal) was directly aligned with the outgoing global through
a H-Tee. This was too rigid. Now it can be misaligned.
* Change: In AnabaticEngine::_desaturate(), now use a STL priority
queue built upon a vector with duplicates of the GCell keys.
Much much more faster than the previous set with a custom
sorting key over the GCell. Insertion & removal where getting
a lot of time. Now it's down to less than a minutes, even for
big designs.
* Change; In Anabatic::GCells, add the ability to clone the GCell
key, to use it independently in GCells sorting containers.
This way the cloned value do not change when the GCell is
updated. Keep track of the latest (most up to date) cloned
key.
* Bug: In Anabatic::NetBuilderHV::_do_2G_xM1_1PinM2(), in the case of a
bend of global wires, the topology was faulty. Too rigid topology,
the global wire was forcibly aligned on the external Pin.
* New: In Anabatic::AutoContactTerminal, new method "isOnPin()" to
know if the terminal contact is on a Pin. Introduced in base
class.
* Bug: In Anabatic::AutoHorizontal::_canSlacken() & AutoVertical,
forbid slackening from a Pin. As Pin are all on the side of the
cell (aligneds) and the perpandicular segment will be locked on
the Pin, it generates intractable overlaps for the router.
* Bug: In Anabatic::Configuration::selectRpComponent(), always select
the Pin as the best component. It is mandatory for a block that
we pick up the terminal at the periphery and not one deep inside
the block.
* Bug: In Hurricane::RoutingPad::setOnBestcomponent(), same rule as
in Anabatic, if there is any, the Pin must always be the best
RoutingPad component.
* Bug: In Hurricane/Commons.h, modify the getRecord<>() templates so
that for both vector<Element> and vector<Element*>, the individual
record created for each element are donne with pointers. That is,
for the vector<Element> case, we take a pointer.
As a general policy, except for the POD types, always use pointers
or references to data in the records/inspector. Never uses values
that can call the copy constructor.
Suppress INSPECTOR_PV_SUPPORT() macro, keep only
INSPECTOR_PR_SUPPORT().
Provide value support only for getString<>() template.
This value & copy constructor problem was causing a crash when
trying to inspect Hurricane::AnalogCellExtension.
* New: In Hurricane::Technology, change the API of the PhysicalRule,
now we can only create/get PhysicalRule, but setting the value of
the rule itself must be done on the rule.
Enhance PhysicalRule to provide for stepped rules, non isotropic
and ratio rules.
Merge TwoLayersPhysicalrule in PhysicalRule, much simpler to
suppress the management of derived classes. That means that we
loose a little memory as some fields are mutually exclusive.
Not a problem considering that there will not be so many of thoses
objects.
* New: In CRL/helpers.analogtechno.py, enhanced DTR support for rules
like:
('minSpacing' , 'metal1', ((0.4,20.0), (0.8,1000.0)), Length, 'REF.1')
('minEnclosure', 'metal1', 'cut1', (0.2,0.3) , Length, 'REF.2')
('minDensity' , 'metal1', 0.30 , Unit , 'REF.3')
The DTR parser has been updated, but not the oroshi.dtr Rule
cache for analog components. Given a rule name, the value used
will be the horizontal one of the first step.
* Change: In hurricane/doc/hurricane, re-generate the documentation
with updated support for Technology & PhysicalRule.
* New: In Anabatic::NetBuilder, some GCells configurations of Libre-SOC
"test_issuer" (soclayout/experiments9) did have more METAL1 terminals
than was though possible. Just added more entries in the connexity
table for bigger numbers of METAL1. No new configuration was added,
used the already existing ones.
* Bug: In Anabatic::AutoHorizontal & AutoVertical, in getGCells()
method, do not display the "NULL GCell under" error message if the
segment has just been created. It could on a "wrong" axis position
so the line probing method may fail.
* Bug: In AnabaticEngine CTOR, if the "blockagenet" is created there,
do not forget to set it's type to BLOCKAGE (to avoid later warnings).
* Bug: In Anabatic::NetBuilder::_load(), do not display a warning if the
blockage net has no RoutingPads (it *must* not have one).
* Bug: In Bora::SlicingNode::clearGlobalRouting(), as we are unrouting the
cell, the flags set up by Katana must be reset. The Cell is no longer
"Terminal" and it's nets are "Un-flattened".
* Bug: In Anabatic::Session::_revalidateTopology(), when iterating over
_segmentInvalidateds, the vector can be modified. If it leads to a
reallocation we end up on invalid iterators (using freed memory so
sometimes with overwritten contents). Now, iterate with an index
which warranty that we get a valid item at each iteration of the
loop. And, of course, the vector is ensured to not shrink...
* Change: In Anabatic::Session::Session(), reserve (pre-allocate) at least
1024 elements for all vectors. Mostly prevent the above bug and
avoid constant reallocation.
* Change: In CRL::LefParser::_macroCbk(), create a Catalog entry for the
newly read MACRO (that is Cell) and sets the Logical, Physical,
InMemory and TerminalNetlist flags.
* Bug: In CRL::LefParser::_siteCbk(), check for NULL cell gauge.
* New: In CRL::AllianceFramework, add setCellGauge(), to set the default
cell gauge. Exported to Python.
* Change: In CRL/etc/common/technology.py, create variables for VIA
layers, so we can modify their properties afterwards.
* New: In CRL/etc/node45/freepdk45, port the configuration files to the
new Python "importable" format.
Note: in kite.py, all the gauges (Routing & Cells) must be named
"LEF.CoreSite" to please my LEF parser, so it can match the gauge
name with the SITE name for standard cells.
* Bug: In Anabatic::NetBuilderVH::_do_2G(), forgotten to be reimplemented
from the base class. Simply redirect to _do_xG().
* Change: In Katana::PowerRailsPlanes::PowerRailsplanes(), create plane
from the layers in the RoutingGauge and their associated blockages
instead of sweeping through all the basic layers.
Allow to distinguish bewteen "METAL" (symbolic) and "metal" (real).
* Bug: In Katana::NegociateWindow::createTrackSegment(), *fixed* AutoSegment
in conflict with blockage where removeds. This was creating "holes"
in the Anabatic articulated segment structure. Now just *don't*
create the TrackSegment. Pass the regression tests, but not sure
it is not generating problems elsewhere.
* New: AnabaticEngine::checkPlacement() to issue more clear errors about
a defective placement.
* New: In Anabatic::NetBuilderHV(), added configurations to manage
one Pin M3 + one M1 terminal plus 2 & 3 globals:
* _do_2G_1M1_1PinM3()
* _do_3G_1M1_1PinM3()
They were occuring for the first time in soclayout/experiment7
in the "flat" approach.
* New: In Katana::runNegociate(), mark the newly routed netlist as
"NetlistTerminal" so it is not placed and routed *again* when
reused as an instance (mostly interract with Etesian).
* Bug: In Katana::AutoSegment::_preDestroy(), remove the segment from
the source & target AutoContact cache.
In LibreSOC/experiment7, weird placement caused fixed AutoSegment
overlaping blockage to be deleteds. It seems to have never occured
before (or at least, no ended up in core dump).
* Bug: In Hurricane::NetRoutingState::getSymValue(), outrageously bad
computation of the symmetric coordinate when the value was superior
to the axis... (shame on me).
* Change: In Anabatic::Disjkstra::load(), for symmetrically paired nets,
check that the axis of symmetry is *outside* the searchArea.
Otherwise, the two mirrored areas overlaps and the two nets will
unescapably be on top of each other. Issue a warning but still
continue.
* Change: In Anabatic::Vertex::isRestricted(), allow perpandicular
wire to go through struts or thin (less than one routing pitch)
node. May have to recheck in the future and restrict to struts
only.
* Bug: In Bora::HVSlicingNode::updateSymNetAxis(), rescursive call in
child node was not systematically done (bad curly brace position).
Also checks that symmetries are not empty before accessing the
front element (one less core dump).
* Change: In all tools, FindTOOL.cmake, no longer use LIB_SUFFIX to
search for tool libraries but try "lib64/" then "lib/".
* Change: In bootstrap/socInstaller.py, take Debian 10 into account.
* Change: In bootstrap/docker, move from Debian 9 to Debian 10.
* New: In Hurricane::Cell::isLeaf(), a leaf cell was defined as one
without instances. Now it can be software defined with the
"FlattenLeaf" state. If it is flagged "flatten leaf" is will be
considered as a leaf by the trans-hierarchical walkthrough.
This flag is also set for Cells in the Alliance CATAL.
* New: In Hurricane::Cell_LeafInstanceOccurrences::progress(), add a
test to prune leaf cells.
* Bug: In Hurricane::getComponentOccurrences(), when calling the
locator constructor, the "withLeafCells" argument was forgotten
and was getting the value of "doExtraction" (wich, fortunately,
was the same).
* Change: In Hurricane::HypreNet_LeafPlugOccurrences::progress(),
prune the leaf cells instead of the terminal ones.
* Change: In Hurricane::HypreNet_ComponentOccurrences::progress(),
prune the leaf cells instead of the terminal ones.
* New: In Hurricane::Cell, add a "useFlattenLeaf" mode to take into
account or ignore the "FlattenLeaf" flag when doing trans-
hierarchical walkthrough.
Not sure if it shouldn't be systematic.
* New: In Etesian::toColoquinte() and other, activate the "FlattenLeaf"
mode for all walkthough. So we can stop at already placed sub-blocks.
* Bug: In Etesian::toColoquinte(), when placed sub-block where present,
the number of instances was under estimated, so the instance array
was oversized and the end went unitialized. So we were getting all
kind of strange behavior from Coloquinte...
Now throw an exception if the number of instances differs from
the computed size.
* Bug: In Etesian::toColoquinte(), as for the instance array, now
correctly compute the size with the ecluded nets (supplies, clocks).
* Bug: In Etesian::resetPlacement(), event if the Cell is unplaced,
go through the instance list to remove the potential feed cells.
The netlist is written back after placement *with* the feed
cells added. So, when loading again, they where cluttering the
netlist and giving feed redefintions warning. They also generated
erratic behaviors.
* New: In Anabatic::NetBuilderHV, added configurations for:
* 1G_1M1_1PinM3
* 1G_xM1_1PinM2
* 2G_xM1_1PinM2
* doRp_AccessNorthPin
* New: In Anabatic::NetBuilderHV, added Pin management in SingleGCell.
* Bug: In Anabatic::NetBuilderHV::_do_xG_1PinM3(), the North/South
global routing configuration was forgotten (only East/West).
* Bug: In Katana::TrackFixedSegment, the blockage net was a static
variable initialized at the first run. So we were getting stuck
with the blockage net of the first cell to be routed. Of course,
it did show only when Katana was run multiple times in the same
process.
* Change: In Hurricane::Viewer::ExceptionWidget & CRL/python/helpers/io.py,
downscale icons for non-HiDPI screen.
* Change: In CRL/etc/common/display.py, change the display threshold of
METAL1 layer so it do not appear at high scaling.
* New: In Etesian, activate the "setFixedAbHeight()" feature and export it
to Python. Allows to increase the space margin at constant height.
To be used by the P&R conductor.
* Change: In Unicorn/cgt.py, when running a script, insert the current
working directory at head of the sys.path, not at the end. So installed
modules do not shadow local one.
* New: In Anabatic::Edge, new accessor "getRawcapacity()" to know the full
capacity of the edge, that is, the real maximum number of tracks that
can go through the associated side.
* Change: In Katana/BloatProfile/Slice::tagsOverloaded(), bloating policy
change, now bloat all the instances under the GCell, not only the first
one.
* Change: In KatanaEngine::runGlobalRouter(), restore the search halo growth
policy to expanding of 3 GCells every 3 iterations.
New metrics displayed, the edge wire length length overload.
* Change: In cumulus/plugins/ConductorPlugin.py, now accepts the following
configuration parameters:
- "anabatic.globalIterationsEstimate", maximum number of global
iterations during the bloating computation passes.
- "conductor.useFixedAbHeight", tells wether the additionnal blank
space must be added so the aspect ratio is kept or the height is
kept (and the block become wider).
Disable the display of "rubber" to unclutter a little the view.
This commit contains two set of features that should have been commited
separately.
1. Compliance with clang 5.0.1, tested with the RedHat collection
llvm-toolset-7. This allow Coriolis to be compiled under Darwin (MacOS)
with Xcode & macports. The bootstrap install system has been modificated
accordingly.
2. The basic support for routing density driven placement. Related
features are:
* Bloat property. Each Occurrence of an Instance can be individually
bloated. This property not attached to any tool to allow the placer and
router to share it as wanted. Nevertheless, it is defined in Etesian.
* BloatProfile in Katana, add individual Bloat properties to Instances
occurrences based on the East & North overflowed edges of each GCell.
* Support in ToolEngine for a "pass number" of a tool. This pass number
is mainly used to make "per pass" measurements. The MeasureSet system
is improved accordingly to support multiple values of a same measure.
* Embryo of "P&R Conductor" to perform the place & route loop until the
design is successfully placed. May be the first brick of a Silicon
Compiler.
* Change: In boostrap/FindBoostrap.cmake, in setup_boost(), added tag to
the python component for macport (ex: python27).
* Change: In boostrap/build.conf, put etesian before anabatic for
instance occurrence BloatProperty dependency.
Added option support for the "llvm-toolset-7" collection to build
against clang 5.0.1.
* Bug: In Hurricane::getRecord( const pair<T,U>& ), the getSlot<> templates
for first & second arguments must be called with <const T> and <const U>
as the pair itself is const (and not simply <T> & <U>).
* Change: In Hurricane::getSlot() temlate, only use "string" arguments and
not const string&, simpler for template argument deduction.
* Bug: In Hurricane::AnalogCellExtension, the StandardPrivateProperty<>
template has a static member "_name". Clang did show that the template
for this static number has to be put inside the namespace where the
template *is defined* (i.e. Hurricane) instead of the namespace where
it is instanciated (i.e. Analog).
* Bug: In Isobar, Matrix_FromListOfList(), PyInt_AsPlacementStatus() must
be put outside the C linkage back in the Isobar C++ namespace (clang).
* Bug: In Hurricane::DBo::~DBo, and derived add a throw() specification
(clang).
* Bug: In Hurricane::RegularLayer::getEnclosure() & setEnclosure(), change
signature so it matches the one of the base class (clang).
* Bug: In Hurricane::CellPrinter, use double brackets for initializer list
(clang).
* Change: In Hurricane::Breakpoint, reverse the meaning of the error level.
Only error level *lesser or equal* than the stop level will be enabled.
* Bug: In CRL/python/helpers/__init__.loadUserSettings(), must put the
current working directory in the sys.path as in certain configuration
it may not be included.
* Bug: In CRL::ApDriver, DumpSegments(), no longer generate segments when
encountering a RoutingPad on a top-level Pin Occurrence. The segment
was generated in the wrong direction, creating DRC violations on the
"mips_core_flat" example.
* Change: In CRL::Measures, partial re-design of the measurements management.
Now, each kind of measure can accept multiple values put in a vector.
The index is intented to match a tool run number.
* Change: In CRL::Histogram, add support for multiple sets of datas,
indexeds with tool run number.
* Change: In CRL::ToolEngine, add support for multiple pass number, add
addMeasure<> templates for the various data-types.
* Change: In CRL::gdsDriver & CRL::gdsParser(), comment out unused GDS record
name constants.
* New: Etesian::BloatProperty, property to attach to Instance occurrences
that contains the extra number of pitch to add to the cell width.
* Bug: In AutoSegment::CompareByDepthLength, the segment length comparison
was wrong, it was always returning true, which broke the "strick weak
ordering" of the comparison.
This was producing a core-dump in GCell::updateDensity() when sorting
a vector<>. The end() iterator was being dereferenced, leading to the
problem.
* Bug: In Katana::DataSymmetric::checkPairing(), the test for segments
whose axis is perpandicular to the symmetry axis was wrong
("!=" instead of "-").
* New: In Katana/GlobalRoute, new ::selectSegments(), selectOverloadedgcells()
and selectBloatedInstances() to automatically select segments from
overloaded edges, overloaded GCells and bloated cells.
* Change: In KatanaEngine, return a more detailed success state, distinguish
between global and detailed.
Add support for multiple routing iterations.
* New: In cumulus/python/plugins/ConductorPlugin.py, embryo of routing
driven placement.
* New: In bootstrap/coriolisEnv.py, add the "etc" directory to the
PYTHONPATH as initialization are now Python modules.
* New: In Hurricane/analogic, first groundwork for the integration of
PIP/MIM/MOM multi-capacitors. Add C++ and Python interface for the
allocation matrix and the list of capacities values.
* Change: In Hurricane::RegularLayer, add a layer parameter to the
constructor so the association between the RegularLayer and it's
BasicLayer can readily be done.
* Change: In Hurricane::Layer, add a new getCut() accessor to get the
cut layer in ViaLayer.
* Change: In Hurricane::DataBase::get(), the Python wrapper should no
longer consider an error if the data-base has not been created yet.
Just return None.
* Bug: In Isobar::PyLayer::getEnclosure() wrapper, if the overall
enclosure is requested, pass the right parameter to the C++ function.
* Change: In AllianceFramework, make public _bindLibraries() and export
it to the Python interface.
* Change: In AllianceFramework::create(), do not longer call bindLibraries().
This now must be done explicitely and afterwards.
* Change: In AllianceFramework::createLibrary() and
Environement::addSYSTEM_LIBRARY(), minor bug corrections that I don't
recall.
* Change: In SearchPath::prepend(), set the selected index to zero and
return it.
* Change: In CRL::System CTOR, add "etc" to the PYTHONPATH as the
configuration files are now organized as Python modules.
* New: In PyCRL, export the CRL::System singleton, it's creation is no
longer triggered by the one of AllianceFramework.
* New: In CRL/etc/, convert most of the configuration files into the
Python module format. For now, keep the old ".conf", but that are no
longer used.
For the real technologies, we cannot keep the directory name as
"180" or "45" as it not allowed by Python syntax, so we create "node180"
or "node45" instead.
Most of the helpers and coriolisInit.py are no longer used now.
To be removed in future commits after being sure that everything
works...
* Bug: In AutoSegment::makeDogleg(AutoContact*), the layer of the contacts
where badly computed when one end of the original segment was attached
to a non-preferred direction segment (mostly on terminal contacts).
Now use the new AutoContact::updateLayer() method.
* Bug: In Dijkstra::load(), limit symetric search area only if the net
is a symmetric one !
* Change: In Katana/python/katanaInit.py, comply with the new initialisation
scheme.
* Change: In Unicorn/cgt.py, comply to the new inititalization scheme.
* Change: In cumulus various Python scripts remove the call to
helpers.staticInitialization() as they are not needed now (we run in
only *one* interpreter, so we correctly share all init).
In plugins/__init__.py, read the new NDA directory variable.
* Bug: In cumulus/plugins/Chip.doCoronafloorplan(), self.railsNb was not
correctly managed when there was no clock.
* Change: In cumulus/plugins/Configuration.coronaContactArray(), compute
the viaPitch from the technology instead of the hard-coded 4.0 lambdas.
In Configuration.loadConfiguration(), read the "ioring.py" from
the new user's settings module.
* Bug: In stratus.dpgen_ADSB2F, gives coordinates translated into DbU to
the XY functions.
In st_model.Save(), use the VstUseConcat flag to get correct VST files.
In st_net.hur_net(), when a net is POWER/GROUND or CLOCK also make it
global.
* Change: In Oroshi/python/WIP_Transistor.py, encapsulate the generator
inside a try/except block to get prettier error (and stop at the first).
* Change: In Anabatic::AutoContactTerminal::updateGeometry(), when a
draggable AutoContact is moved, pitch it on the routing grid instead
of putting it in lowest/highest position.
* Change: In Anabatic::GCell::updateDensity(), all non-passthrough wires
now have a cost of 0.5 instead of 0.33 for locals.
* Change: In Manipulator::canMoveUp(), increase the "reserve" amount to
1.0 for "far from terminal" wires (rpDistance > 2).
* Change: In NegociateWindow::NegociateOverlapCost(), always sets "AtRipupLimit"
when the overlapping segment is nearing it's maximum ripup limit.
(different detection for non-preferred and regular)
* Change: In SegmentFsm::_slackenStrap(), call avoidBlockage() if it is
overlapping a blockage *or* a segment at it's ripup limit. I hope I
didn't create an infinite loop here.
* Bug: In cumulus/plugins/PadsCorona.py, CoreWire._computeCoreLayers(),
the big contact between symbolic and real was badly computed for
east/west (was using width instead of height, bummer!).
In Corona._createCoreWire(), completly screwed computation of the
side gap, was using a badly initialized value of the "bb" variable.
* Bug: In cumulus/plugins/Chip.py, the computation of the minimal size
for the corona was wrong, do *not* add the size of the pads and
multiply by two as it is done by "inflate". This was forcing the user
to create way to large chips for a given core size.
This commit degrades the run success rate of ARMv2a to 87% (40 iters).
* New: In CRLcore/etc/.../kite.conf, add configuration parameters:
katana.termSatReservedlocal
katana.termSatthreshold
for the new edge capacity computation system.
* New: In CRLcore/etc/symbolic/phenitec06/, add support for N. Shimizu
small I/O pads (supplied in phlib80). Tune various parameters of
Anabatic/Katana to increase routing success.
* Change: In CRLcore/alliance/ap/ApParser, make Pin external components,
so RoutingPad will be build upon in global routing.
Do not complain when a I/O pad has a physical instance that did
not exists in the netlist. Just create it (appeared in phlib80).
When no netlist instance exists in a pad, the pad Cell is still
considered as terminal.
* New: In Etesian::BloatCells, new profile named "3metals" better suited
for two routing metals technologies (i.e. Phenitec).
* New: In Anabatic::RawGCellsUnder, new CTOR which take only source &
target points instead of a segment. Needed to manage wide segment for
which the axis to consider is not that of the segment (one axis for
each track it intersect).
* New: In Anabatic::GCell, add a RoutingPad count attribute, for Edge
reservation computation.
* New: In AnabaticEngine::computeEdgeCapacities(), instead of decreasing
all edges of a fixed amount (hTrackReservedLocal), guess the GCell
cluttering from the number of RoutingPads that it contains.
For non-saturated GCells, the four edges are decreased by the number
of RoutingPads. We use the maximum from the two neigboring GCells.
The hTrackReservedLocal parameter is now used only as a *maximum*
that the edge reservation can reach.
If a GCell is saturated (more than 8 RoutingPads, the saturation is
propagated horizontally to 2 neigboring GCells).
* Change: In AutoContactTerminal::getNativeConstraintBox(), use a more
flexible gauge name matching for terminal vertical extensions correction.
Namely, match all "msxlib*" kind of gauges.
* Change: In AutoSegment::setAxis(), add the ability to force the axis
position, even if it is a non-canonical segment. Maybe needed in the
initialisation steo, before the first canonisation is performed.
* New: In NetBuilder, added new methods _do_1G_1PinM1() and _do_2G_1PinM1(),
to manage coronas for Phenitec designs.
To avoid various side effects from segments being too close from
the north / east side of the routing area, make those segments fixeds.
* Change: In KatanaEngine::annotateGlobalGraph(), the management of wide
wires was wrong. The axis to use to find the underlying GCells is the
one of the track, not of the segment. This was creating bad edge
capacity computation under the power ring of a block and subsequently
routing failures.
* New: In Kanata::Manipulator, added method reprocessParallels(), not used
though, but keep it anyway, might be of use later...
* New: In Kanata::Manipulator, added method avoidBlockage() for terminal
METAL2 in non-preferred direction, restrict the terminal and turn
constraint box at the current position of the perpandicular, so it
doesn't create a deadlock in METAL2.
* Change: In SegmentFsm::conflictSolveByPlaceds(), if we cannot break
using the whole overlap, try the first atomic overlap.
* New: In SegmentFsm::_slackenStrap(), manage conflict between a non-prefered
segment and a blockage, this when to call avoidBlockage()...
* New: In Katana::Configuration, management of the new edge computation
parameters:
katana.termSatReservedlocal
katana.termSatthreshold
* New: In Cumulus/plugins/Core2Chip, support for Phenitec I/O pads.
Now reliably work for 20 successive runs (doRun.sh) with pseudo-random
variations.
* Change: In AnabaticEngine::computeNetConstraints(), fully recompute
the "distance to RoutingPads" for all AutoSegments.
Previously we tried to do it incrementally, but as it's computed
as a minimum, it stayed stuck at the lowest value, event after a
net's change of topology that could made it increase (a new dogleg
did appear between the segment and the RoutingPad).
* Change: In Katana::SegmentFsm::_slackenStrap(), make unbreakable segments
pass through the LocalVsGlobal state so when other try to ripup them
they are prioritary. Otherwise some could go through Unimplemented
directly, without allowing other to attempt to make a detour.
* Change: In Katana::NegociateWindow::NegociateOverlapCost(), when a
global, which is about to be slackened wants to use a track where there
is a segment directly connected to a terminal with a significant
ripup count, mark it as "AtRipupLimit" so it tries to avoid it.
The idea is that globals with high ripup count must avoid terminal
segments because it is likely they will be riped up again so they
better find another track. This was leading to unsolvable configuration
when two segments always want the same track. In this cas, the global
would loose.
* Bug: In Katana::TrackSegment::canSlacken(), never slacken a segments in
non-preferred direction.
* Change: In Anabatic::AutoHorizontal::_slacken(), allow slackening of
segments which perpandiculars are in non-preferred direction, and
not only directly attached to terminals.
* Change: In Anabatic::AutoSegment::canMoveUp(), re-allow segments which
perpandiculars are in non-preferred direction to be moved up.
* Bug: In Katana::Manipulator::moveUp(), when moving up, do not forget
to ripup and reschedule said segment.
This non-deterministic behavior was showing only in the ARMv2a benchmark
around event 180k...
* Bug: In Anabatic::Session::_netInvalidateds & _netRevalidateds, the
set<> was still sorted on pointers. As contacts & segments can be
created to maintain connexity after a layer change, we got a
discrepency in objects Ids that may generate a change in ordering
later.
* Bug: In Katana::Session::_doRemovalEvents(), the set of Tracks that
got elements deleted was still using pointers. Now we use a TrackSet
sorted on (direction,depth,axis). This should not have created
a change in the results, as destructions do not change Ids, but it
genereate extra differences in traces.
* Bug: In Anabatic::AutoSegment::reduceDoglegLayer(), we did not check
that not only source and target depth span was zero, but also both
on the same one. This was seen in the RISC-V where a METAL2 small
segment was demoted into METAL1 causing a gap in the routing (and
a short in the underlying standart cell).
* Change: In Anabatic::AutoHorizontal::_canSlacken(), if the source or
target contact is in a GCell flagged "go straight", do not slacken,
which would create a dogleg. This case is usually meet under big
power rails that render a dogleg impossible to place as all tracks
are used.
Same modification for AutoVertical.
* Change: In Hurricane::SharedName, replace the incremental Id by a hash key.
This is to ensure better deterministic properties. Between use cases,
additional strings may have to be allocated, shitfing the ids. Even if
hash can be duplicated, we should be able to ensure that the absolute
order in map table should be preserved. Supplemental strings are inserted
in a way that keep the previous order.
* Change: In CRL/etc/symbolic/cmos/kite.conf, add "katabatic.routingGauge"
default parameter value ("sxlib").
* Change: In CRL/etc/common/technology.conf, define minimal spacing for
symbolic layers too (added for METAL4 only for now).
* Change: In CRL::Histogram, extend support to dynamically sized histograms.
Add a text pretty print with table and pseudo-curve.
* Change: In Cumulus/plugins/ClockTreePlugin, create blockage under the
block corona corners so the global router do not draw wire under them.
This was creating deadlock for the detailed router.
When the abutment has to be computed, directly use Etesian to do it
instead of duplicating the computation in the Python plugin.
* New: In Etesian, as Coloquinte seems reluctant to evenly spread the
standard cells, we trick it by making them bigger during the placement
stage. Furthermore, we do not not uniformely increase the size of the
cells but create a "bloating profile" based on cell size, cell name
or it's density of terminals. Currently only two profiles are defined,
"disabled" which does nothing and "nsxlib" targeted on 4 metal layer
technologies (aka AMS 350nm, c35b4).
* Bug: In Knik::MatrixVertex, load the default routing gauge using the
configuration parameter "katabatic.routingGauge" as the default one
may not be the first registered one.
* New: In AnabaticEngine::setupNetDatas(), build a dynamic historgram of
the nets terminal numbers.
* Bug: In Anabatic::AutoContact::Invalidate(), always invalidate the
contact cache when topology is invalidated. In case of multiple
invalidations, if the first did not invalidate the cache, later one
that may need it where not allowed to do so. The end result was correct
nonetheless, but it did generate annoying error messages.
* Bug: In Anabatic::AutoContactTurn::updateTopology(), bad computation
of the contact's depth when delta == 2.
* Bug: In Anabatic::Gcell::getCapacity(), was always returning the west
edge capacity, even for the westermost GCell, should be the east
edge in that case.
* New: In Anabatic::AutoSegment, introduce a new measure "distance to
terminal". This is the minimal number of segments separating the
current one from the nearest RoutingPad. This replace the previous
"strong terminal" and "weak terminal" flags.
This distance is used by Katana to sort the events, we route the
segments *from* the RoutingPads *outward*. The idea being that if we
cannot event connect to the RoutingPad, there is no points continuing
as thoses segments are the more constraineds. This gives an order close
to the simple ascending metals but with better results.
* New: In Anabatic::AutoSegment, introduce a new flag "Unbreakable", disable
dogleg making on those segments. mainly intended for local segments
directly connecteds to RoutingPads (distance == 0).
* New: In Anabatic::AutoSegment, more aggressive reducing of segments.
Now the only case where a segment cannot be reduced is when it is
one horizontal branch in a HTee or a vertical on a VTee. Check if,
when not accounted the source & target VIAs are still connex, if so,
allow reducing.
* New: In Anabatic::AutoContact, new state flags CntVDogleg & CntHDogleg
mainly to prevent making doglegs twice on a turn contact. This is to
limit over-fragmentation. If one dogleg doesn't solve the problem,
making a second one will make things worse only...
* Bug: In Anabatic::Configuration::selectRpcomponent(), we were choosing
the component with the *smallest* span instead of the *bigger* one.
* New: In Anabatic::GCell, introduce a new flag "GoStraight" to tell that
no turn go be made inside those GCells. Mainly used underneath a block
corona.
* New: In AnabaticEngine::layerAssign(), new GCellRps & RpsInRow to manage
GCells with too many terminals. Slacken at least one RoutingPad access
when there is more than 8 RoutingPad in the GCell (slacken or change
a vertical METAL2 (non-preferred) into a METAL3).
* Change: In Anabatic::NetBuilderHV, allow the use of terminal connection
in non-preferred direction. That is, vertical METAL2 directly connected
to the RoutingPad (then a horizontal METAL2). This alllows for short
dogleg without clutering the METAL3 layer (critical for AMS c35b4).
Done in NetBuilderHV::doRp_Access(), with a new UseNonPref flag.
Perform some other tweaking on METAL1 access topologies, to also
minimize METAL3 use.
* New: In AnabaticEngine::computeNetConstraints(), also compute the
distance to RoutingPad for segments. Set the Unbreakable flag, based
on the distance and segment length (local, short global or long global).
New local function "propagateDistanceFromRp()".
* Change: In AnabaticEngine.h, the sorting class for NetData, SparsityOrder,
is modificated so net with a degree superior to 10 are sorted first,
whatever their sparsity. This is to work in tandem with GlobalRouting.
* New: In Katana::TrackSegmentNonPref, introduce a class to manage segment
in non-preferred routing direction. Mostly intended for small METAL2
vertical directly connected to RoutingPad. Modifications to manage
this new variant all through Katana.
* Change: In Katana::GlobalRoute, DigitalDistance honor the GoStraight flag
of the GCell. Do not make bend inside thoses GCells.
* Change: In KatanaEngine::runGlobalRouter(), high degree nets (>= 10) are
routed first and whitout the global routing estimation. There should be
few of them so they wont create saturations and we want them as straight
as possible. Detour are for long be-points.
Set the saerch halo to one GCell in the initial routing stage (before
ripup).
* Bug: In KatanaEngine & NegociateWindow, call _computeCagedconstraints()
inside NegociateWindow::run(), as segments are inserted into tracks
only at that point so we cannot make the computation earlier.
* Change: In Katana::Manipulator::repackPerpandiculars(), add a flag to
select whether to replace the perpandiculars *after* or *before* the
current segment.
* Change: In Katana::NegociateWindow::NegociateOverlapCost(), when the
segment is fully enclosed inside a global, the longest overlap cost
is set to the shortest global hoverhang (before or after).
When the cost is for a global, set an infinite cost if the overlapping
segment has a RP distance less or equal to 1 (this is an access segment).
* Bug: In Katana::PowerRailsPlane::Rail::doLayout(), correct computation of
the segments extension cap.
* New: In Katana::QueryPowerRails::addToPowerRail(), add support for Pad.
* Change: In Katana/PreProcess::protectCagedTerminals(), apply the contraints
to any turn connected to the first segment of the RoutingPad so the
perpandicular constraints got propagated to the perpandicular segment...
* Change: In RoutingEvent, cache the "distance to RP" value.
* Change: In RoutingEvent::Key::compare(), sort *first* on distance to
RoutingPad, then layer depth. If both distance to RoutingPad is null,
then sort on segment length.
* Change: In RoutingEvent::_processRepair(), try a repack perpandicular with
perpandiculars first (then with perpandicular last, then give up).
* Change: In SegmentFsm::bindToTrack() and moveToTrack(), set an axis hint
when creating the insertion event.
* Change: In SegmentFsm::_slackenStrap(), add a step through slacken between
minimize and maximum slack (wihch directly end up in unimplemented).
* Change: In Session::_addInsertEvent(), add an axis parameter needed when
the axis of the segment is not the one of the track (case of wide
segments or non-preferred direction).
* Bug: In Track::_preDestroy(), bad management of the TrackElement reference
count. Destroy the segment only when reaching zero...
* Bug: In Track::expandFreeIneterval(), forgotten to manage case when there
is a set of overlaping segments at the "end" of the track, the
EndIsTrackMax was not set.
* Change: In TrackCost::Compare, increase the cost when an overlaping
segment is at it's ripup limit. We should try *not* to rip it up if
we can. Add a dedicated flag "AtRipupLimit".
* Change: In TrackElement, add proxies for isUnbreakable(), new function
updateTrackSpan().
* New: In TrackFixedSegment CTOR, when a supply wire of METAL2 or above is
found, make the underlying GCells "GoStraight".
* New: In TrackElement::canDogleg(GCell*), check for already done perpandicular
dogleg on source/target (reject if so).
* New: In Isobar::PyCell, export the isRouted() and setRouted() to the
Python interface.
* Bug: In CRL::Entity::parseEntity(), check that the closing parenthesis
is the last character of the net name. Issue a more relevant error
message.
* In Anabatic::NetBuilder::_do_xG() and all other unimplemented methods,
throw an error if called from a derived classes instead of just
issuing a message in the debug stream. Avoid later core dumps...
* In Anabatic::NetBuilderHV, implement the builders for GCells with
one pin. Needed to support chip/corona routing.
* Bug: In Cumulus/plugins/Chip.py, check that coronaCk exists before
using it.
* New: In Cumulus/plugins/PadsCorona/Side._placePad(), when routing
a design with symbolic pads, export the chip external "pad"
connectors to be able to perform a lvx (otherwise cougar do not
create external nets).
In Corona._createCoreWire(), set the minimal gap between the pads
and the corona to 6 pitches. Empirical value to avoid DRC errors
with symbolic pads (pxlib).
When successufully done, mark the Corona cell as routed.
* Bug: In Cumulus/plugins/Core2Chip.IoNet, the regex for vectorizet net
was wrong, it was allowing only one digit in the index.
* Bug: In Cumulus/plugins/Core2Chip.cmos, correct management of
pad & corona clock nets. Correct connexion between vdde/vddi.
* Bug: In Unicorn/cgt.py, forgot to execute scripts when in text mode.
* Change: In Hurricane::Error constructors disable the backtrace generation.
(*very* slow).
* Change: In Hurricane::Library::getHierarchicalname(), more compact
naming. Remove the name of the root library.
* New: In Hurricane::Net, new type "FUSED", for component with no net.
More efficient than having one net for each.
* Change: In CellViewer, BreakpointWidget, use Angry Birds icons.
* Change: In CellWidget::State, use the hierarchical name (cached) as key
to the state. This allow to load two cells with the same name but from
different libraries in the widget history.
* Change: In PyGraphics, export "isEnabled()" and "isHighDpi()" functions.
* Change: In CRL/etc/symbolic/cmos/plugin.conf, and
CRL/etc/common/plugin.conf use the physical dimensions converters.
* Change: In CRL/etc/symbolic/cmos/technology.conf, make the GDS layer
table coherent with the default Alliance cmos.rds.
* New: CRL/python/helpers/io.py, put ErrorMessage new implementation here,
along with a new ErrorWidget written in PyQt4. It seems finally that
PyQt4 can be used alongside Coriolis Qt widgets.
New ErrorMessage.catch() static function to manage all exceptions
in except clauses.
* Change: In CRL/python/helpers/, no longer use ErrorMessage.wrapPrint(),
directly print it.
Rewrite the utilities to display Python stack traces "textStacktrace()"
and "showStacktrace()".
* Change: In CRL::AllianceFramework, shorten the names of the libraries.
* Change: In CRL::ApParser & CRL::ApDriver, more accurate translation between
Alliance connectors (C record) and Hurricane::Pin objects. Pin are no
longer made square but thin and oriented in the connecting direction.
Use the new fused net for unnamed components.
* New: In CRL::GdsParser, implementation of SREF parsing, i.e. instances.
Due to the unordered nature of the GDS stream, instances creation are
delayed until the whole stream has been parsed and only then are they
created.
For the sake of reading back Alliance s2r GDS, we assume that any
TEXT following a boundary is the Net name the boundary (component)
belongs to.
Create abutment box for Cells, computed from the bounding box, so
the Hurricane QuadTree could work properly.
Make use of the fused net for unnamed components.
* New: In Cumulus/plugins/chip, complete rewrite of the I/O pad management.
Now we can mix real (foundry) pads and a symbolic core.
To cleanly support the de-coupling between the real part and the
symbolic one we introduce a new intermediary hierarchical level, the
corona. We have now:
Chip --> Pads + Corona --> Core.
At chip level (and if we are using real pads) the layout is fully
real (excepting the corona).
The Corona contains everything that is symbolic. It has symbolic
wires extending outward the abutment box to make contact with the
real wires coming from the pads.
In the pad ring we can use corners instances (or not), pad spacers
or directly draw wires between connectors ring pads.
Provide two flavors: placement only or full place & route.
WARNING: If routing in a second step, *do not route* the *Chip* but
the *Corona*.
* Change: In Cumulus/plugins/clocktree, give the modified Cell an
additional extension of "_cts" (Clock Tree Synthesis) instead of
"_clocked", to follow the common convention.
* New: In cumulus/plugins/S2R.py, encapsulate call to Alliance S2R and
reload the translated Cell in the editor.
* New: In cumulus/plugins/core2chip, provide an utility to automatically
create a chip from a core. To work this plugins must have a basic
understanding of the pad functionalities which may differs from
foundry to foundry. So a base class CoreToChip is created, then for
each supported pad foundry a derived class is added. Currently we
support AMS c35b4 and Alliance symbolic cmos.
* Bug: In Anabatic::Configuration, read the right configuration parameter
"anabatic.topRoutinglayer" (Katana), and not the one for Katabatic...
* Change: In Unicorn/cgt.py, process the plugins in alphabetical order
to ensure a reproductible ordering of the menus...
* Bug: In CRL/etc/symbolic/cmos/plugins.conf, rails dimensions are no
longer expressed directly in lambda. Must be created using helper.l().
* Change: In CRL::ApParser, slightly more smart management of Pin width.
Must normalize Pin behavior between Alliance & Hurricane as in
Alliance they have only one dimension.
* Change: In CRL::LefImport, if a net name end with "!", assume it's a
global one. Have to check this naming convention.
* Change: In Anabatic::NetBuilderHV::_do_1G_1PinM3() & _do_1G_1PinM2()
now implemented. Needed for the corona routing support.
* Change: In AnabaticEngine::setupPreRouted(), exclude segments outside
the abutment box.
* Change: In KatanaEngine::PowerRails, remove the I/O pad support as now
we route only inside the Corona. So only one vdd/vss/ck are supported.
* New: In cumulus/plugins/ChipPlugin.py, complete rewrite of the chip
support:
* Uncouple pad I/O ring whith real cells (foundry) from a symbolic
core. A new intermediate level "corona" is introduced to handle
the real/symbolic transition.
* Ability to explicitly setup position of the pads on the chip side
in case of uneven distribution.
* Enable clock tree to be build with 3 metal only (M2 to M4) instead
of (M2 to M5).
* Change: In Etesian::Configuration CTOR, use the gauge from the
configuration parameter "anabatic.routinGauge" instead of the default
one.
* Change: In Anabatic::Configuration CTOR, use the gauge from the
configuration parameter "anabatic.routinGauge" instead of the default
one.
* New: In Hurricane::IntrusiveMap, introduce IntrusiveMapConst which allow
to search with a "const Key&" instead of a "Key", sparing the copy
construction of the Key.
* Change: In Hurricane::Cell::NetMap, use the new kind of map with
"const Name&" key access. This speeds up the Cell::getNet() method
by suppressing one copy construction of a Name, which are costly
after all...
Should review the whole code to use "const Name&" everywhere it
is possible.
* Change: In Hurricane::Entity & Hurricane::DBo, displace the unique
identifier from Entity to DBo (move up to the base class).This
to allow us to build deterministic map of DBo requireds in
UpdateSession (which is built upon a SharedProperty).
WARNING: This break the JSON database exportation support, do not
use it until fixed/rewritten.
* Change: In Hurricane::Layer, add an attribute to know if a layer is
associated to a blockage. Modificate accordingly PyLayer and
BasicLayer.
* Change: In Hurricane::SharedProperty, the set of owners (DBo*) is now
stored in a std::set sorted on the objects Ids, instead of a simple
vector. The linera search time through the std::vector was starting
to show (ISPD05 bigblue1).
* Bug: In Isobar::PyInstance, make full contructor signature (5 arguments)
conform to the C++ one. It was only accepting the four first and
forcing the placement status to be FIXED.
* Bug: In CRL/etc/symbolic/ispd05/kite.conf, update for the new configuration
requirements where all distance must be converted into DbU in the
file itself (use "helpers.l()", "helpers.m()"). Apply to the cell &
routing gauges.
* Bug: In CRL/etc/symbolic/ispd05/technology.conf, update for the new
configuration. "helpers.initTechno()" *must* by called first thing
in this file in order for the Technology to be created.
* New: In CRL::AllianceFramework, add matchCellGauge() &
matchCellgaugeByHeight()
* New: In CRL::CellGauge, add a flag to distinguish gauges meant for
IO Pads and an "isPad()" predicate.
* Change: In CRL::Ispd05Bookshelf, flush the UpdateSession stack every
1000 elements additions. Maybe not necessary now the the UpdateSession
property relies on a std::set instead of a std::vector.
* New: In CRL::LefImport, support for SITE and match/create the appropriate
CellGauge on the fly. Specific support for MACROS that are flagged PAD.
Add a dedicated post-treatment for PAD connectors, extend them toward
the boundary of the nearest abutment box side. Tested only on AMS 350nm
c35b4 for now.
This part is most likely to be tweaked for every kind of real foundry
pad that we may encounter...
* Change: In EtesianEngine::findYSpin(), use the C++ "for" construct to loop
over Collections.
* Change: In Unicorn/cgt.py, register the Python/C++ tutorial support by
default.
* Bug: In Hurricane::Collection::iterator, the iterator use a locator from
a getLocator() not wrapped inside an auto_pointer like GenericLocator.
So the destructor of the iterator must take care of the deletion.
This was showing more and more as we converted forEach() into the
C++ 11 for syntax.
Seems to decrease the memory use by almost a factor 2...
* Bug: In Dijkstra::_cleanup(), as a double security, cleanup the queue.
* Bug: In Katana::Track::expandFreeInterval(), the OutsideElement case was
not handled correctly, the end index must be increased in that case.
As a result, this function was returning too short an interval.
This was affecting the computation of perpandicular free interval
in DataNegociate::update() for perpandicular fixed but not in a track.
* New: In Anabatic::NetBuilder and NetBuilderVH, now manage GCells with
one Pin, and up to three globals. Used to put terminals at the
edge of a block.
* New: In EtesianEngine, now manage placed Pins.
(done through extractInstanceName())
* Change: In CRL::RoutingGauge::getHorizontalGauge() no longer skip PinOnly
gauges to find the reference one (same goes for vertical).
* Bug: In Anabatic::Edge::getDistance(), remove the additionnal 0.1
added to horizontal edges. This was for testing before the hScaling
parameter was added (to the distance computation in GlobalRoute).
* New: Anabatic::Path_Edges, collectio to walkthrough all the edges
between two node. More complex than in Knik as we are no longer
using a regular grid. We may request the north bound path or south
bound path.
Collection returned by AnabaticEngine::getEdgesUnderPath().
* New: In Anabatic::NetData, add a new flag GlobalEstimated to tell if
the net RMST has been computed (using FLUTE).
* New: In Anabatic::PriorityQueue, used to sort Vertexes by increasing
distances, add a new criterion to be used in case of distance
equality. The attractor which should be the center of the search
area. In case of equality, we choose the Vertex which is closest
to the attractor. Give a small improvement, and more "dendritic"
trees.
For a more simple implementation of the comparison function it is
made as a static member (so no two Dijkstra objects at the same
time...).
* Change: In Anabatic::Edge, make the estimate occupance a floating
point number instead of an integer.
* New: In Katana::GlobalRoute, finally implement the estimated congestion
driven router. Net RMST estimated using FLUTE.
Use the historic cost from Knik implementation and not the one
given in Damien's thesis, which seems not be the same and a bit
strange.
* New: In KatanaEngine, add the ability to exclude nets from routing,
and export it to Python.
* New: Anabatic::AutoContact::setLayerAndWidth() to set both layer and
VIA width/side according to the RoutingGauge. If the delta in zero,
use the metal gauge, and the VIA gauge otherwise.
* Bug: In Anabatic::AutoContactTerminal, Anabatic::AutoContactTurn,
Anabatic::AutoContactHTee & Anabatic::AutoContactVTee, in the
updateTopology() method, set both the layer and the VIA with when
there is a change of layer. Note that this default size may be
overriden later by updateSeize() in the case of non-default width
segments.
* New: In Anabatic::AutoSegment, new overload setLayer(size_t) to set
both layer and segment with according to the routing gauge.
* Bug: In Anabatic::AutoHorizontal and Anabatic::AutoVertical, in method
_makeDogleg(), make use of the new setLayer() to correctly set up
the wire width.
Idem for Anabatic::AutoSegment::changeDepth() and ::makeDogleg(),
and in Anabatic::LayerAssign.
* New: In Hurricane::RbTree, template for red-black tree. Standard
implementation but well integrated in the Hurricane database and
ready to be derived (both iterator and Collection support).
* New: In Hurricane::IntervalTree, template for interval tree, derived
from RbTree.
* New: unittests tool to perform unit tests.
* Change: In Bora::ChannelRouting, now implemented with IntervalTree.
There is something suspicious here : the "thick" version of
addWireoccupation() seems never to be called. Have to check the
wide wire support implementation.
* Change: In Hurricane::CellWidget, set the minimal size to 350 pixels
to fit my normal DPI secondary screen...
* Change: In Hurricane::Error(), reactivate the backtrace generation by
default. Seriously slow down the program each time an Error is to
be constructed.
* Bug: In Analog::Device::preCreate(), check for NULL Technology before
attempting to use it.
* Change: In Hurricane/Analog, remove all '*Arguments*' classes and their
Python interface. It was an obsoleted way of passing devices parameters
to the Python layout generators (located in Oroshi). Now we just get
them straight from the Device with the getParamter() method.
* Change: In CRL::System CTOR, add Python pathes for Oroshi & Karakaze.
* Change: In Oroshi/Python/WIP_*.py layout generator scripts, remove
all uses of the "Arguments". Directly access the parameters through
the device itself. Make the checkCoherency() with identical arguments
as of layout().
* New: Bora tool that performs analog place & route. Based on a slicing
tree representation. It is the thesis work of Eric Lao.
Code beautyfication and some programming cleanup.
* New: Karakaze tool, provide the Python base class AnalogDesign used
to build an analog design. Create/configure devices and assemble
them in a slicing tree.
* Change: In Unicorn/cgt.py, display the stack trace in case of an
ImportError exception as well as for other exceptions.
Add Bora to the set for included tool engines.
* Change: In CRL::GdsStream, no longer export empty Cells as structures,
to avoid empty cells in Cadence. To prevent meta-transistors to be
exported as real physical objects.
Also put a hard-coded test to prevent exporting "control_r" model
which is made of AMS standard cells for "amsOTA".
* Change: In CRL/PyRoutingGauge, export the isHV() and isVH() methods so
the Stack can access it.
* Change: In Hurricane/PyCellViewer, export the removeHistory() method.
When a Cell is deleted, it must be also removed from the editor
history. This should be take care of automatically, but for now
we make it manually through scripts.
* Bug: In Anabatic::NetBuilder::doRp_accessAnalog(), the gauge offset
was not taken into account when creating initial Contact on
RoutingPad. The program self corrected afterwards, but with the
display of a disgraceful message.
* Change: In Anabatic::Configuration and Session, export the gauge offsets.
The short net mode degrade the routing in some cases. This will be
fixed in a next batch of commits.
* New: In Hurricane::NetRoutingProperty, added "ShortNet" flag for Nets
that are completly inside *one* GCell.
* Bug: In CRL::BlifParser::Model::staticInit(), when looking for the
output of zero and one cell, also skip the blockage net (as well as
automatic and supplies).
* New: In Anabatic::AutoSegment, added "ShortNet" flag to know if the
segment is part of a short net (fully included in *one* GCell).
Also add accessor/mutators for the _analogMode flag (was it ever
used before?).
* New: In Anabatic::NetBuilder::singleGCell(), if a RoutingPad is
vertically small, add a vertical segment to give it some slack.
* New: In Anabatic::Dijkstra::_materialize(), detect "short net" as
they have only one GCell in their source list...
* Bug: In AnabaticEngine::_loadGrbyNet(), reset the AutoSegment
"short net" and "analog mode" creation flags between two different
nets.
* New: In Katana::Configuration, added dedicated ripup for short net
segmnts.
* New: In Katana: partially implemented support for "short dogleg", that
is dogleg that are always kept in same metal because they connect
neighboring perpandicular tracks. Not finished neither activated
yet.
* New: In Katana::TreckElement and derived, export the the *short net*
support from AutoSegment.
* Bug: In Katana::RoutingEvent::_processRepair(), when a segment is
successfully inserted, re-process any perpandicular that is in
repair state, as it may have a new chance to be placed.
* New: In Katana::SegmentFsm::slackenTopology(), always reject short nets.
* Bug: In Katana::Track::check(), correctly handle wide segments instead
of issuing false check messages.
* New: In Anabatic::LayerAssign, a new mode "LayerAssignNoGlobalM2V" has
been added to manage the 3 routing metal technologies like AMS 350nm.
The standard cells have all their connectors punctual and aligned on
an horizontal line in the middle of the Cell. This is a design
inherited from the channel routing times that makes global routing
in metal2 *through* a standard cell almost impossible (except for
directly neighboring cells). Thus, the layer assignment must move
up all the metal2 that span more than two GCells.
* Change: In Katana::Manipulator::ripupPerpandiculars(), when a perpandicular
has a fixed axis and it's (sole) underlying track is taken, ripup
the other segment to ensure the perpandicular interval will be free.
We need to do that, because in DataNegociate::update(), if the
perpandicular is taken, the perpandicular interval will always been
empty preventing the segment to have a valid track span (so directly
failing).
* Change: In Katana::SegmentFsm::conflictSolveByPlaceds() the fixed axis
segments must also been taken into account as conflicts.
Also correct a small bug, the first conflicting segment in the
interval was not taken into account correctly.
* Bug: In Anabatic::AutoSegment::_changeDepth(), GCells under the segment
must be invalidated in order for the density to be recomputed.
But we were using GCell::invalidate() which is meant for the quad-tree
and graphic system, so the density almost never updated in case of
a layer change, leading to over-congested GCells in the top layers
(110% !).
Now we directly set the Invalidated flag.
* Change: In all tools supplying documentation, as we use some specific
software to create the doc, they may not be available, or worse, be
and incompatible version. So, by default, we install the files shipped
with the git repository. To force a full doc rebuild, use the "--doc"
flag of ccb.py.
* Change: In Anabatic::setupPreRouteds(), routed DeepNets can have
components both at Occurrence root net devel and at top level.
If no nets remains to route, set the tool state to EngineDriving,
which prevent any further work (except for finalize).
* Bug: In Anabatic::Dijkstra, the degree of a vertex (the number of neighbors
belonging to the same net) was miscalculated. This was leading, in the
materialize step to some feed-through vertexes not being broken.
Leading in turn to incomplete transformation of the detailed routing.
Also in _trackback(), the degree of the first vertex we were backtracking
from was not incremented.
* Bug: In Anabatic::Dijkstra::materialize(), systematically use
GCell::breakGoThrough() on both source and target. This is needed when
we are in the ripup phase as both source and target can be go-through.
This was also leading to incomplete detailed routing transformation.
* Change: In Anabatic::Edge::ripup(), ripup one third of the segments instead
of thoses exeeding the global length threshold. This way we are sure to
desaturate an edge. Needs to be further calibrated.
* Change: In Aanabatic::GCell::breakGoThrough(), no longer return NULL.
Return existing gcontact if any. Break if it is a go-through and create
a new gcontact in last resort. Maybe rename this function.
* New: In Anabatic::Configuration, new parameters:
- anabatic.edgeHScaling, to adjust the length of the horizontal edges
relative to the vertical ones (this is a ratio).
- anabatic.globalIterations, set the maximum number of ripup passes
of the global router.
* New: In CRL/etc/*/kite.conf, added new parameters anabatic.edgeHScaling
and anabatic.globalIterations.
* New: In Katana::GlobalRoute::DigitalDistance, take into account the new
edgeHScaling factor. Must be used when the capacity of V-edges differs
greatly for H-edges (case of AMS 350nm c35b4 for instance).
* Bug: In Katana::GlobalRoute::DigitalDistance, the historic cost is
computed for an edge length of "1". Must be multiplicated by the
current edge length to have any measurable effect.
This bug is finally explaining why the ripup was producing the
same solutions over and over, the historical cost was negligible!
* Change: In Anabatic::GCell::doGrid(), the GCell where square using the
slice height as side. This was leading to vertical edges with slightly
different capacities when the vertical picth was not a multiple of
the horizontal one. This was not a bug per se as the global router
is able to manage any interval.
Now the horizontal side is rounded on the slice step.
* Bug: In Anabatic::AutoSegment, Anabatic::AutoContact and derived
classes, the recursive invalidation mechanism did have cross-call
troubles.
- The various AutoContact::_invalidate() now take the flag into
account instead of resetting it. This is for Flags::Topology
to be passed along from segments to contacts.
- In AutoSegment::invalidate(), do not invalidate S/T contacts
already invalidateds. In the same way, do not invalidate
aligned segments already invalidateds (save some recursion).
- In AutoSegment::_changeDepth(), call invalidate with
Flags::Topology (to force contact update) and Flags::NoCheckLayer
to avoid disgraceful warnings.
* New: Anabatic::NetBuilder::_do_xG_1M1() with (x >= 2) new set of
optimized topologies when there is multiple globals but only one
terminal. The default one was making two connections to the same
RoutingPad, which was making clutter.
* 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.
* Bug: In Anabatic::NetBuilder::singleGCell(), in HV mode, check if the
two adjacent metal1 pins at least share a vertical span. If not,
create a dogleg.
* 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 Anabatic::Edge::ripup(), sort edges to ripup by decreasing
length so the longest gets riped up first.
In two metals mode, ripup all segments *except* those who have
terminal contact in the GCell, because they must use it anyway.
* Bug: In Anabatic::GCell::getEdgeAt(), the size hint flag was not
correctly selected, leading to the use of an edge in the wrong
side. So deleted segments where not deleted from their edges,
leading to core dump. Don't understand how it can have not shown
until now.
* New: In KatanaEngine::annotateGlobalGraph(), for two metal gauges,
decrease the edge capacity on both north and south side for each
terminal in the GCell. As a terminal must be accessed through
north or south it blocks the whole vertical track (hence both
edges).
* Bug: In Anabatic::AutoHorizontal::_makeDogleg(), do not take into
account dragging constraints from perpandiculars if the terminal
is from a analog Device. We can never drag over it as it is
forbidden.
Same modification for AutoVertical.
* Bug: In AnabaticEngine::loadGlobalRouting(), call relaxOverconstraineds()
only if we are *not* in two-metal mode.
* Bug: In NetBuilder::construct(), allow any number of globals (up to 6)
when in two-metal mode. Should be sufficent for now.
* New: In AnabaticEngine, new method _updateGContacts() to re-compute
the positions of the global routing contacts *after* a GCell
resize.
* Bug: In Katana::Block::resizeChannels(), must call _updateGContacts()
after the resize to properly shift their positions.
* Bug: In Anabatic::AutoSegment::computeOptimal(), the "side stack"
computing the intersection of all the sides of the GCell that the
segment is going through was implicitly supposing that the
resulting intersection wasn't empty. But for analog segment, we
compute the position of all the segments linked though simple
doglegs, and as dogleg occurs there can be a sufficient shift
so the intersections of all the sides became empty.
Now the "side stack" can manage configuration when instead
of having an intersection we have a "hole" in the GCell side
span (only one hole is supported at the moment). When a hole
is present, the optimal position is the center of the hole.
Should be refined so that the position is computed according
to the longest GCell that we go through.
* Change: In Katana::SegmentFsm::_slackenGlobal(), when slackening
a global from a ananlog net, allow to make a dog leg once
instead of immediately moving up. The break point is the center
of the segment.
* Change: In Katana::Manipulator::Makedogleg(DbU::Unit) if the break
position is over a device, choose the left of right GCell.
* New: In Anabatic::EdgeCapacity, dedicated object to manage the capacities
of an edge by layer. This needed now because with real technologies
layers capacities differs (unlike with symbolic technologies).
This object is separated to be shared between Edges with identical
characteristics (direction+interval). Deletion is automatic and
done through refcounting. All the already allocateds EdgeCapacity
are kept into a set in the AnabaticEngine (key is (direction,interval)).
* New: In Anabatic::Edge, capacities are stored in a shared EdgeCapacity
object. The total capacity can be annotated (i.e. decreased).
EdgeCapacity attribute is created during the materialize() call.
The capacities are computed at this time.
The incCapacity() function is renamed in reserveCapacity().
* New: In Anabatic::AnabaticEngine, added attribute _edgeCapacitiesLut
to store the shared EdgeCapacity.
Lookup/Creation of an EdgeCapacity is done through _createCapacity().
* Change: In Anabatic::Constants, rename Flags::IllimitedCapacity into
Flags::InfiniteCapacity. Add Flags::NullCapacity (both for Edges).
* Change: In Anabatic::GCell, implement a by depth (for layer) getCapacity().
This modification did expose a bug in the density calculation :
per depth density where divided by the complete density instead of the
density's depth. This was leading to greatly underestimated densities.
Thoses underestimations where preventing Dijkstra and layer assignement
to manage congestion correctly (in fact, it was acting as if there
never was congestion).
Also avoid a divide by zero (thus -NAN showing in densities).
* Change: In Anabatic::GCell, rename setEdgeOccupancy() into the more
accurate forceEdgesCapacities().
Note for Eric: only the first Edge on each side has it's capacity
forced. What if there's more than one Edge ?
* 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.
* New: In Anabatic & Katana, add the new "drag" feature.
With VH gauges used by real technologies (M1-H, M2-V, M3-H) a new
routing configuration that was not efficiently handled did appear.
While the preferred routing direction for metal1 is officially
horizontal, due to the way the standard cell must be designed,
their metal1 terminals are still verticals (or punctuals).
Thus, when connecting to them, we face the case where the metal1
terminal (RoutingPad) is vertical *and* the metal2 wire is also
vertical. With that setup, the position of the AutoContactTerminal
via12 cannot be deduced, it may range all the way over the
metal1 RoutingPad. What may define it's position is the metal3 the
metal2 finally connects to. That, is, when we have one horizontal
(the metal3) and one vertical (the metal1 RoutingPad).
The intermediate wire of metal2 can be kept to a minimum size
by "dragging" the via12 close to the via23 when the metal3 wire is
moved.
* New: In Anabatic & Katana, problem of closely vertically aligneds
RoutingPads in metal1 is managed first in PreProcess by restricting
the span of the connecteds metal3 and in _makeDogleg also by restricting
the span even more tightly (to the RoutingPad itself).
* New: In Anabatic::AutoContactTerminal, add the "drag" support.
Automatically check if the connecting segment is in the same
direction as the RoutingPad, if so, sets the "SegDrag" flag.
The dragging state can be known with the "::canDrag()" predicate.
* New: In Anabatic::AutoHorizontal, add the "drag" support.
The drag state can be known with the "::isDrag()" predicate.
In "::_makeDogleg()", when making a dogleg on a dragable segment
pass the drag state correctly and restrict the perpandicular span
of the perpandicular to the RoutingPad (though segment user constraints).
If we make a dogleg on the metal2 is it likely than we cannot go
straigth out vertically from the RoutingPad, so the new perpandicular
*is* restricted to the RoutingPad span.
Idem for AutoVertical.
* New: In Katana::Manipulator, add method "::dragMinimize()" which find a
hole where to minimize a draggable segment. We finally did not use it,
but keep it for potential further use.
* New: In Katana::PreProcess, adds a "protectAlignedaccesses()" local
function to check for vertically aligned metal1 RoutingPads, in that
case setup user constraints on the metal3 segments so they cannot
completly cover the other RoutingPad with metal2.
We also keep a "metal2protect()" function that create a fixed segment
to lock/protect a RoutingPad. Not used for now.
* New: In Katana::Session, add a RoutingPad locking event mechanism.
This allows us to request the creation of a locking (fixed segment)
over a draggable segment. Not used for now.
Lock events are processeds before all others as they create new
TrackElements.
* New: In Katana::Track, "::getNextFree()" and "::getPreviousFree()"
method to find the nearest free interval in a Track after/before a
position.
* Bug: In Anabatic::AutoHorizontal::getConstraints(), merge with user
constraints *only* if it's not an empty interval (as we use min/max
functions). Idem for AutoVertical.
* Bug: In AutoSegments_OnContacts::Locator::isValid(), the boolean test
must be inverted. Seems it never worked, but we never used it until
now...
* 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 Anabatic::AutoContactTerminal::getNativeConstraintBox(),
when the anchor is a RoutingPad (which must be always the case),
perform the true computation of it's position based on the
segment occurrence. It is a important change, previously the
area was in fact the "center line" of the connector while now
it is really an area (mandatory for "half-offgrid" terminals of
real technologies).
The change is not complete yet, the area should be shrinked
by the half size of a VIA, because the area applies to the center
coordinate of the VIA (to be done quickly).
* Bug: In Anabatic::AutoContactTurn::updateTopology(), when a dogleg
is created (restore connexity after a layer change) the layer of
the VIA, based on the segments it connects to must be re-computed
*after* the dogleg has been made.
* Change: In all files of Anabatic, when comparing two layers, no longer
use the Layer pointer itself, but the layer mask. This allow a
transparent management of both real and symbolic layers (which
do share the same mask). Real metal layers (not VIAs) will be
BasicLayer and symbolic metal layers will be RegularLayer.
* New: Anabatic::Configuration::selectRpComponent(), select the best
RoutingPad component for metal1 terminals. Look for the metal1
component with the biggest accessibility on-grid.
RoutingPad using other metals are left untoucheds.
* New: New function Anabatic::Vertex::getNeighbor(Edge*) to get the
neighbor Vertex through an Edge*. This method allows to write
clearer code as we no longer need to access the neighbor through
the underlying GCell.
Also add proxies for GCell methods in Vertex.
* Bug: In Anabatic::Dijkstra::_toSources(), in the ripup stage, when
a component with multiples vertexes is reached *and* two of it's
vertexes are reached *at the same time* (one from which we backtrack
and one still in the queue) extraneous edges may be created by
_materialize(). Case occurs on snx/c35b4, "abc_5360_n903_1".
To solve this, Dijkstra::_toSource() is modificated, the "from"
edges of the newly reacheds vertexes are reset to NULL, *except*
for the one we will be backtracking from. That is, the one given
in the source argument.
* Change: In Anabatic::NetBuilder class, put the various Hooks and
RoutingPad sorting functions as class ones.
* Bug: In AutoSegment::setLayer(), raise the SegInvalidatedFayer flag.
This unset flag was causing AutoContactTurn::updateTopology()
to not work as expected and making gaps, this was the cause of
the last remaining warnings about layer connexity.