pub enum Implementation {
Flops {
cells: u64,
},
Macros {
macro_name: &'static str,
depth_banks: u32,
width_banks: u32,
instances: u32,
},
}Expand description
How a MemoryRequest is best built. NOT always a macro — and getting this wrong is
expensive in both directions.
An SRAM macro has a MINIMUM depth (256 words on sky130’s smallest), so a shallow array pays for
a whole macro to store a fraction of one. The WPE’s blk_* arrays are 13 x 160 words: as
macros that is 13 instances and 2.18 mm^2 to hold 66 kbit, which is worse than flops AND drags
in port constraints the flops would not have. Conversely the heap at 2.1 Mbit would be ~36 mm^2
of flops and has to be a macro. The planner must pick, not assume.
Variants§
Flops
Flip-flops and their access logic — no macro, no port limit, no corner problem.
Macros
One or more SRAM macro instances.
Trait Implementations§
Source§impl Clone for Implementation
impl Clone for Implementation
Source§fn clone(&self) -> Implementation
fn clone(&self) -> Implementation
Returns a duplicate of the value. Read more
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source. Read moreSource§impl Debug for Implementation
impl Debug for Implementation
Source§impl PartialEq for Implementation
impl PartialEq for Implementation
impl StructuralPartialEq for Implementation
Auto Trait Implementations§
impl Freeze for Implementation
impl RefUnwindSafe for Implementation
impl Send for Implementation
impl Sync for Implementation
impl Unpin for Implementation
impl UnsafeUnpin for Implementation
impl UnwindSafe for Implementation
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn 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>
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)
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)
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.