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.