Even when we were creating Contacts of null width or height, they where
bumped to the minimal size by the constructor, hence bits sticking out
at the end with Gds PATHTYPE 4. Now, allow null size for non-composite
(which contains a cut) and non-cut Contacts.
* Fix: In GdsParser::readStructure(), always use the bounding box as
abutment box if the later is empty (case of small sub-components).
This was making the sub-component seemingly diseapear in the
viewer...
* Fix: In GdsParser::xyToPath(), slight change in xadjust & yadjust.
* Change: In Contact::create(), force the contact width and height to
the minimal size *only* if it's a composite layer *or* a basic layer
of "cut" material.
In order to better handle colliding cell names coming from multiple
GDS files, now, if a topCell is defined, create a sub-library with
the name of that top cell and put any other model from *that* GDS
file into it. This way, only the top cell will be shown in the
library and sub-cells with common names will be separateds.
Work needed for loading GF180MCU I/O pads.
* New: In Gds::setTopCellname(), specify the name of the top cell
we specifically wants to load from the GDS file.
* New: In GdsStream::getCell(), function to find/create a Cell in
the current library and, if any, the "top cell" dedicated
sub-library.
* Change: In GdsStream::readTextBody(), if the layer material of
the label is "other", do not create a Net with the name of
the label. This should be a pure text label. Use the new
Hurricane::Text Go for that.
Compute the text box in a approximative way. Have to make
it smarter in the future.
* Change: In LefImport::_macroForeignCbk(), change of policy for
loading associated GDS. First, we look if a cell with the
right name exists, in which case we use it. If not, *only*
then, do we try to load from GDS.
This allows to load by ourselves, in a separate way the
GDS. This is more flexible when there are naming issues.
* New: Hurricane::Text Go class, to display text label without the
need of a Net.
* New: In Hurricane::CellWidget, add support to display
Hurricane::Text. Add a new mode to drawDisplayText() : FillBox
so the text is resized to exactly fill the box it is in
(in width).
* Switch back to a generated version of the documentation.
Dependencies for the documentation generation have been added to poetry.
As Pelican is a Python tool, that makes sense.
Note to myself: To generate the doc with ccb.py we *need* to be inside
the Python virtual env generated by Poetry. Instead of
relying of a default one, provide one of our own
(coriolis-venv) and make poetry run in it.
* Top builder.py now generated the doc.
* Forgot to remove generated PDFs in the documentation.
* A bit of cleanup on the README.rst
* Forgot the logo. Try to use code-block directive in README.
* Still typo in the logo path.
* One more trial at setting the image position.
* OK. That's enough for the logo.
* Problems with code-block.
* Voila!
* Build inside a venv and use poetry in the top level Makefile.
* Remove doxygen generated docs.
* More doc cleanup in oroshi.
* New: In boostrap/FindBootstrap.cmake, add a macro setup_qt() to
share Python detection across the various tools.
This macro takes into account the USE_MANYLINUX variable to
slightly change the Python detection. On a "normal" system we
look for "Development" (search for dynamic libraries) while under
manylinux we look for "Development.Module"(static linking).
* Change: In bootstrap/ccb.py, add a new option --manylinux.
* Change: Cleanup in the various CMakeLists.txt to use setup_qt().
* Change: In Occurrence::getCompactString(), when the path is void,
still display a double colon (::) instead of just one so we know
for sure that the it is void.
Note about the managment of VIA & cuts: Components using a layer which
is a ViaLayer, that is one containing more than one BasicLayer,
multiple tiles are created in QueryTiles::goCallback().
Components that have a single BasicLayer of "cut" material will
also have their multiples tiles created in QueryTiles::goCallback().
Rectilinear components will have their multiples tiles created
in Tile::create(). Tile::create() return not all the tiles but the
one used as root (for the union find).
* New: In SweepLine::_buildCutConnexMap(), when using a "cut" layer
in a standalone way, and not as part of a ViaLayer, we do not
automatically know to which layer above & below they are connected.
We build a table for each cut layer, based on the ViaLayer,
to know all tops & belows layers they connect (this is cumulative,
in the case of "cut" towards the substrate).
Then in Tile::create(), we not only create the tile for the "cut"
but also in thoses connected layers (and link them in the union
find).
* New: In Tile::create(), when we encounter a Rectilinear, break it
into rectangles and make as many tiles. All tiles linked to the
same root in the union find.
* Bug: In Hurricane::Rectilinear, ambiguous specification of the set
of points defining the shape. I did suppose that the start and and
point where not the same the last edge being between them.
But if FlexLib, it uses the GDSII inspired convention where the
first and last point must be the same, to indicate a closed contour.
This difference was not causing any difference with the drawing,
but it was a problem for getAsRectangle(). This was creating a
"false" extra vertical edge leading to a bigger rectangle.
And this, in turn, was making "false" intersections in the
tiling/sweepline of the extractor.
Add a more thorough checking of the points vector.
* New: Rectilinear::asRectangles(), decompose the Rectilinear into a
set of non-overlapping rectangles sliced vertically.
This not a mathematical minimum set. But should be speedier.
Done using a sweepline processing the vertical edges.
Specially suited for use in the extractor which basically
manage only rectangles.
Simple algorithm described in pp. 9-11 of Extractor notebook.
Tests done with unitests/python/test_rectilinear.py, the
Rectilinear here should cover all the sweepline cases.
* Bug: In Interval::intersect(), bad condition check in strict mode.
* Change: In Occurrence::operator<(), change the sorting criterions
so that the ones with no paths are "lower", then the one with
no entities, then compare entities Id then Path hashes.
* Change: In Occurrence::getCompactString(), to be more readable,
suppress leading and ending "<>".
* Change: In IntervalTree, now use an IntervalDataCompare to control
the ordering of the nodes inside the tree. This may be needed
when IntervalData is build upon a pointer, we don't want to
sort on pointer values (non deterministic) .
* Bug: In IntervalTree::postRemove(), there was an incorrect computation
of the updated childsVMax.
* Bug: In IntervalTree::beginOverlaps(), miscalculated leftmost
interval overlapping.
* Bug: In RbTree::remove(), when exchanging the removed node for a
leaf, fully swap the nodes contents, was incompletly copied before.
* New: In CellWidget, add new slots selectSet(OccurrenceSet&) and
unselectSet(OccurrenceSet&), to be able to select/unselected sets
of Occurrence (for use by TabEquipotentials).
* Change: In EtesianEngine, no more need to remove leading/ending "<>".
* New: In Tramontana, use a Query to find all the Occurrence under
an area. Previously we were using Cell::getOccurrencesUnder()
which *do not* return the components in instances, so we would
have been unable to find trans-hierarchical shorts circuits.
* New: In tramontana, now use a Relation to tag all the components
belonging to an Equipotential.
* Change: In Equipotential, store everything under the form of
Occurrence, instead of Components. Due to the way the Occurrences
are sorted, the one holding Components should be firts.
* New: Interval::CompareByMinMax, lexicographical comparison of
Intervals, first compare the lower bound (VMin) then the
upper bound (VMax). Needed for IntervalTree.
* Change: In IntervalTree, the key comparison was only based on
the lower bound (VMin). That means that the tree would accept
only one interval for a given VMin. You couldn't store both
[1:4] and [1:5]. Now use CompareByMinMax that allows it.
* New: In Component, typedef ComponentSet (set sorted on Ids).
* New: CellWidget::selectSet() & CellWidget::unselectSet() select/unselect
a whole set of component.
* Change: In bootstrap/cmake_modules/FindBootstrap.cmake, add a
"-Wl,--no-undefined" to the C++/ld flags to force checking of
undefined symbol at link time.
* Move all Python stuff under a common Python namespace "coriolis".
* Instead of having a series subtrees for each tool, integrate
everything in one common tree. So now, all components can be
located either with an absolute path from "coriolis" or, inside
cross-reference themselves through relatives imports.
* As a consequence, we only need to add ".../site-packages/coriolis/"
to the PYTHONPATH, and not a whole bunch of subdirectories.
And nothing, if installed in-system.
* The tree of free technologies configuration files is also moved
below "coriolis/technos" instead of "/etc".
* Supressed "cumulus" level for the plugins.
* All python modules are rewritten using relative imports except
for the configuration files that uses absolute import as they
can be cloned outside of the tree to serve as templates.
* Change: In boostrap/FindPythonSitePackages, include "/coriolis" in
Python_CORIOLISARCH and Python_CORIOLISLIB.
Provide a Python_SITELIB *without* "/coriolis" appended.
* Change: In cumulus/plugins/__init__.loadPlugins(), must prefix modules
read in the plugins directory by "coriolis.plugins.". No longer need
to add their path to sys.path.
* Change: In crlcore/python/technos/nodeX/*/devices.py, the scripts of
the layouts generators must be prefixed by "coriolis.oroshi.".
* Change: In CRL::System CTOR, no longer add the pathes of the various
plugins to sys.path. Only "site-packages/coriolis/".
* New: In Utilities::Path::toPyModePath(), new method to convert a
filesystem path into a python module path.
Examples:
"coriolis/plugins/block" --> "coriolis.plugins.block".
"coriolis/plugins/rsave.py" --> "coriolis.plugins.rsave".
* Change: In katanaEngine::_runKatanaEngine(), rename the hook script
initHook.py. No longer need to modify sys.path.
* Change: In BoraEngine::_runBoraEngine(), rename the hook script
initHook.py. No longer need to modify sys.path.
* Change: In UnicornGui::_runUnicornInit(), rename the hook script
initHook.py. No longer need to modify sys.path.
* Change: In cumulus.plugins.chip.constants, put the constants
outside __init__.py to avoid a loop at initialization.
* New: In Technology, in order to support symbolic technology on top
of a real technology using non-generic layer names, it comes in
handy to be able to define layer alias names. Generic *real*
layer names could be defined as alias over the technology
specific ones. Then, we can build the symbolic layers upon
the generic names (so *that* part of the init code can be
shared between techs).
Adds Technology::addLayerAlias()
The semantic of Technology::getLayer() changes a little, it
return the techno layer associtated to the name *or* the
aliased name.
* Bug: In Technology::_addPhysicalRule(), in case of a rule redefinition,
we were using it's name *after* the deletion of the rule object.
Nasty crash.
Improve the error message by giving the name of the conflicting
rule.
* In CRL/helpers.analogtechno, add an addDevice() function to load
analogic devices descriptors (copied from the old init system).
* In CRL/ApParser, if an exception is catched, tells in which file and
line it did occur.
* In Oroshi/dtr.Rules, add a translation step to get the rule names
from the technology. From generic names to actual technology
layer names.
Add some documentation.
* In Oroshi/stack.Stack, get the layers names through dtr.Rules to get
the layers names translated.
* Change: In Etesian::SubSlice::getUsedVTracks(), now take blockages
into account for used vertical tracks.
* Bug: In Etesian::SubSlice::avoidTrack(), right free interval for
shifting was wrongly computed, effectively allowing *any* shift.
This was creating cells overlap!
* New: In Hurricane::BasicLayer & Layer, establish a two way link
between the blockage layer and routing layer. Now we can access
the routing layer from the blockage.
* New: In NetBuilderHybridVH::_do_1G_xM1_1PinM1(), added configuration
to manage pins on the north/south sides for VH,2RL.
* Bug: In NetBuilderHybridVH::doRp_xG_xM1_xM3(), correct misplaced
vertical creation (buildind invalid topologies).
* New: EtesianEngine::toColoquinte(), display histograms of the cells
widths (in pitch) before and after bloating to get a better feeling
of the behavior.
* New: In EtesianEngine, add support for track avoidance. Portions of
tracks to avoid are specified by a Box, which should flat and on
the axis of the request track. This feature is used by the H-Tree
to clear the vertical tracks under the tree from any terminal.
* New: In Etesian::Area, Slice and SubSlice, add support for track
avoidance. Exported to the Python wrapper.
* New: SubSlice::getUsedVTracks() to get a set of tracks blocked by
the cell.
* New: SubSlice::trackAvoid(), shift left/rigth the cell under the
requested vertical track. Try only to move the cell under the
track and not it's neighbor, so it assume that there is sufficient
space left or right of the cell.
* Bug: In cumulus/plugins.block.configuration.BlockConf, the Cfg
parameters may be read too early from the Cfg space into the
various sub-conf objects (like FeedsConf). Delay the reading
of the parameters in a _postInit() functions.
Modify Block and CoreToChip to call _postInit().
* New: In cumulus/plugins.block.configuration.BlockConf._loadRoutingGauge,
allow the cell gauge name to differ from the routing gauge name.
* New: In cumulus/plugins.block.configuration.FeedsConf, allow to
select the default feed to be used with 'etesian.defaultFeed'
parameter.
* New: In cumulus/plugins.block.spares.BufferPool, allow to control
whether or not we want tie to either side of the pool.
(for latch up).
* New: In cumulus/plugins.block.HTree._connectLeaf(), add support
for track avoidance.
* Bug: In cumulus/plugins.block.HTree._connectLeaf(), the TL2 contact,
the one on the *top* auxiliary buffer seemed to have been badly
positioned until now (too low, not using tl2Y).
This is strange because it should have caused disconnections,
but I didn't see it in the wiring and the regressions tests didn't
flag anything wrong. Still a bit weird and worrying.
* New: Hurricane::ErrorWidget, new widget exported to Python to replace
helpers.io.ErrorWidget.
* New: Hurricane::AboutWindow, new window exported to Python to replace
cumulus/plugins.aboutwindow.AboutWidget.
* New: In Hurricane::RoutingPad, added support if the supporting component
is a Pad. The source/target positions are computed according to the
most likely direction.
Change the _getEntityAsComponent() function into an inline template
_getEntityAs<T>().
Change the flags from an enum to static const uint32_t.
* Change: In Anabatic::Configuration, use _getEntityAs<T>.
* Change: In Anabatic::Dijkstra, use _getEntityAs<T>.
* Change: In Anabatic::NetBuilder, use _getEntityAs<T>.
* Change: In Katabatic::LoadGrByNet, use _getEntityAs<T>.
* Change: In Katana::ProtectRoutingPads, use _getEntityAs<T>.
* Change: In Bora::AnalogDistance, use _getEntityAs<T>.
* Change: In Etesian::EtesianEngine, use _getEntityAs<T>.