* Bug: In GdsParser::readStructure(), the Gds::Layer_0_IsBoundary flag
was not taken into account. The abutment box was always forced to
the bounding box, resulting in incorrect cell size (and placement).
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).
Formerly, the H-Track could be shifted *relative* to the position of
the center of the RoutingPad. Which may become fragile in case of a
change in the standard cell library. So we create a new feature allowing
to specify the H-track as an offset *from the bottom of the slice*.
Two offset can be specified:
* spares.htreeOffsetDriver : for the main H part, connected to the
driver.
* spares.htreeOffsetSink : for the small parts connecting to every
fours sinks of the tree.
This to avoid those two to overlap. The sink of the "N" stage with
the driver of the "N+1" stage (so input & ouput of the same buffer).
* 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.
* Bug: In LefImport::_macroCbk(), the GDS file must be loaded *before*
we start putting nets & components from the LEF file. The GDS parser
must find an blank slate and not try to modifies nets already
created by LEF.
This way, we really can modify the GDS layout to suit the LEF
statements.
Note that we may end up with two set of terminal exactly overlapping,
a Pad from the GDS and a Segment from LEF.
* Change: In GdsParser::xyToPath(), we were creating articulated layout
segments over contacts using the "all_nets_merged_in_gds" common net.
But some segment may later be promoted to interface, that means
deleting the previous one and re-creating it with the right
external net.
The deletion was automatically creating a rubber between it's two
Contact anchors. And we there is no way to get rid of it (other than
also removing the Contacts).
* New: In helpers.overlay.CfgDefault, new class that can be used to give
a default value to a cached configuration parameter. The default
value will be used as a last ditch fallback and used *only if* no
default value can be fetched from the C++ database (disk).
* New: In LefImport, add setGdsForeignDirectory() to point out from where
to load the extra GDS file in case a FOREIGN directory is present
in MACRO.
Also add support for merging the supply nets. It may happens that
the supply nets have different names in the GDS ("vdd!") and LEF files
("pvdd"), in that case, the LEF name supersede the GDS one.
The GDS file will be loaded *first* then completed by the LEF contents.
Blockage in the GDS file are *not* loaded.
* Change: In GdsParser, perform an early recognition of supply nets. For now
it's hardwired to names starting by "vdd" and "gnd", but should be
parametrized in the future.
Needed for the LefImport to merge, if needed, the power supplies.
In GdsStream::xyToComponent(), skip the blockage if required.
* Change: In LefImport::_pinCbk(), if a pin has "USE POWER" or "USE GROUND"
make it a global signal (previously flagged only "!" appended to name).
* Change: In LefImport::_pinStdPostProcess() do not try to find "on grid"
components for supply nets, just make all their components externals.
* 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().
* New: In LefImport::LefParser, add support for LEF Polygons that are
translated into Hurricane Rectilinears.
* Change: In LefImport::setMergeLibrary(), the default behavior for the
LEF parser is to create a new separate library under LEF/<lib_name>
for each file. But if the various cells are put each one in it's own
cell, this is suitable. So we can now set a library beforehand into
which they will be all put.
* New: in CRL/technos.node180.gf180mcu, configuration files for the
GF180MCU open PDK.
* New: in cumulus/designflow.technos, added a setupGF180MCU_GF() to
initialize the GF PDK.
* 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.