1. 26 May, 2022 2 commits
    • Jean-Paul Chaput's avatar
      Correct misaligned contact in heavy load H-Tree. · 19504ad6
      Jean-Paul Chaput authored
      * Bug: In cumulus/plugins.block.htree.HTree._connectLeaf(), the stacked
          contact to connect the top left buffer amplifier was not forcibly
          aligned on the vertical METAL5. In some configuaration it was
          leading to gaps at METAL5 level.
    • Jean-Paul Chaput's avatar
      Bug in AutoSegment::getEndAxis() computation. · 5b469e45
      Jean-Paul Chaput authored
      * Bug: In AutoSegment::getEndAxes(), as the NonAligned flag may be
          wrong, always loop over the aligneds (if any). Then, the
          target axis computation was wrong, using a min() instead of
          a max().
            This was, in turn, wrongly activating isNearMinArea() and
          causing non-minimal length segment to have their extremeties
          extented. And, in the end, Track overlap.
  2. 25 May, 2022 2 commits
    • Jean-Paul Chaput's avatar
      Remove unconnected part of the nets after HFNS. · 2efae350
      Jean-Paul Chaput authored
      This was the reason why we, sometimes got "UNCONNECTED" errors in the
      VHDL PORT MAP statements. This was the remnants of the originally
      connected driver.
      * Bug: In Etesian::BufferTree, as the root driver is disconnected from
          all the sinks, but the top tree buffer, we may end up with
          unconnected signal on instances that were using it.
            So now, call BufferTree::rcleaupNet() to remove the Net in
          the Cell that where used to "transmit" the original driver.
      * Bug: In Etesian::BufferTree, no longer use a _isDeepNet attribute
          guessed from the occurrences pathes of the RoutingPad, but
          trust the Net::isDeepNet() method.
    • Jean-Paul Chaput's avatar
  3. 23 May, 2022 1 commit
    • Jean-Paul Chaput's avatar
      Add management for very rare segment cross blocking (ripup loop). · c17c4c3f
      Jean-Paul Chaput authored
      * New: In Katana::DataNegociate, add a "sameRipup" counter to keep
          the *consecutive* number of time a segment is put in the same
      * New: In TrackSegment::setAxis(), update/reset the "sameRipup"
          counter of the DataNegociate.
      * New: In TrackCost, add new flag "Blacklisted" to mark Tracks that
          have been riped up too much in a consecutive row.
            TrackCost::Compare::operator() will then sort the blacklisted
          track after the non-blacklisted ones.
      * New: In SegmentFsm CTOR, raise the Blacklist flag on the TrackCost
          if the "sameRipup" is above 10. This to get away from a state
          well in the ripup.
  4. 21 May, 2022 5 commits
  5. 18 May, 2022 1 commit
    • Jean-Paul Chaput's avatar
      General review & redesign of the "minimum area checking" for segments. · 42bf5d29
      Jean-Paul Chaput authored
      * Change: In AutoHorizontal::setDuSource() & ::setDuTarget() (& AutoVertical),
          check that the requested "du" is less than a pitch (this is not an
          upper bound). Issue a warning if not true.
      * Change: In AutoSegment::revalidate(), when passing the previous span
          interval to expandToMinLength(), if we are in creation stage, make
          it empty because it has no sense yet and can lead to a lock in a
          too narrow span.
            Change the coupled behavior of expandToMinLength() vs.
          unexpandToMinLength(), the call to "unexpand" will be done on
          AutoSegments that are flagged with SegAtMinArea, instead of
          using the return value of "expand". This way we control across
          multiple revalidate() if a segment can be "unexpanded".
      * Bug: In AutoSegment::expandToMinLength(), not only try to shift left
          if we are beyoond the max bound but also to the right if we are
          below the min bound.
            the span on the target and source were miscalculated, we must
          add the half-minimal distance to get the span inside the Track.
      * Change: In AutoSegment::isMiddleStack(), rename into isNearMinArea()
          as we check for any *small length* set of AutoSegments and not
          only the one part of a middle stack. In some rare instances,
          two aligned segments can nevertheless be too short.
      * Bug: In AutoSegment::reduceDoglegLayer(), when finding a reduced
          segment also reset it's duSource & duTarget because it will
          no longer be an isolated strip of metal.
      * Change: In AutoHorizontal::updateOrient(), when there is a
          source/target swap, no need to exchange the dxSource and
          dxTarget extentions.
      * Change: In AutoHorizontal::setDuSource() & ::setDuTarget(), check
          for du bigger than the pitch, which should never occur and
          display a warning.
            Same modification in AutoVertical.
      * Change: In Track::repair(), now invalidate the shifted segments
          to ensure cache coherency with the TrackElement.
            Do not take AutoSegment in non-preferred direction into
          account, and especially do not try to resize them.
            Now, invalidate the corrected segments (see below).
      * Change: In KatanaEngine::finalizeLayout(), move the track repair
          stage from here into NegociateWidow::run(). This way we avoid
          the false warning about segment overlap in the data-base final
          check. The false warning was because the AutoSegment where
          shifted but not invalidated/revalidated leading to a cache
          incoherency in the TrackElement. Now they *are* invalidated
          and updated.
      * Bug: In Track::checkMinArea(), do not check for minimal area when
          a segment is overlapping a same net neighbor. To avoid false
          minimum area violation warnings.
  6. 12 May, 2022 6 commits
  7. 27 Apr, 2022 1 commit
    • Jean-Paul Chaput's avatar
      Added direct management of macro blocks I/O pins in METAL2 & METAL3. · cd60032d
      Jean-Paul Chaput authored
      The decoupling of the cell gauge and the routing gauge implies that
      the METAL2 & METAL3 terminals of macro blocks cannot be aligned on
      the routing tracks anymore. That is, an horizontal METAL2 terminal
      will not be on a track axis, but offgrid, so we no longer can use
      a METAL2 horizontal segment to connect to it. Making an adjustement
      between the offgrid terminal and the on-grid segment has proven
      too complex and generating difficult configuration for the router.
      Moreover, METLA2 terminal could be fully inside a METAL2 blockage.
      So now, when the gauges are decoupled, we connect the METAL2 and
      METAL3 the same way we do for METAL1: *from above* in the perpandicular
      direction and using a *sliding* VIA. We assume that those kind of
      terminals in upper metals are quite long.
      * New: In Hurricane::Rectilinear, export the isNonRectangle() method
          to the Python interface.
      * New: In CRL::RoutingGauge, add function isSuperPitched() with the
          associated boolean attribute. Set to true when each pitch of
          each layer is independant (not low fractional multiples).
      * New: In AnabaticEngine, add the ability to temporarily disable the
          canonize() operation (mainly used in dogleg creation).
      * New: In AutoSegment::canonize(), do nothing if the operation is
          disabled by AnabaticEngine.
      * Bug: In Session::_revalidateTopology(), disable the canonization
          during the topology updating of a net. Too early canonization
          was occuring in makeDogleg() leading to incoherencies when
          performing the later canonization stage over the complete net.
          Mostly occured in the initial build stage of the net.
      * New: In GCell, add function postGlobalAnnotate(), if a layer
          is fully blocked (above 0.9), typically, under a blockage,
          add a further capacity decrease of 2 on the edges. So we may
          handle a modicum of doglegs.
      * Bug; In GCell::addBlockage(), removeContact(), removeHSegment()
          and removeVSegment(), forgot to set the Invalidated flag.
          This may have lead to innacurate densities.
      * Change: In GCell::updateDensity(), more complex setting of the
          GoStraight flag. This flag is now set if we don't have two
          *contiguous* below 60% of density. We need free contiguous
          layers to make doglegs.
      * New: In NetBuilder, now manage a current state flag along
          with the state flag of the *source* GCell. This flag is used
          to tell if the GCell needs it's *global* routing to be done
          using the upper layers (METAL4 & METAL5) instead of the
          lower ones.
      * New: In NetBuilder::setStartHook(), set the state flag of the
          GCell to ToUpperRouting when processing a global routing
          articulation and one of the base layer is obstructed
          above 0.9.
            In GCell with terminals, also set ToUpperRouting when there
          are some in METAL2 / METAL3 and the gauge is not super-pitched.
      * New: In NetBuilder, function isInsideBlockage(), to check if a
          terminal is completely or partially enclosed in a blockage.
      * Change: In NetBuilderHV::doRp_AutoContact(), remove support for
          trying to put on grid misaligned METAL2/METAL3.
            Instead systematically access them from above.
            Do not cover with fixed protection terminals that are already
          enclosed in blockages.
      * Bug: In NetBuilderHV::doRp_AutoContact(), always add the terminal
          contact in the requested GCell and not the target/source one,
          in case the terminal span several GCells.
      * Change: In NetBuilderHV::doRp_Access(), create the local wiring
          according to the RoutingPad layer.
      * Change: In NetBuilderHV::_do_xG(), _do_2G(),
          create the global wiring in upper layers, according to the
          ToUpperRouting flag.
      * Change: In NetBuilderHV::_do_xG_xM3(), now delegate to
          _do_xG_xM3_baseRouting() and _do_xG_xM3_upperRouting() if the
          density at terminal level is above 0.5.
      * New: NetBuilderHV::_do_xG_xM3_baseRouting() and
          _do_xG_xM3_upperRouting() separated function to manage the
          local routing.
      * Change: In NetBuilder::_do_globalSegment(), if the currently
          processed GCell or it's source is in ToUpperRouting mode,
          move up the global segment. Do *not* use the moveUp() function
          which would create doglegs unwanted at this stage.
      * New: In KatanaEngine::annotateGlobalGraph(), call postGlobalAnnotate()
          on the GCell after the blockages have been taken into accound to
          add the penalty.
      * Bug: In Track::getPrevious(), correctly manage the 0 value for the
          index argument. Strange it didn't show earlier.
            Same goes for Track::expandFreeInterval().
  8. 03 Apr, 2022 2 commits
    • Jean-Paul Chaput's avatar
      Missing BigVia import and some typos. · 908231c4
      Jean-Paul Chaput authored
    • Jean-Paul Chaput's avatar
      Added support for SPICE terminal ordering from .spi files. · 4ffd9182
      Jean-Paul Chaput authored
      After a Cell has been created in memory (by parsers or Python scripts)
      we can annotate it with the Spice parser so it will know the right
      order with which to create the subcircuit call ('x').
      * New: In CRL::Spice::load(), add support to read the ".subckt" card
          and guess the right ordering for generating the 'x' (subcircuit
          card call).
      * Bug: In Spice::SpiceBit & Spice::BitExtension, when a Net bit property
          is removed, if it's the currently cached property in BitExtension
          it may lead to a crash. So when a property is destroyed, we must
          also clear the cache (see remove(), clearCache() & onReleasedby()).
            I'm wary that this could also happen on other kind of cached
      * New: In CRL::NamingScheme, new method vhdlToVlog() to translate back
          VHDL net name into Verilog. Currently only changes "()" into "[]".
          Used to generate the commented SPICE interface for Alliance compliance.
      * Change: In Spice::Entity, previously all the ordering where removed
          between each run of the SPICE parser, but the orders read from
          SPICE file (mostly standard cells) must be kept. So add a flag
          ReferenceCell to prevent the removal by ::destroyAll().
  9. 26 Jan, 2022 5 commits
  10. 15 Jan, 2022 2 commits
  11. 14 Jan, 2022 1 commit
  12. 13 Jan, 2022 1 commit
  13. 12 Jan, 2022 5 commits
  14. 10 Jan, 2022 6 commits