Skip to main content

AntennaStrategy

Enum AntennaStrategy 

Source
pub enum AntennaStrategy {
    DiodesAndJog,
    JogOnly,
    HeuristicDiodesAndJog,
}
Expand description

How antenna violations are to be closed. These are NOT interchangeable, and choosing wrongly costs slew.

MEASURED on coproc_core: its max-slew stuck at exactly 126 whether the resizer margin was 30 or 45 — the lever could not reach the cause. Half the slew violators were ANTENNA_*/DIODE pins. A diode is extra CAPACITANCE on its net, and the diode passes run AFTER the resizer, so slew repair never sees the load they add. Diode-based antenna closure and slew closure fight.

The SAT jog-router fixes antenna with METAL instead — it bridges a segment one layer up, adding no cell and no capacitance — so on a block where slew is tight it is strictly the better tool. It only became safe to rely on alone once its free-window search was taught the layer spacing rule; before that it placed bridges flush against foreign metal (359 Magic violations on the Caravel wrapper, while TritonRoute reported 0).

Variants§

§

DiodesAndJog

OpenLane’s diode passes plus the jog ECO. The default: it closed gpu_simt and fabric_soc outright, and diodes are cheap when slew has headroom.

§

JogOnly

Jog-router only — no diode is inserted anywhere. For a block whose slew is tight, where the diodes’ added load is the thing keeping slew from closing.

§

HeuristicDiodesAndJog

The PRE-ROUTE heuristic diode pass plus the jog ECO, with OpenLane’s POST-route GRT_REPAIR_ANTENNAS off.

This exists because the other two variants are not the only choices, and treating them as such hid the best one. OpenLane runs TWO independent diode passes — a pre-route heuristic pass driven by HEURISTIC_ANTENNA_THRESHOLD, and the global router’s own post-route repair — and an enum with only “both” and “neither” cannot express the third combination. Every coproc_core experiment for two sessions moved them together:

heuristicGRT repairresult
onon17,716 diodes, max-slew 126-282
offoffantenna 538-770 violating nets
onoffslew 120, antenna 27, and it ROUTES

That third row is this variant: DRC 0, LVS 0, XOR 0, routing 0, setup +32.54, hold +0.27 on a block previously recorded as a dead end needing an emitter-side rewrite. What made the difference is not the diode COUNT — that is essentially unchanged at 17,548 — but that GRT’s repair RE-ROUTES as well as inserting, and it was that re-route, not the diodes, that hit GRT-0119 congestion at every utilisation and die size tried.

It also corrected a wrong attribution: the diodes were believed to come from GRT because they “survived” a threshold of 300. Surviving a threshold does not identify a source. With GRT off there are still 17,548 of them, so they come from the heuristic pass — which makes heuristic_antenna_threshold the live lever rather than an exhausted one. (Though not a wide one: at 1500 the count drops far enough that antenna explodes back to 510 nets. It is a cliff, not a gradient.)

Trait Implementations§

Source§

impl Clone for AntennaStrategy

Source§

fn clone(&self) -> AntennaStrategy

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for AntennaStrategy

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for AntennaStrategy

Source§

fn eq(&self, other: &AntennaStrategy) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Copy for AntennaStrategy

Source§

impl Eq for AntennaStrategy

Source§

impl StructuralPartialEq for AntennaStrategy

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,