* Change: In Anabatic::Autocontact, replace getMinDepth() and
getMaxDepth() by getDepthSpan().
* New: In Anabatic::AutoSegment::canMoveUp(), add an optional check of
low up density (Flags::CheckLowUpDensity). Allows to move up a
segment if the up density is (very) low, and in this case it's more
efficient than breaking it to fit in the lower layer.
canMoveUp() is now able to perform the same work as canPivotUp()
if *not* supplied the flag Flags::IgnoreContacts.
* New: In Katana, in GlobalRouting::DigitalDistance() now take into
account the cost of a VIA (currently set to 2.5). Need to known the
Net currently routed in the DigitalDistance object itself.
* Change: In Katana::Track::Element::canPivotUp(), now also takes a flag
parameter.
* Change: In Katana::Manipulator, new flag IgnoreContacts to mirror the
one of Anabatic.
* Change: In Katana::SegmentFsm, allocate once a Manipulator object instead
of many times on the fly.
In SegmentFsm::_slackenGlobal(), in the slacken state, if the up
density is (very) low, bypass to move up instead of slackening.
This solve better the routing of the control part of the register file.
The register file having a pathological case of terminal placement:
many punctual terminals aligneds in METAL2 *and* a grid of METAL2 and
METAL3 blockages near below...
* Bug: In Katana::Session::_revalidate(), after removing the zero-length
segments, forgot to re-order the track, leading to many stranges effects
as the indexes where no longer coherent in the Track.
* Bug: In Anabatic::GCell, new functions getConstraintUMax() to return the
correct bounding box for the last north/east GCell. The GCells do not
own their north/east edges, except for the last ones. Thoses functions
must distinct from getUMax() because for them, the shrink is always
applied. getConstraintBox() uses the "getConstraintUMax()" functions.
* Bug: In Anabatic::AutoContact, initialize the constraint box from the
new GCell::getConstraintUMax(), to manage correctly the boundaries
of the nothernmost & easternmost GCells. The problem was showing for
pins on the north/east side of a circuit, the constraint
* Bug: In Anabatic::AutoContactHTee, Anabatic::AutoContactVTee and
Anabatic::AutoContactTerminal forgot to call the _preCreate() function
in the various create().
* Bug: In Matrix::getUnder(), if on the N/E boundary, decrease by one to
be enclosed in it.
* Change: In Anabatic:
- Long wires, going straight accross multiple GCells were splitted
into a long sequence of segment+contact, one for each gone-through
GCell. It was memory-consuming and algorithmically inefficient.
Now there is only one straight wire.
As a consequence, Edges now store the list of all segments
going through them. That way we do not need to load a Net into
Dijkstra before riping up some of it's segment. The ripup mechanims
can now be implemented right at AnabaticEngine level, without
dependencies over Dijkstra. Note that long wires are automatically
broken in two if we need to attach a new branch on it (breakAt()).
And fused back into one if a branch is removed (unify()).
* Bug: In Hurricane, in tstream (Commons.h), in the *template* overload of
operator<<(), do not use the operator<<() of ostream as it will be
looked up in "stage 1" (template definition) and so will miss all the
overloads added later and built over getString<>(). Instead, make use
of getString<>(), which, as another template will be looked up in
"stage 2" (template instanciation) and at that point will have all the
needed template specialisation of getString<>().
We also need to define new stream manipulators to be able to create
a matching template overload not dependant from the implementation.
To avoid name clashes, we prefix a 't'. For now, only 'tsetw()' is
refined.
As a side effect, we cannot directly print bit-fields into the stream,
we must go through an intermediate variable (happens once in AutoContact).