1. 23 Jan, 2023 1 commit
  2. 19 Jan, 2023 2 commits
  3. 18 Jan, 2023 4 commits
    • Jean-Paul Chaput's avatar
      Fix overlap of non-used RoutinPads in VH,2RL styles. · 96fe367c
      Jean-Paul Chaput authored
      * New: In KatanaEngine::digitalInit(), when using a "VH,2RL" style,
          protect all RoutingPads of each net, because unlike "2RL+" style,
          the standard cell RoutingPads are not in a "below" layer only
          used inside the cell, but on the V layer. So the area of the RP,
          even if not fully used to connect, must be protected.
      * Change: In NegociateOverlapCost(), when computing cost from a fixed
          or blockage, do not set the infinite flag if it's the *same* net.
      * New: In KatanaEngine::protectRoutingPads(), add a new "flags" argument
          to pass on whether we want to protect the the RP candidates or just
          the non-used ones.
      * Change: In protectRoutingpad(), change the formula (again) to compute
          the berth to give to a fixed segment... Should really try to
          summarize all the case.
      * Change: In TrackFixedSegment::getNet(), no longer return the blockage
          net if the real net is tagged as clock.
    • Jean-Paul Chaput's avatar
      Wrong computation of the up/down dogleg layer for 2 layers gauges. · 047bf149
      Jean-Paul Chaput authored
      * Bug: In Anabatic::AutoHorizontal::_makeDogleg(), the up/down flag
          was incorrectly computed when the RoutingGauge RL where not the
          lower one. This was leading to making doglegs in non-routable
          layers (but present in the gauge for other purposes).
    • Jean-Paul Chaput's avatar
    • Jean-Paul Chaput's avatar
  4. 14 Jan, 2023 8 commits
    • Jean-Paul Chaput's avatar
    • Jean-Paul Chaput's avatar
      Support for non-stacked VIAs in Katana. · 9df5fc83
      Jean-Paul Chaput authored
      * New: In Katana::Configuration, added option:
          "cfg.katana.disableStackedVias" (default to false), so the router
          do not stack VIAs on top of each other.
      * Bug: In NegociateWindow::loadRoutingPads(), create TrackMarkers using
          the right depth when the gauge starts with non-routable ones.
      * New: In Track::addOverlapCost(), when disableStackedVias is active,
          uses the markers from the below terminals to tag the cost as
          "infinite", so the track *cannot* be used by the marker's net
          owner. Can be refined by checking that we are not at a segment's
          end but will do for now.
    • Jean-Paul Chaput's avatar
    • Jean-Paul Chaput's avatar
    • Jean-Paul Chaput's avatar
      Re-enable and check the building of I/O ring with pad spacers. · 181b2e10
      Jean-Paul Chaput authored
      * New: In cumulus/block.bigvia, add a getBoundingBox() method.
      * New: In cumulus/block.configuration.GaugeConf.rpAccess(),
          add a vertical strap segment in case the RP is not high enough to
          accomodate the potential offset of the contact.
            In case of gauge with only two routing layers, if the RP
          is vertically accessed, do not put a VIA12 but just a METAL2
          contact (there will be *no* turn).
      * Change: In cumulus/chip.CoreWire.drawWire(), the wire at *chip level*
          going to the pad was shrunk of 3 pitch when *not* in the preferred
          routing direction. Removing it as it creates gaps in some cases.
            This was likely needed for a specific kind of I/O pad so should
          be re-enabled on targeted cases in the future.
      * Change: In cumulus/chip.corona.VerticalRail, manage in a smarter way
          the conflicts when a rail is accessed from both sides overlapping
          on an Y position. That is, from the supply I/O pads *and* from the
          *core* supply lines.
            Formerly, we just didn't connect the core power line, which was
          a mistake potentially leaving power rails unconnected (it it did
          occur on both sides).
            Also checks if the conflict really arise, that is, the power lines
          are both on top or bottom.
      * Change: In cumulus/chip.pads.Side._placePad(), manage I/O pads with
          a bottom left corner of abutment box *not* at (0,0). Argh!
      * Bug: In cumulus/chip.pads, create the filler pad instances in the
          chip, not in the corona.
    • Jean-Paul Chaput's avatar
      Add at least one pitch to each cell in BloatChannel profile. · 0e17b916
      Jean-Paul Chaput authored
      * Change: In Etesian::BloatChannel, when two DFFs are side by side, if
          they are not separated by at least one pitch, the track avoid
          mechanism will not be able to work. Hence the minimal one pitch.
    • Jean-Paul Chaput's avatar
    • Jean-Paul Chaput's avatar
  5. 09 Jan, 2023 2 commits
  6. 07 Jan, 2023 5 commits
  7. 05 Jan, 2023 1 commit
    • Jean-Paul Chaput's avatar
      Add support for layers alias names. Bug in _addPhysicalrule(). · 2501688d
      Jean-Paul Chaput authored
      * 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
      * In CRL/helpers.analogtechno, add an addDevice() function to load
          analogic devices descriptors (copied from ...
  8. 02 Jan, 2023 3 commits
  9. 31 Dec, 2022 3 commits
  10. 16 Dec, 2022 3 commits
  11. 13 Dec, 2022 1 commit
    • Jean-Paul Chaput's avatar
      Support for avoidance of vertical tracks in low metal techs. · ca41dbd5
      Jean-Paul Chaput authored
      * 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'
      * 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.
  12. 26 Nov, 2022 2 commits
    • Jean-Paul Chaput's avatar
    • Jean-Paul Chaput's avatar
      Clean parameters for routing topologies. Improved 2RL- support. · c131e7a9
      Jean-Paul Chaput authored
      Previously, the relevant NetBuilder and routing strategies where
      directly guessed from the RoutingGauge traits. This is no longer
      doable as the combinations increases. Now to configure both the
      global and detailed router we need three "parameters" :
      1. The routing gauge itself (tells which layers are in which
         directions) and how to make the VIAs.
      2. The NetBuilder to use, they are identified by strings.
         Currently we support:
         * "HV,3RL+", for all SxLib derived standard cells.
         * "VH,2RL", for hybrid routing (over the cell, but terminals
           are also in the first RL).
         * "2RL-", for strict channel routing.
         * "VH,3RL+", an attempt for FreePDK 45, not optimized enough
           to be considered as usable.
      3. The routing style, mostly affect the way the GCell grid will be
         * VH      : first RL is V.
         * HV      : first RL is H.
         * OTH     : Run in full over-the-cell mode (needs at least 3RL).
         * Channel : Run in *strict* channel routing mode (no routing over
                     the standard cells).
         * Hybrid  : Create channels, but can use H tracks over the
                     standard cells.
      Thoses three parameters are partly overlapping and must be sets in
      a consistent manner, otherwise strange results may occurs.
      * New: CRL::RoutingGauge::getFirstRoutingGauge(), to get the lowest
          layer available for routing (not a PinOnly, not a PowerSupply).
      * Change: In CRL::RoutingGauge::isHV() and isVH(), were previously
          always returning false when the gauge was 2RL only. Now, check
          on the first usable RL.
      * Bug: In cumulus/plugins.block.configuration._loadRoutingGauge(),
          there was a bad computation of the deep RLs when the top layer
          was not defined. Occured for 2RL gauges only.
      * Bug: In Anabatic::RpsInRow::slacken() (LayerAssign), forgotten curly braces
          in the test to skip METAL2 terminals.
      * Change: In Etestian::BloatChannel::getDx(), adjust the bloating
          policy to converge on Arlet6502. Always ensure that there is
          a 50% ratio between terminal used V-tracks and free ones.
            If there is more than 80% of terminals, add one more track.
      * Bug: In AnabaticEngine & KatanaEngine, KatanaEngine is a derived
          class of AnabaticEngine.  They uses Anabatic::Configuration
          and Katana::Configuration that also derives from each other.
          I though I had made one configuration attribute in the base
          class that was using the right Configuration. But no. I did
          have two configurations attributes, one in AnabaticEngine and
          one in KatanaEngine, the later "shadowing" the former. As a
          results, parameters modified in AnabaticEngine, *after* the
          initial creation of the tool *where never seen* at Katana
          level (due to it's own duplicate). What a mess.
            Now there is only one attribute in the *base* class Anabatic,
          which is created through a new virtual function _createConfiguration()
          called in _postCreate() which allocate the right Configuration
          according to the dynamic type of the tool (KatanaEngine).
            In KatanaEngine, access the configuration through the
          attribute (_configuration) and not the accessor (getConfiguration()).
      * Bug: In KatanaEngine, no longer directly use the _configuration attribute
          (which is not accessible anyway) but the getConfiguration() accessor.
          The accessor perform a static_cast from the Super::getConfiguration()
          into Katana::Configuration.
            Complete cleanup of the various configuration accessors.
      * New: AnabaticEngine::setupNetBuilder(), perform an early check
          of the requested NetBuilderStyle. The NetBuilderStyle is just a
          string that will be matched against the (hard-coded) supported
          NetBuilders. Then check the topological characteristics against
          the capabilities of the gauge (HV, VH and so on).
            Still a bit too hard-coded for now.
            This function has been split from AnabaticEngine::_loadGrByNet().
      * Change: AnabaticEngine::isChannelStyle() renamed from isChannelMode().
      * New: In Anabatic::Configuration, two new attributes to select the
          topology and routing style:
            - _netBuilderStyle to explicitely select the NetBuilder to use.
              It's a string, which is provided by each NetBuilder.
            - _routingStyle to define how the overall routing will work.
              It's a set of flags (StyleFlags):
      	* VH      : first RL is V.
      	* HV      : first RL is H.
      	* OTH     : Run in full over-the-cell mode (needs at least 3RL).
      	* Channel : Run in *strict* channel routing mode (no routing over
      	            the standard cells).
      	* Hybrid  : Create channels, but can use H tracks over the
      	            standard cells.
      * New: In anabatic/Constants, add StyleFlags to define how the router
          should operate (see above).
      * Bug: In Anabatic::GCell, in CTOR, no reason to set up the HChannelGCell flag.
      * Bug: In Anabatic::GCell::updateDensity(), when computing layers non contiguous
          saturation, do not systematically skip RL 0, but only if it's PinOnly.
      * Change: In Anabatic::NetBuilder, rename isTwoMetal by isStrictChannel.
      * Change: In Anabatic::NetBuilderHV, rename doRp_AccessNorthPin() in
          doRp_AccessNorthSouthPin(). More accurate.
      * Bug: In NetBuilderHV::_do_1G_xM1_1PinM2(), the wires to connect the M1
          terminals where created *twice*. Uterly stupid, there where placed in
          overlap by the router!
      * New: In AnabaticEngine, new accessors to the NetBuilderStyle and
          RoutingStyle, proxies towards Configuration.
      * Bug: In Manipulator::relax(), if there are two doglegs to be done, but
          they are in the same GCell, only do one (the conflicting interval)
          is short.
      * Change: In Katana::Session, rename isChannelMode() into isChannelStyle().
      * Change: In TrackSegment::isUnbreakable() and isStrap(), return false
          when the base segment is a *weak global* (aligned with a global one).
      * Change: In Katana::Row::createChannel(), correctly distinguish between
          *strict channel* style and *hybrid* style. Tag the GCells as std cells
          row or channels only in the former case.
  13. 15 Nov, 2022 2 commits
  14. 07 Nov, 2022 1 commit
  15. 03 Nov, 2022 1 commit
    • Jean-Paul Chaput's avatar
      Adjustments in AutoSegment::canReduce() and TrackSegment::canRealign(). · ecda00e1
      Jean-Paul Chaput authored
      * Change: In AutoSegment::canReduce(), allow reduction, when in channel
          mode, for bottom connected jumpers at depth 1. Forbidden otherwise
          as it may cause problems with the terminals (in OTC).
      * Change: In TrackSegment::canRealign(), allow realignement of reduced
          segments. What really needs to be checked is that it do not have
          perpandiculars in reduced state.
  16. 02 Nov, 2022 1 commit
    • Jean-Paul Chaput's avatar
      Add a second repair stage after the realing stage of the router. · 15412317
      Jean-Paul Chaput authored
      * New: In Katana::NegotiateWindow::_negociate(), if the realign stage is
          enabled, perform a second stage of repair after it. To do this we
          need to reverse the state of events marked as FailedRepair to Repair.
            We isolate the repair stage in a new dedicated function,
          NegociateWindow::_negociateRepair(). Maybe should do the same for
          each other negociate stage.