* Bug: In CRL::GdsDriver::GdsStream two bugs :
1. The tm fields are int but must be casted into uint16_t in BGNLIB
and BGNSTR.
2. The mandatory LIBNAME record was missing.
3. We also force, for now the dbu to be 1000 and the UU to be 1um.
* Bug: In CRL/etc/NODE/VENDOR/Technology.conf, the database must be configured
as early has possible so the functions ensuring length conversions can
work correctly (l(v), u(v)). So we can no longer rely on a table to be
read after the execution of the file. We perform a direct call to the
helpers.Technology.initTechno() function. And it must be made first
thing.
In all tables taking dimensions, we must use one of the converter
function helpers.l(v), helpers.u(v) or helpers.n(v) so the the value v
get converted in lambda, microns or nanometer (resp.). Make the
modifications in all technology.conf and kite.conf files.
* Change: In CRL/coriolisInit.py, remove the technoConfig variable that has
been replaced by a direct call to helpers.Technology.initTechno().
* Change: In CRL/helpers.Alliance.loadRoutingGaugesTable(), no longer try to
convert coordinates, they must already be in DbU.
* Change: In CRL/helpers.__init__.py, remove lambdaMode() and micronsMode()
they could not be made to work as expected. Create l(), u(), n() as
replacement.
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.
* Change: In CRL::ParserMap, no longer recognize the file extensions
".vhdl" and ".vhd" which are true VHDL and cannot be parsed by the
"vst" (Alliance structural subset VHDL) parser.
This should solve annoying problems for the Makefiles when there
is both the full VHDL file ".vhdl" and the synthesized one ".vst"
(note that this problem do not arise when using Yosys/Blif).
* 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 CRL::Blif, we now can add a list of Hurricane library for
the parser to look for standart cells. If the library list is *empty*
we look use the Alliance mechanism, if not, we look *only* in this
library list. This behavior is implemented in Subckt::createModel(). I
To add a library, use CRL::Blif::add(Library*).
This allow to manage symbolic or real mode loading, it may need
some rework to clarify the interface.
* 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).
* New: In Hurricane::Isobar::PyPolygon, export the getSubPolygons()
method. Makes a list of list (maybe tuple should have been better
to prevent user's rewrite).
* Change: In documentation/examples/scripts/, update polygons.py to
serve as a very basic test-bench for Polygon, manhattanhization
and sub-polygons display.
* Change: In Hurricane::Polygon, store the points so they are always
ordered in the counter-clockwise (trigonometric) direction. This
simplicificate internal computations.
* New: In Hurricane::Polygon, added getSubPolygons() methods, that
split horizontally the polygon in sub-polygons of about 1000
vertexes. This is mainly to be used by the GDSII driver to abide
to the XY 4000 points limitation.
* New: In Hurricane::Isobar, export support for Point collections so
the various contour Polygon methods can be created in the Python
interface.
* New: In CRL::GdsDriver, split the Polygons into set of sub-polygons
of less than 1000 vertexes. Use the getSubPolygons() method.
* Change: In stratus1.dpgen_RF2, makes more explicit error messages
about placement by displaying the faulty vs. expected coordinates.
* New: In CRL, implement a GDSII parser. The complete syntax is supported,
but only a few subset is really taken into account. It is intended to
load the layout of standard cells only. The interface of the cell is
provided through a LEF file and it complete layout through the GDSII.
The loader work in a Library way. It takes a Hurricane library as
argument and search in the GDSII library structures with a name
matching the Cell of the library and complete them.
* Change: In Hurricane::Component, put the Contour methods at Component
level so we can use them in a generic way in the CellWidget drawing
primitives.
* New: Hurricane::Rectilinear polygon, for small rectlinear polygons.
Should be less than 100 vertexes. For bigger ones, use Polygon
which allows slanted egdes.
* Bug: In CRL, freepdk_45/technology.conf, there seems to be an incoherency
bettween the GDSII layer numbers as defined in the Cadence FreeePDK45.tf
file and the one used in the supplied layout of the GDSII cells.
For now, we align on the GDSII cells to get nice layouts, but it
has to checked.
* New: In CRL, implement a true GDSII driver. The driver is directly under
CRL and do not use an intermediate structure in vlsisapd. The ASCII
GDSII is removed.
Huge polygons are not supported yet. Have to be split up in
sub-polygons of less than 4000 vertexes.
Symbolic layout can be exported to give a rough idea of the layout
but RDS expension is not applied. Symbolic composite layers are
expansed into their basic layers so the design *looks* normal.
* Deprecated: In CRL, remove all traces of the old XML configuration
parsers. No one needs them now, including Chams.
* Bug: In CRL::BlifParser, before blindly loading the model of a subckt
from disk with AllianceFramework, checks if it is in the Catalog
first. Load with AllianceFramework only cells that are in the
Catalog.
This prevent a file of the same name than a model to be loaded
shadowing the later defintion of the model in the Blif file.
All this is due to the fact that Blif could be non-ordered for
the models...
* Change: In Hurricane::BasicLayer, the "extract number" is replaced
by a GdsLayer and GdsDatatype to generate accurate GDS files.
Even if datatype is 0 most of the time.
Update all the "technology.conf" files in CRL to provide those
two numbers.
* New: In Hurricane::Diagonal, new object to represent 45° and 135°
segments (X routing). Althought they have source & target, they
are not articulated like Horizontal & Vertical, due to the
combined displacement of X and Y (diagonal).
Maybe we should create a common class for all the polygons
to make "::getContour()" a method.
Now we could represent self capacitances and high frequency
wires.
* New: Hurricane::Triange as been renamed into Hurricane::Polygon.
Add support for convex polygons. Polygon are approximateds by
excess by a manhattan rectilinear polygon (with potentially
thousands of vertexes). To reduce the memory footprint,
compaction techniques reducing by at least a factor 4 has been
implemented. We could go further by only storing the non-repetitive
part of the edge (defined by the integral fraction dY/dY).
We will see, if the program slows too much.
The manhattan approximate is always computed but displayed
only if the polygon grid step is greated than 4 pixels.
The level of approximation of the polygons can be controlled
through the "DbU::_polygonStep" parameter.
* Change: In CRL/coriolisInit.py and CRL/helpers/Technology.py, regroup
all DbU related parameters into "technoConfig" (i.e. suppress
"viewerConfig"). Update all the relevant technology.conf configuration
files.
Change the loader behavior so that "technoConfig" is read first
and is now responsible for creating the Technology of the DataBase.
* New: In Hurricane::CellWidget, added support for displaying mahanttanized
polygons.
* Change: In documenation/scripts/expample/polygons.py, perform (I hope)
a comprehensive test of the polygons (check all slopes, clockwise and
conter-clockwise).
* New: In Hurricane::DbU, added template to manage vector<> of DbU.
Support for the "polygonStep" parameter.
* Bug: In 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 Katana::RoutingPlane::getTrackByPosition(), when requesting a
track less than *one pitch* beyond the last one, return the last one
instead of NULL. Only if the mode allows it (i.e. Nearest or Inferior).
* 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 CRL::RoutingLayerGauge::divide() & getTrackNumber(), the number
of traks crossing an edge was wrongly computed for GCells around the
zero coordinate, this was due to the change in rouding direction
around zero. It was starting to show for routing gauges with an offset.
Note: to simplificate the computation of the capacity of an interval,
all the track over a Cell are computed from (0,0). The Cell abutment
box has to be choosen relative to that. The tracks positions are fixed
all over the Cell (or chip if it is one).
* Bug: In Hurricane::Cell_SubCells collection, order the set<> of Cell
with Entity::CompareById instead of pointer values.
* Bug: In Hurricane::Component_ConnexComponents::Locator, sort the
set<> of Components with Entity::CompareById instead of pointers.
* Bug: In Hurricane::Occurrence::operator<(), uses Ids to compare
both _entity and _sharedPath. Check for NULL pointers.
* Change: In Hurricane::IntrusiveMap, add a debug output in _resize()
like for IntrusiveSet.
Note to myself : despite their names, InstrusiveMap are hash
tables and not map<> in the STL sense.
* Bug: In CRL Core, Vst parser, sort the CellVectorMap on Ids.
* Bug: In CRL::NamingScheme::toVhdl(), sort the set<Cell*> models on Ids.
* Bug: In CRL::toVhdlName(), sort the set<Cell*> models on Ids.
* Bug: In CRL::getInstancesCount(), sort the map<Cell*,size_t>
gatesByMaster on Ids.
* Bug: In Katana::Track::addOverlapCost(), check that the overlap is
not *exactly* zero (exact interval fitting), and do not consider
them as obstacle (they where raising the infinite flag when they
where *fixed*).
* 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 CRL Core, etc/180/scn6m_deep_09/technology.conf the minimal
spacing for the metal layers layout were not set, allowing the
router to place VIAs too close to each others. This was generating
either DRC errors or short-circuits.
* 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.