Commit Graph

1829 Commits

Author SHA1 Message Date
EricLaoGitHub 8016157500 Temporary commit to pull and merge last commit. 2016-06-17 16:26:27 +02:00
Jean-Paul Chaput 601e3d3da1 Anabatic transient commit 8. More Dijkstra bugs correcteds.
* Bug: In Anabatic:
    - In _propagate(), on reaching a target, forgot to remove it from
      the queue before pushing it back with the new distance. It also
      simplificate the core algorithm as target as treated normal nodes.
* New: In Anabatic:
    - Update cdebug to use the fastest macro version.
    - More readable drawings of GCells and Edges.
    - Added timer support.
    - The distance is now computed in DbU::Unit (aka long) and not in
      normalized float.
    - The distance function is now a callback (std::function<>) that
      can be changed (a default is provided at initialization).
    - New concept of branch in the agglomerated connex component.
      Each trace back part create a "branch" (tagged with a "branchId").
      When a node is reached with the same distance, but from two
      different branches, choose the the branch that was lastly created.
      This create a slightly different tree which grows outward from
      the newest branches.
    - Makes the horizontal edges *slightly* longer than the vertical ones
      to skew the tree to use vertical edges, as it is usually less
      congested than the horiontal one (due to metal1 cell terminals).
      It is also my understanding that it is useful to reduce the
      number of vias, whithout introducing a via cost.
* New: In Bootstrap:
    - Script sprof.py to perform sprof & demangle libraries execution
      profile.
* ToDo: In Anabatic:
    - Corner optimization. Sometimes when two corners are possible, the
      wrong one is choosen. That is, one of it's edge cannot be used for
      further grow of the tree.
2016-06-17 13:09:34 +02:00
Jean-Paul Chaput 36a982ce47 Merge branch 'devel' into devel_anabatic
Catch up the Lemon removal and cdebug correction.
2016-06-11 21:58:25 +02:00
Jean-Paul Chaput f68ac4d0e6 Argh. cdebug was slowing down the program too much.
* Change: In Hurricane Commons.h, even when cdebug print nothing, it slow
    down the program (three times for Kite!). Create a macro cdebug_log
    which calls cdebug *only* if the debug level is active.
2016-06-11 21:56:12 +02:00
Jean-Paul Chaput d729321091 No more MCF_opt.cxx in Coloquinte. 2016-06-10 22:59:33 +02:00
Jean-Paul Chaput c5a9e0b617 Anabatic transient commit 7. More Dijkstra bugs correcteds.
* Bug: In Anabatic:
    - Activate the searchArea to limit the area explored by the Dijkstra.
      Uses the bounding boxes of the vertexes/gcells instead of the ones
      the RoutingPads.
    - Always detach contacts from the rings in load(), even if the vertex
      is already marked as target.
    - On reaching a target (non-negative connexId), do not forget to update
      the distance to source.
    - In Edges locator, added support for side selection (needed by the
      monotonic feature).
* New: In Anabatic:
    - Hide the atomic Dijkstra methods (made private).
    - Implementation of the monotonic mode in Dijkstra (for bipoints only).
    - Added a separate function for distance computation between two vertexes,
      now take account of the VIAs costs.
2016-06-10 18:27:06 +02:00
Jean-Paul Chaput 23d6ae55fd Solve the overlap in Layers&Go extensions entries.
* Bug: In Hurricane::PaletteWidget, flush the normal widgets before reading
    the position of the Extension entry (from GridBuffer).
2016-06-06 01:07:54 +02:00
Jean-Paul Chaput d9e124797b Anabatic transient commit 6 "Somatoline, ca marche!".
* Bug: In Anabatic:
    - In Dijktra::load(), do not create Contact while looping over the Net's
      components (for RoutingPads).
    - In Dijkstra::propagate(), reset the connexId of reached Vertexes
      on updating the stamp to avoid using connexId from previous runs.
        Push the vertexes on the queue while backtracking (with a distance
      of 0.0). Do not reset the "_from" as we need it in Dijkstra::toWires()
      to know how were the routing is.
    - In Edge::getDistance(), convert to float more early so the normalisation
      do not always end up in zero.
    - In GCell::_add(), when the axis of the new edge is equal to one already
      on the given side, adds it *after* the existing edge and not before.
      (to be coherent with the way GCells are split in two)
    - In GCell::hcut() and GCell::vcut(), create an Edge if is equal to X/Y Max,
      *but* the new chunk is flat. The new chunk is then expected to expand
      "below".
    - In GraphicsAnabaticEngine::drawGCell(), display the id of the GCell in
      a small box at the center of it's bounding box. Nothing displayed for
      flat GCells, to avoid cluttering.
2016-06-05 18:38:09 +02:00
Gabriel Gouvine 77c4277482 Removed (now unused) dependency to Lemon/Coin-OR 2016-06-05 17:29:00 +02:00
Gabriel Gouvine 1a439d1b5d Merge branch 'devel' into fixes3 2016-06-05 17:15:57 +02:00
Jean-Paul Chaput aa20813342 Anabatic transient commit 5.
* Bug: In Anabatic:
    - In Dijkstra/Vertex, use the new Observer for fast access from the GCells.
    - In Dijktra::propagate() loop detection.
    - In Dijkstra, reset the "_from" of vertexes between two propagates on
      the same Net (otherwise: loops...).
    - In Matrix, there must be two different way of calculating an index from
      a position. One for the min, which is rounded to superior. And one for
      the max which is rounded to inferior.
    - In Matrix::updateArea(), checks for invalid indexes.
2016-06-03 17:29:22 +02:00
Jean-Paul Chaput 747027f23a Simplification of the Hurricane::Observer mechanism.
* Change: In Hurricane::Observer, simplification of the template so that
    we can use it directly instead of creating a derived class with an
    implementation of Observer::notify(). Now the implemenation is the
    same for all and just calls a notify() method on the owner object.
      Create a StaticObservable for fast access of the observers. This
    is mainly a fixed size table (array<>) with oberservers at known
    indexes. This way we can go from the obervable to the observer
    owner in one indirect access (or so I hope).
* Change: In Hurricane::CellViewer, use the new observers.
* Change: In Hurricane::ControllerWidget, use the new observers.
* Change: In Hurricane::CellWidget, set the winidow initial size to a
   more sensible 500px.
* Change: In CRL::LibraryManager, use the new observers.
* Change: In CRL::LibraryManager, use the new observers.
* Change: In CRL, in display.conf & technology.conf, modification for
    the ST hcmos9gp capacitors.
2016-06-03 17:19:46 +02:00
Jean-Paul Chaput fac3474d55 Anabatic transient commit 4.
* Bug: In Anabatic:
    - In Edge, materialize was done before the Edge get it's final position.
      Must be invalidated afterwards for the UpdateSession to put him in
      the correct QuadTree.
    - Functional (debugged) Dijkstra skeleton.
2016-05-30 18:52:38 +02:00
Jean-Paul Chaput 1f4d6b7e83 Anabatic transient commit 4.
* New: In Anabatic:
    - A Dijkstra skeleton, not debugged yet.
2016-05-30 11:30:29 +02:00
Jean-Paul Chaput 6ef5819310 In getCapacity(), check for empty intervals. 2016-05-26 18:54:57 +02:00
Jean-Paul Chaput fd692d3978 Use devel_anabatic branch of Coriolis for Chams to build. 2016-05-26 18:42:21 +02:00
Jean-Paul Chaput 4cb3ea7d92 Merge branch 'devel_anabatic' of ssh://bop-t/users/largo2/git/coriolis into devel_anabatic
Contains work of E. Lao on OpenChams (symmetries).
2016-05-26 18:31:30 +02:00
Jean-Paul Chaput d7bd8a4bf4 Anabatic transient commit 3.
* New: In Anabatic:
    - AnabaticEngine now have a valid destructor and a "reset()" method.
2016-05-26 18:30:03 +02:00
EricLaoGitHub 47d832e81b OpenChams::SlicingTree: accessor "getSymmetries()" modified. 2016-05-26 17:59:18 +02:00
Jean-Paul Chaput a4655aec8b Anabatic transient commit 2.
* Change: In Hurricane, in CellWidget, enable the drawing of ExtensionGos
    according to the the threshold paramaters (as layers do).
* Change: In CRL Core, provide DrawingStyle for Anabatic::GCell &
    Anabatic::Edge. Use the exact name of the ExtensionGo.
      In kite.conf, add settings for the size of an edge as the optimal
    size may change between analog & digital designs.
* New: In Anabatic:
    - Support for fast position query using a matrix.
    - Computation of the Edge capacity, based on the routing gauge parameters.
    - Graphic display of the edges capacity. Added configuration
      parameters to size the bounding box of an Edge.
* Bug: In Anabatic:
    - GCell::_moveEdges was both too complex (some cases never arise the
      way we divide GCells) and bugged.
2016-05-26 13:56:16 +02:00
Jean-Paul Chaput 61e9abddbd Anabatic transient commit 1.
* New: In Anabatic, basic support for GCell/Edge creation.
2016-05-23 16:15:25 +02:00
Jean-Paul Chaput f11be897ef Remove Anabatic from cgt. Index numbering in vector slot.
* Bug: In Unicorn, in cgt.py, do not import Anabatic as it is not present
    yet in the devel branch.
* Change: In Hurricane, in Commons.h, in the vector slot template, start
    index at 0 and not 1 (to closer to the internal representation).
* Change: In ExtensionGo, forgotten trace system calls to update.
2016-05-23 16:02:57 +02:00
Jean-Paul Chaput 6fd38e9847 Update the documentation for the traceLevels parameters. 2016-05-17 23:13:11 +02:00
Jean-Paul Chaput 82cff69d9f Complete rewrite of the trace system (now a stream).
* Change: In Hurricane, in Flags add operator overload for "int" type
    and not only "unsigned int". Otherwise the compiler complaints about
    ambiguous overload when using enum values which are considered as
    "int".
      Simpler code for the BaseFlags::contains() method.
      Added implicit conversion from BaseFlags toward bool type.
* Change: In Hurricane, in Commons, complete replacement of the previous
    two trace systems (trace & ltrace) by a stream-based one.
    As it is a true object it is much less fragile than the one based
    on defines (but maybe a little slower).
      Define a reservation table for the trace levels for all the
    Coriolis & Chams components.
* Change: All tools, use the new trace system.
2016-05-17 23:00:06 +02:00
Jean-Paul Chaput 1c7cbbe6f7 Typo in error message raising an exception. 2016-05-06 17:42:05 +02:00
Jean-Paul Chaput babf23f303 Let the init system guess "stratus1.mapppingName" value.
* Change: In Bootstrap, in coriolisEnv.py no longer sets the environment
    variable STRATUS_MAPPING_NAME (guessed by init).
* Change: In CRL Core, in System CTOR sets the default value for
    "stratus1.mappingName" to "not_set" so the init can known it is not
    set.
      In etc/coriolis2/*/stratus1.conf, do not set "stratus1.mappingName".
      In coriolisInit.py, now guess the value of "stratus1.mappingName"
    if it has not already been set by the user. The complete setting
    process is as follow (decreasing priority):
      1. Setup by the user in his ".coriolis2/setting.py".
      2. A "stratus.xml" file is detected in the current technological
         directory (example: etc/coriolis2/65/cmos065/setting.xml).
      3. Fallback value to "etc/coriolis2/stratus2sxlib.xml".
2016-05-06 13:15:10 +02:00
Jean-Paul Chaput d2209579ab Modify the init system to manage NDA restriced configuration files. 2016-05-03 13:32:06 +02:00
Jean-Paul Chaput f2c036ac6d Corrections in C-Python interface required by Analagic (CHAMS).
* Change: In Hurricane, in PyHurricane.h, in all DirectSet*() macros,
    suppress the third parameter giving the function name. It is now
    build from stringification of other parameters.
      The various macros calls are also modificated all througout
    Isobar.
      Added PyAny_AsInt() to convert a Python Int or Long into an int.
    Maybe we should manage only long, because the type difference seems
    ambiguous in Python itself.
* Change: In Hurricane, in PyHurricane.h, in DirectGetBoolAttribute()
    deduce the function name to display in messages from the arguments.
      Idem for DirectIsAFromCStringAttribute(), DirectGetIntAttribute(),
    DirectGetUIntAttribute(), DirectGetDoubleAttribute() and
    DirectGetStringAttribute().
* New: In Hurricane, in PyHurricane.h, new macro DirectGetNameAttribute()
    to build accessors for method returning a Name.
* New: In Hurricane, in PyHurricane.h, new macro DirectSetIntAttribute()
    to build modificators taking int arguments.
* Bug: In Hurricane, in PyHurricane.h, in macro DirectSetBoolAttribute(),
    the check for a boolean PyObject was wrong, leading the macro to
    systematically emit a Python exception.
* Bug: In Hurricane, in PyInstance method table, PyLibrary_create() was
    registered as a NOARGS function, but it *do* have arguments, change
    to VARARGS.
2016-05-01 15:50:27 +02:00
Jean-Paul Chaput 8fc4056a7a Make RF1 support different slice height. 2016-04-24 16:27:38 +02:00
Jean-Paul Chaput 5fba1d2548 In Knik::Vertex, the _flags member was uninitialized.
* Bug: In Knik, in Vertex the _flags attribute was unitialized.
    This flag is, in particular, telling if the vertex is blocked.
    That it was taking a random value, was leading to errors and
    unreproductible behaviors. I hope this will make the global
    router deterministic at last. This problem did show in the
    Stratus FIFO generator.

* Bug: In Knik, in Vertex, remove the unused _boundingBox attribute.
2016-04-22 22:55:26 +02:00
Jean-Paul Chaput 0699fb0a40 In Katabatic, no more segments with one fixed contact only.
* Bug: In Katabatic, in AutoHorizontal::_slacken() when slackening
    from a METAL2 terminal no longer set the terminal still on the
    terminal fixed. Instead use a the new feature of
    CntUserNativeConstraints.
* Bug: In Katabatic, in AutoContact, new flag CntUsernativeconstraints
    so the native constraint box is specified by the user constraints.
      This new possibility is needed because, if a Contact is fixed
    the native constraint box *is* bound to it's current position.
    But if the related segment is not fixed, and moved, it may move
    the Contact with him, loosing the original fixed position.
      Now we can remember the wanted position through the user
    constraints.
* New: In Katabatic, in GCellConfiguration new explicit management
    for 4 globals and one METAL2 (occured for the first time in the
    RAM generator).
2016-04-22 22:43:53 +02:00
Jean-Paul Chaput 96add8871e Make RF1 support different slice height.
* Change: In Stratus1, in dpgen_RF1.py, the slice height was hardcoded
    to 50 lambda (sxlib). Now extract the height on the fly from a
    cell.
2016-04-22 22:08:38 +02:00
Jean-Paul Chaput 09e5784bc4 Bad active width extension on PTRANS/NTRANS in scmos_deep_018.
* Bug: In CRL Core, in scmos_deep_018/technology.conf, the extension
    width in PTRANS/NTRANS active layer was too big. 4.0l instead of
    3.0l. This was preventing seeing gaps in the active layer by cgt.
    They did show up under Graal though...
2016-04-14 21:35:08 +02:00
Jean-Paul Chaput 8328c890bb In Stratus, in dpgen_RAM get cell height from the library.
* Change: In Stratus, in dpgen_RAM, the cell height was fixed to 50l.
    Now read the prech[0] to set up the cell height (useful for MOSIS
    cells).
* New: In Stratus, in buildModel(), the stand alone generator caller
    now support a className, a modelName and a set of parameters to
    pass on to the model. This is very useful when the module name
    (the file), the class name and the model name are not the same.
2016-04-13 18:49:50 +02:00
Jean-Paul Chaput 41609a4bb4 Trace management in Knik. 2016-04-13 18:44:40 +02:00
Jean-Paul Chaput 798d1edb34 Bug corrections in Katabatic & Kite, bad bound index computation.
* In Katabatic, in GCellConfiguration, added support to 3G_2M2 (generic).
* In Katabatic, in GCellGrid, in getUSide() we were not using the correct
    contant set (Constant namespace instead of Kb...) so the size returned
    was always X. It doesn't show if the chip is square...
* In Kite, in Track::getBeginIndex(), if the position requested was enclosed
    in same net segments, we were going one index too far in the "previous"
    direction.
* In Kite, in Track::getOverlapBounds() we where going one index too far
    in the "next" direction while computing the "end" index.
2016-04-13 18:42:55 +02:00
Jean-Paul Chaput 506ccbd589 Correct a security check in PyHurricane.h.
* Bug: In Hurricane, in PyHurricane.h, the macro GENERIC_METHOD_HEAD was
    not checking at all that the underlying Hurricane object was not NULL.
    This may have lead to core-dumps.
2016-04-13 18:30:45 +02:00
Jean-Paul Chaput b46c06042b Added Python support for AllianceLibrary in CRL Core.
* New: In CRL Core, added support for AllianceLibrary.
2016-04-13 18:26:08 +02:00
Jean-Paul Chaput 2a40fa7d92 New "obstacleDw" for Kite.
* New: In CRL Core, in RoutingLayerGauge, adds a new parameter "obstacleDw".
    It represents the distance to add from the *edge* of a blockage segment
    to the next *axis* of a routing track. This was previously computed as
    the pitch minus the mimimum half wire width. This works if the pitch
    is *equal* to the wire width plus the minimal distance (edge to edge).
    But if the wire width is less, than it leads to too great a distance
    around obstacles, making them bigger than they are. And potentially
    blocking everything. To summarize:
         before:  obstacleDw = pitch - wireWidth/2  (deduced)
         after:   obstacleDw = explicitly setup, usually:
                               pitch - max(wireWidth)/2
      Modify the Alliance configuration helper and the various kite.conf
    file accordingly.
* New: In Kite, in BuildPowerRails, make use of "obstacleDw" to compute
    the footprint of a blockage.
2016-04-13 18:21:09 +02:00
Jean-Paul Chaput a4e46444e2 Various problems in the BLIF parser.
* In CRL Core, in BlifParser, when an input terminal of an instance is
    either connected to power or ground, insert a zero_x0 or one_x0
    Cell to avoid direct connection to the supply (the router is not
    able to do it). The names and terminals of the intermediate cells
    are hard-wired for now (to SxLib).
      When merging Nets, always merge internal nets into external ones
    as the other way around is not always legal.
2016-04-04 17:54:09 +02:00
Jean-Paul Chaput d641f236a3 Suppress warnings when flatening a Cell twice.
* In Hurricane, in Cell::flattenedNets(), if the cell has already been
    flattened, do not issue warnings about duplictated flattened nets.
* In Hurricane, in Net, allow Net::setName() to switch the main name
    for an alias without complaining about an already used name.
* In Cumulus, in RSavePlugin.py, when "views" is supplied in keywords
    (kw) arguments, override the default instead of merging with it.
    This is to allow scripts to save exactly what views they want.
2016-04-02 14:47:10 +02:00
Jean-Paul Chaput 6ad644fac2 New relation for slaved ABs. Do *not* delete blockage nets.
* Change: In Hurricane, in DataBase::CellDepths() the recursion stop
    criterion must be Cell::isLeaf() and not Cell::isTerminal() as
    the second one can be used to hide some levels of hierarchy,
    and we want all of them in a blob.
* New: In Hurricane, in Cell, create a new Slaveds relation to keep
    track of all the Cells with a slaved abutment box. This work is
    incomplete as we do not manage the behavior in case of merge or
    Cell destruction or slaving Cells with aready slaveds ones.
      Modify Cell::setAbutmentBox() to work in both autonomous and
    slaved mode.
* New: In Hurricane, in Net, add a new type of Net: BLOCKAGE this
    avoid us to be dependant on the framework pattern recognition.
    (change propagated to the Python support)
* New: In CRL Core, in the various drivers, recognize blockage nets
    as such and set their type accordingly.
* Change: In CRL, in Toolbox::deleteEmptyNets(), preserve blockage
    Nets. This was the cause of crashs in Kite::BuildPowerRails() as
    we where trying to use a deleted blockage net...
* Bug: In Hurricane, in NetAlias, do not write NetAlias as a name
    but as a type. They were not read back and moreover staying in
    the JSON parser stack.
2016-03-30 17:47:00 +02:00
Jean-Paul Chaput bbab2d14eb Bug, uniquification of unique cells.
* In Hurricane: In Instance::slaveAbutmentBox() and Instance::uniquify()
    use isUnique() instead of isUniquified(). This way we do not clone
    masterCells that are unique in the design. This was the reason
    sometimes "holes" were appearing in the visualiser, as the AB were
    not merged. The uniqification policy may need some refinement.
2016-03-27 17:13:30 +02:00
Jean-Paul Chaput a78882fd5b Clocks in BLIF parser. In RSavePlugin, flags to select views to save.
* Bug: In CRL Core, in BlifParser, recognize clocks (Alliance patterns).
* Change: In Cumulus, in RSavePlugin, "kw" manage a new "views" to
    specify which views must be saved. Physical by default, but sometimes
    we need logical as well. If the design contains uniquified cells,
    save the logical view.
      In ClockTree, abort the clock tree building if the design has no
    top level clock.
* Change: In Katabatic, in GCellTopology, adds 2G_5M1 configuration.
* Bug: Kite, in BuildPowerRails, if we are not in a chip the nets
   composing the H-Tree must be protecteds be blockages.
2016-03-26 11:59:32 +01:00
Jean-Paul Chaput b5d3a2ec3c Update JsonReader for the latest RapidJSON. Doc rebuild.
* Change: In Hurricane, in JsonReader::HurricaneHandler, add RawNumber().
    Don't know what kind of data it parses, so for now if it's called,
    just issue a warning.
* Bug: In documentation, in UsersGuide, add dependencies on doc_HTML and
    doc_LaTeX so they are rebuild if the source files changes.
      Some modifications to work with our new installation of TeXLive 2014.
2016-03-22 15:38:26 +01:00
Jean-Paul Chaput 1ef4bc122f Forgot to catch Bug exception. GCell manage 5 terminals of a Net.
* Bug: In Hurricane, in HApplication, ExceptionWidget ans PyHurricane.h,
    forgot to catch the Hurricane::Bug exception which was leading to
    terminate() without explanations.
* Change: In Katabatic, In GCellTopology, now support one GCell with
    five metal1 terminal of the same net. This unlikely configuration
    did appear in the SNX for the first time...
2016-03-17 16:54:53 +01:00
Jean-Paul Chaput 13c3efdefd In Katabatic, the layer assignment move up part of Net trunks.
* In Katabatic, in AutoSegment::canMoveUp(), adds the ability to reject
    the move up if the density of the depth we comes from is below 0.6
    in all the GCells, activated with the KbChecklowDensity flag.
* In Katabatic, In LayerAssign, new method moveUpNetTrunk2() which,
    unlike the previous one, move up only the part of the Net trunk
    which is connex to the seed segment. Use the canMoveUp with
    low density checking to avoid unbalancing higher metal layers.
* In Kite, in SegmentFsm, use the canMoveUp() with low density checking.
2016-03-15 18:06:43 +01:00
Jean-Paul Chaput da60370b60 Various bugs in the virtual flattening mechanism (part 2).
* Bug: In Hurricane, in Cell_HyperNetRootNetOccurrences::Locator, must
    also check that the current Net is not a DeepNet in the constructor.
    Take the occasion to prune Net that are automatic.
* Change: In Hurricane, in DeepNet::_createRoutingPads(), check for
    already created RoutingPads. That is, the DeepNet must not have
    RoutingPad components or Segments components.
2016-03-15 17:55:48 +01:00
Jean-Paul Chaput b9da9531a7 The VHDL driver must not rename Cell/Instance/Net names.
* Change: In CRL Core, the Alliance VHDL (vst) driver was renaming the
    names of Cells, Instances and Nets into their VHDL conterparts.
    But if we still work on the Cell after saving it, the Net renaming
    will cause touble, especially when there are DeepNets. The name
    of the DeepNet is generated from the Occurrence name with the dot
    separator which is *not* a VHDL valid character for name, thus
    after that the DeepNet name has changed it cannot be reassociated
    with the Occurrence path. This was causing double-flattening issues.
2016-03-14 01:01:21 +01:00
Jean-Paul Chaput 33355f0e54 Various bugs in the virtual flattening mechanism.
* Bug: In Hurricane, in Cell::flattenNets(), addition to the topHyperNets
    vector was done *inside* the components loop, resulting in multiple
    additions of the same top net. This was leading to the RoutingPads
    created multiple times on the same connectors. Hence the conflict in
    KiteEngine::protectRoutingPads().
* Change: In Hurricane, in Cell::flattenNets(), do not create RoutingPads
    or build rings on already routed Nets. A Net is considered already
    routed if it has at least one Segment. This way we avoid Rubbers to
    be drawn over routed Nets.
* Change: In Hurricane, in DeepNet, do not build RoutingPads & rings on
    already routed Nets (same condition as in Cell::flattenNets()).
* New: In Hurricane, in HyperNet, new collection of all component
    occurrences of an HyperNet. May or may not (default) include
    components from the leaf cells.
2016-03-13 19:35:56 +01:00