Main list of ports:
* Replace deprecated operator '<>' by '!='.
* To check if a list is empty, do not compare to [], but check it's
length instead.
* Do not make a class inherit indirectly twice from the same base class.
* Hurricane physical object constructors uses DbU::Unit as arguments,
seen as int in Python, so they will not match float. Unfortunately
the calculation often gives float. So explicitely cast them into
int. This is due to a change of behavior in Python. Now, 3/2
gives 1.5 (float). To get the previous one use: 3/2 -> 1 (int).
* dict.keys()[0] no longer work, instead use list(dict.keys())[0].
In SelectorCriterion & SelectorCriterions, when selecting a Net occurrence,
we where storing the Net only. This was fine if the Net was belonging to
the Cell's top level. But when it was an occurrence of a non-top level
net, this was creating the elusive incoherent Occurrence problem.
Now we truly store the occurrence of the Net, to be accurate, the root
of the HyperNet.
* Change: In SelectorCriterions::add(), the Net* argument is replaced
by a Occurrence of Net. Must be an HyperNet root occurrence.
Same goes for SelectorCriterions::remove().
* Change: In CellWidget::select(), when called with a Net occurrence,
select the whole HyperNet components.
* Change: In NetSelectorCriterion, now use a Net occurrence instead
of directly a Net. Must be an HyperNet root net occurrence.
* Change: In EtesianEngine::toColoquinte(), not only compute the ratio
of DFF versus the total number of gates, but also the ratio in
term of area. As the DFF are usually very big cells compare to
combinatorial one, the direct gate ratio could be misleading as
to the "weight" of those cell in the design.
* Change: In PyLayoutGenerator, in the method definition of the class,
replace the METH_STATIC flag by METH_CLASS for setVerboseLevel().
There may be more of it elsewere, but as they didn't seem to
have been triggered, we will see as it happens.
* Bug: In cumulus/plugins.block.htree.HTree._connectLeaf(), the stacked
contact to connect the top left buffer amplifier was not forcibly
aligned on the vertical METAL5. In some configuaration it was
leading to gaps at METAL5 level.
* Bug: In AutoSegment::getEndAxes(), as the NonAligned flag may be
wrong, always loop over the aligneds (if any). Then, the
target axis computation was wrong, using a min() instead of
a max().
This was, in turn, wrongly activating isNearMinArea() and
causing non-minimal length segment to have their extremeties
extented. And, in the end, Track overlap.
This was the reason why we, sometimes got "UNCONNECTED" errors in the
VHDL PORT MAP statements. This was the remnants of the originally
connected driver.
* Bug: In Etesian::BufferTree, as the root driver is disconnected from
all the sinks, but the top tree buffer, we may end up with
unconnected signal on instances that were using it.
So now, call BufferTree::rcleaupNet() to remove the Net in
the Cell that where used to "transmit" the original driver.
* Bug: In Etesian::BufferTree, no longer use a _isDeepNet attribute
guessed from the occurrences pathes of the RoutingPad, but
trust the Net::isDeepNet() method.
* New: In Katana::DataNegociate, add a "sameRipup" counter to keep
the *consecutive* number of time a segment is put in the same
track.
* New: In TrackSegment::setAxis(), update/reset the "sameRipup"
counter of the DataNegociate.
* New: In TrackCost, add new flag "Blacklisted" to mark Tracks that
have been riped up too much in a consecutive row.
TrackCost::Compare::operator() will then sort the blacklisted
track after the non-blacklisted ones.
* New: In SegmentFsm CTOR, raise the Blacklist flag on the TrackCost
if the "sameRipup" is above 10. This to get away from a state
well in the ripup.
Bug: In NetBuilderHV::doRp_AutoContact(), when encountering a
punctual RoutingPad in METAL1, create the protection in the
METAL2 layer instead of METAL1 (current layer).
* Bug: In NetBuilder::setStartHook(), trigger the "move up" of
global routing only when encountering RoutingPad of a macro
block and *not* an I/O pin of the whole block (at the edge).
Boils down to look if the RoutingPad is anchored on a Pin
or a Segment (macro block).
* Bug: In cumulus/plugins/rsave.py, the Cells where saveds each time
one instance of was encountered. Resulting in multiple saves.
It was, of course, ineficient, but it also triggers a bug
that seems to happen after multiple save : the VHDL additional
property was deleted *before* the full hierarchical dump was
finished.
Now, we save each Cell only once so it does not occur, but
should make a deeper investigation later.
* Change: In AutoHorizontal::setDuSource() & ::setDuTarget() (& AutoVertical),
check that the requested "du" is less than a pitch (this is not an
upper bound). Issue a warning if not true.
* Change: In AutoSegment::revalidate(), when passing the previous span
interval to expandToMinLength(), if we are in creation stage, make
it empty because it has no sense yet and can lead to a lock in a
too narrow span.
Change the coupled behavior of expandToMinLength() vs.
unexpandToMinLength(), the call to "unexpand" will be done on
AutoSegments that are flagged with SegAtMinArea, instead of
using the return value of "expand". This way we control across
multiple revalidate() if a segment can be "unexpanded".
* Bug: In AutoSegment::expandToMinLength(), not only try to shift left
if we are beyoond the max bound but also to the right if we are
below the min bound.
the span on the target and source were miscalculated, we must
add the half-minimal distance to get the span inside the Track.
* Change: In AutoSegment::isMiddleStack(), rename into isNearMinArea()
as we check for any *small length* set of AutoSegments and not
only the one part of a middle stack. In some rare instances,
two aligned segments can nevertheless be too short.
* Bug: In AutoSegment::reduceDoglegLayer(), when finding a reduced
segment also reset it's duSource & duTarget because it will
no longer be an isolated strip of metal.
* Change: In AutoHorizontal::updateOrient(), when there is a
source/target swap, no need to exchange the dxSource and
dxTarget extentions.
* Change: In AutoHorizontal::setDuSource() & ::setDuTarget(), check
for du bigger than the pitch, which should never occur and
display a warning.
Same modification in AutoVertical.
* Change: In Track::repair(), now invalidate the shifted segments
to ensure cache coherency with the TrackElement.
Do not take AutoSegment in non-preferred direction into
account, and especially do not try to resize them.
Now, invalidate the corrected segments (see below).
* Change: In KatanaEngine::finalizeLayout(), move the track repair
stage from here into NegociateWidow::run(). This way we avoid
the false warning about segment overlap in the data-base final
check. The false warning was because the AutoSegment where
shifted but not invalidated/revalidated leading to a cache
incoherency in the TrackElement. Now they *are* invalidated
and updated.
* Bug: In Track::checkMinArea(), do not check for minimal area when
a segment is overlapping a same net neighbor. To avoid false
minimum area violation warnings.
* Bug: In AutoContactTurn::updateTopology(), in some case we were making
doglegs on segments in non-preferred routing direction (mostly M2).
This must be never be done. As, by construction, at least one segment
of the turn must be in the preferred routing direction, always use
this one to make the dogleg.
This bug is likely to explain the remaining "bad spin" in the
final self-check of the routing data-structure.