change NameId to have an opaque Id so output firrtl doesn't depend on how many modules of the same name were ever created
All checks were successful
/ test (push) Successful in 39m6s
All checks were successful
/ test (push) Successful in 39m6s
This commit is contained in:
parent
eed0afc6ab
commit
30b9a5e48d
|
@ -27,7 +27,7 @@ use crate::{
|
|||
simplify_memories::simplify_memories,
|
||||
},
|
||||
AnnotatedModuleIO, Block, ExternModuleBody, ExternModuleParameter,
|
||||
ExternModuleParameterValue, Module, ModuleBody, NameId, NormalModuleBody, Stmt,
|
||||
ExternModuleParameterValue, Module, ModuleBody, NameOptId, NormalModuleBody, Stmt,
|
||||
StmtConnect, StmtDeclaration, StmtFormal, StmtIf, StmtInstance, StmtMatch, StmtReg,
|
||||
StmtWire,
|
||||
},
|
||||
|
@ -187,9 +187,9 @@ struct NameMaker {
|
|||
}
|
||||
|
||||
impl NameMaker {
|
||||
fn make(&mut self, name: NameId) -> Ident {
|
||||
let mut num: usize = name.1;
|
||||
let name = String::from(&*name.0);
|
||||
fn make(&mut self, name: impl Into<String>) -> Ident {
|
||||
let mut num = 0usize;
|
||||
let name: String = name.into();
|
||||
// remove all invalid characters -- all valid characters are ASCII, so we can just remove invalid bytes
|
||||
let mut name = String::from_iter(
|
||||
name.bytes()
|
||||
|
@ -221,7 +221,7 @@ impl NameMaker {
|
|||
#[derive(Default)]
|
||||
struct Namespace {
|
||||
name_maker: NameMaker,
|
||||
map: HashMap<NameId, Ident>,
|
||||
map: HashMap<NameOptId, Ident>,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
|
||||
|
@ -247,10 +247,11 @@ impl From<PortName> for Ident {
|
|||
}
|
||||
|
||||
impl Namespace {
|
||||
fn get(&mut self, name: NameId) -> Ident {
|
||||
fn get(&mut self, name: impl Into<NameOptId>) -> Ident {
|
||||
let name: NameOptId = name.into();
|
||||
#[cold]
|
||||
fn make(name_maker: &mut NameMaker, name: NameId) -> Ident {
|
||||
name_maker.make(name)
|
||||
fn make(name_maker: &mut NameMaker, name: NameOptId) -> Ident {
|
||||
name_maker.make(name.0)
|
||||
}
|
||||
*self
|
||||
.map
|
||||
|
@ -258,7 +259,7 @@ impl Namespace {
|
|||
.or_insert_with(|| make(&mut self.name_maker, name))
|
||||
}
|
||||
fn make_new(&mut self, prefix: &str) -> Ident {
|
||||
self.name_maker.make(NameId(prefix.intern(), 0))
|
||||
self.name_maker.make(prefix)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -368,7 +369,7 @@ impl TypeState {
|
|||
Ident(Intern::intern_owned(format!("Ty{id}")))
|
||||
}
|
||||
fn get_bundle_field(&mut self, ty: Bundle, name: Interned<str>) -> Ident {
|
||||
self.bundle_ns(ty).borrow_mut().get(NameId(name, 0))
|
||||
self.bundle_ns(ty).borrow_mut().get(name)
|
||||
}
|
||||
fn bundle_def(&self, ty: Bundle) -> (Ident, Rc<RefCell<Namespace>>) {
|
||||
self.bundle_defs.get_or_make(ty, |&ty, definitions| {
|
||||
|
@ -382,7 +383,7 @@ impl TypeState {
|
|||
if flipped {
|
||||
body.push_str("flip ");
|
||||
}
|
||||
write!(body, "{}: ", ns.get(NameId(name, 0))).unwrap();
|
||||
write!(body, "{}: ", ns.get(name)).unwrap();
|
||||
body.push_str(&self.ty(ty));
|
||||
}
|
||||
body.push('}');
|
||||
|
@ -406,7 +407,7 @@ impl TypeState {
|
|||
for EnumVariant { name, ty } in ty.variants() {
|
||||
body.push_str(separator);
|
||||
separator = ", ";
|
||||
write!(body, "{}", variants.get(NameId(name, 0))).unwrap();
|
||||
write!(body, "{}", variants.get(name)).unwrap();
|
||||
if let Some(ty) = ty {
|
||||
body.push_str(": ");
|
||||
body.push_str(&self.ty(ty));
|
||||
|
@ -428,11 +429,7 @@ impl TypeState {
|
|||
self.enum_def(ty).0
|
||||
}
|
||||
fn get_enum_variant(&mut self, ty: Enum, name: Interned<str>) -> Ident {
|
||||
self.enum_def(ty)
|
||||
.1
|
||||
.variants
|
||||
.borrow_mut()
|
||||
.get(NameId(name, 0))
|
||||
self.enum_def(ty).1.variants.borrow_mut().get(name)
|
||||
}
|
||||
fn ty<T: Type>(&self, ty: T) -> String {
|
||||
match ty.canonical() {
|
||||
|
@ -929,7 +926,7 @@ impl<'a> Exporter<'a> {
|
|||
) in expr.field_values().into_iter().zip(ty.fields())
|
||||
{
|
||||
debug_assert!(!flipped, "can't have bundle literal with flipped field -- this should have been caught in BundleLiteral::new_unchecked");
|
||||
let name = bundle_ns.borrow_mut().get(NameId(name, 0));
|
||||
let name = bundle_ns.borrow_mut().get(name);
|
||||
let field_value = self.expr(Expr::canonical(field_value), definitions, const_ty);
|
||||
definitions.add_definition_line(format_args!("connect {ident}.{name}, {field_value}"));
|
||||
}
|
||||
|
@ -2199,7 +2196,7 @@ impl<'a> Exporter<'a> {
|
|||
} in module.module_io().iter()
|
||||
{
|
||||
self.targeted_annotations(module_name, vec![], annotations);
|
||||
let name = self.module.ns.get(NameId(module_io.name(), 0));
|
||||
let name = self.module.ns.get(module_io.name_id());
|
||||
let ty = self.type_state.ty(module_io.ty());
|
||||
if module_io.is_input() {
|
||||
writeln!(
|
||||
|
|
|
@ -36,9 +36,10 @@ use std::{
|
|||
iter::FusedIterator,
|
||||
marker::PhantomData,
|
||||
mem,
|
||||
num::NonZeroU64,
|
||||
ops::Deref,
|
||||
rc::Rc,
|
||||
sync::Mutex,
|
||||
sync::atomic::AtomicU64,
|
||||
};
|
||||
|
||||
pub mod transform;
|
||||
|
@ -602,8 +603,48 @@ impl BlockStack {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Eq, PartialEq, Hash, Debug)]
|
||||
pub struct Id(NonZeroU64);
|
||||
|
||||
impl Id {
|
||||
pub fn new() -> Self {
|
||||
static NEXT_ID: AtomicU64 = AtomicU64::new(1);
|
||||
Self(
|
||||
NonZeroU64::new(NEXT_ID.fetch_add(1, std::sync::atomic::Ordering::Relaxed))
|
||||
.expect("Id::new ran out of ids"),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Eq, PartialEq, Hash)]
|
||||
pub struct NameId(pub Interned<str>, pub usize);
|
||||
pub struct NameOptId(pub Interned<str>, pub Option<Id>);
|
||||
|
||||
impl fmt::Debug for NameOptId {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
fmt::Display::fmt(self, f)
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Display for NameOptId {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
f.write_str(&self.0)
|
||||
}
|
||||
}
|
||||
|
||||
impl From<Interned<str>> for NameOptId {
|
||||
fn from(name: Interned<str>) -> Self {
|
||||
Self(name, None)
|
||||
}
|
||||
}
|
||||
|
||||
impl From<NameId> for NameOptId {
|
||||
fn from(name_id: NameId) -> Self {
|
||||
Self(name_id.0, Some(name_id.1))
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Eq, PartialEq, Hash)]
|
||||
pub struct NameId(pub Interned<str>, pub Id);
|
||||
|
||||
impl fmt::Debug for NameId {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
|
@ -613,13 +654,7 @@ impl fmt::Debug for NameId {
|
|||
|
||||
impl fmt::Display for NameId {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
if self.0.is_empty() {
|
||||
write!(f, "{}", self.1)
|
||||
} else if self.1 == 0 {
|
||||
f.write_str(&self.0)
|
||||
} else {
|
||||
write!(f, "{}_{}", self.0, self.1)
|
||||
}
|
||||
f.write_str(&self.0)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -648,106 +683,6 @@ impl fmt::Debug for TargetName {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Default)]
|
||||
pub struct NameIdGen(HashMap<Interned<str>, usize>);
|
||||
|
||||
impl NameIdGen {
|
||||
pub fn gen(&mut self, name: Interned<str>) -> NameId {
|
||||
let next_id = self.0.entry(name).or_default();
|
||||
let id = *next_id;
|
||||
*next_id += 1;
|
||||
NameId(name, id)
|
||||
}
|
||||
pub fn mark_as_used(&mut self, name_id: NameId) {
|
||||
let next_id = self.0.entry(name_id.0).or_default();
|
||||
*next_id = (*next_id).max(name_id.1 + 1);
|
||||
}
|
||||
pub fn for_module(module: Module<Bundle>) -> Self {
|
||||
let mut retval = Self::default();
|
||||
let Module {
|
||||
name: _,
|
||||
source_location: _,
|
||||
body,
|
||||
io_ty: _,
|
||||
module_io,
|
||||
module_annotations: _,
|
||||
} = module;
|
||||
for module_io in &module_io {
|
||||
retval.mark_as_used(module_io.module_io.name_id());
|
||||
}
|
||||
match body {
|
||||
ModuleBody::Extern(ExternModuleBody {
|
||||
verilog_name: _,
|
||||
parameters: _,
|
||||
}) => {}
|
||||
ModuleBody::Normal(NormalModuleBody { body }) => {
|
||||
let mut blocks = vec![body];
|
||||
while let Some(block) = blocks.pop() {
|
||||
let Block { memories, stmts } = block;
|
||||
for memory in memories {
|
||||
retval.mark_as_used(memory.scoped_name().1);
|
||||
}
|
||||
for stmt in &stmts {
|
||||
blocks.extend_from_slice(stmt.sub_stmt_blocks());
|
||||
match stmt {
|
||||
Stmt::Connect(StmtConnect {
|
||||
lhs: _,
|
||||
rhs: _,
|
||||
source_location: _,
|
||||
})
|
||||
| Stmt::Formal(StmtFormal {
|
||||
kind: _,
|
||||
clk: _,
|
||||
pred: _,
|
||||
en: _,
|
||||
text: _,
|
||||
source_location: _,
|
||||
})
|
||||
| Stmt::If(StmtIf {
|
||||
cond: _,
|
||||
source_location: _,
|
||||
blocks: _,
|
||||
})
|
||||
| Stmt::Match(StmtMatch {
|
||||
expr: _,
|
||||
source_location: _,
|
||||
blocks: _,
|
||||
}) => {}
|
||||
Stmt::Declaration(StmtDeclaration::Instance(StmtInstance {
|
||||
annotations: _,
|
||||
instance,
|
||||
})) => {
|
||||
retval.mark_as_used(instance.name_id());
|
||||
}
|
||||
Stmt::Declaration(StmtDeclaration::Reg(StmtReg {
|
||||
annotations: _,
|
||||
reg,
|
||||
})) => {
|
||||
retval.mark_as_used(reg.name_id());
|
||||
}
|
||||
Stmt::Declaration(StmtDeclaration::Wire(StmtWire {
|
||||
annotations: _,
|
||||
wire,
|
||||
})) => {
|
||||
retval.mark_as_used(wire.name_id());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
retval
|
||||
}
|
||||
pub fn gen_module_name(name: Interned<str>) -> NameId {
|
||||
static MODULE_NAME_GEN: Mutex<Option<NameIdGen>> = Mutex::new(None);
|
||||
MODULE_NAME_GEN
|
||||
.lock()
|
||||
.unwrap()
|
||||
.get_or_insert_with(NameIdGen::default)
|
||||
.gen(name)
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Eq, PartialEq, Hash)]
|
||||
pub struct Instance<T: BundleType> {
|
||||
scoped_name: ScopedNameId,
|
||||
|
@ -836,7 +771,6 @@ struct ModuleBuilderImpl {
|
|||
body: ModuleBodyBuilding,
|
||||
io: Vec<AnnotatedModuleIO<ModuleBuilding>>,
|
||||
io_indexes: HashMap<ModuleIO<CanonicalType>, usize>,
|
||||
name_id_gen: NameIdGen,
|
||||
module_annotations: Vec<Annotation>,
|
||||
}
|
||||
|
||||
|
@ -1941,9 +1875,7 @@ impl<T: Type> RegBuilder<Expr<ClockDomain>, Option<Expr<T>>, T> {
|
|||
ty,
|
||||
} = self;
|
||||
ModuleBuilder::with(|module_builder| {
|
||||
let mut impl_ = module_builder.impl_.borrow_mut();
|
||||
let scoped_name = ScopedNameId(module_builder.name, impl_.name_id_gen.gen(name));
|
||||
drop(impl_);
|
||||
let scoped_name = ScopedNameId(module_builder.name, NameId(name, Id::new()));
|
||||
let reg = Reg::new_unchecked(scoped_name, source_location, ty, clock_domain, init);
|
||||
let retval = reg.to_expr();
|
||||
// convert before borrow_mut since ModuleBuilder could be reentered by T::canonical()
|
||||
|
@ -1991,8 +1923,13 @@ impl ModuleBuilder {
|
|||
is_input: bool,
|
||||
ty: IO,
|
||||
) -> Expr<IO> {
|
||||
let module_io =
|
||||
ModuleIO::<IO>::new_unchecked(self.name, name.intern(), source_location, is_input, ty);
|
||||
let module_io = ModuleIO::<IO>::new_unchecked(
|
||||
self.name,
|
||||
NameId(name.intern(), Id::new()),
|
||||
source_location,
|
||||
is_input,
|
||||
ty,
|
||||
);
|
||||
let retval = module_io.to_expr();
|
||||
let module_io = module_io.canonical();
|
||||
let mut impl_ = self.impl_.borrow_mut();
|
||||
|
@ -2080,7 +2017,7 @@ impl ModuleBuilder {
|
|||
module_kind: ModuleKind,
|
||||
f: impl FnOnce(&Self) -> Result<(), E>,
|
||||
) -> Result<Interned<Module<T>>, E> {
|
||||
let name = NameIdGen::gen_module_name(name.intern());
|
||||
let name = NameId(name.intern(), Id::new());
|
||||
let body = match module_kind {
|
||||
ModuleKind::Extern => ModuleBody::Extern(ExternModuleBody {
|
||||
verilog_name: name.0,
|
||||
|
@ -2105,7 +2042,6 @@ impl ModuleBuilder {
|
|||
body,
|
||||
io: vec![],
|
||||
io_indexes: HashMap::new(),
|
||||
name_id_gen: NameIdGen::default(),
|
||||
module_annotations: vec![],
|
||||
}),
|
||||
};
|
||||
|
@ -2277,9 +2213,7 @@ pub fn annotate<T: Type>(target: Expr<T>, annotations: impl IntoAnnotations) {
|
|||
#[track_caller]
|
||||
pub fn wire_with_loc<T: Type>(name: &str, source_location: SourceLocation, ty: T) -> Expr<T> {
|
||||
ModuleBuilder::with(|m| {
|
||||
let mut impl_ = m.impl_.borrow_mut();
|
||||
let scoped_name = ScopedNameId(m.name, impl_.name_id_gen.gen(name.intern()));
|
||||
drop(impl_);
|
||||
let scoped_name = ScopedNameId(m.name, NameId(name.intern(), Id::new()));
|
||||
let wire = Wire::<T>::new_unchecked(scoped_name, source_location, ty);
|
||||
let retval = wire.to_expr();
|
||||
let canonical_wire = wire.canonical();
|
||||
|
@ -2311,9 +2245,7 @@ fn incomplete_declaration(
|
|||
source_location: SourceLocation,
|
||||
) -> Rc<RefCell<IncompleteDeclaration>> {
|
||||
ModuleBuilder::with(|m| {
|
||||
let mut impl_ = m.impl_.borrow_mut();
|
||||
let scoped_name = ScopedNameId(m.name, impl_.name_id_gen.gen(name.intern()));
|
||||
drop(impl_);
|
||||
let scoped_name = ScopedNameId(m.name, NameId(name.intern(), Id::new()));
|
||||
let retval = Rc::new(RefCell::new(IncompleteDeclaration::Incomplete {
|
||||
name: scoped_name,
|
||||
source_location,
|
||||
|
@ -2489,9 +2421,7 @@ pub fn instance_with_loc<T: BundleType>(
|
|||
source_location: SourceLocation,
|
||||
) -> Expr<T> {
|
||||
ModuleBuilder::with(|m| {
|
||||
let mut impl_ = m.impl_.borrow_mut();
|
||||
let scoped_name = ScopedNameId(m.name, impl_.name_id_gen.gen(name.intern()));
|
||||
drop(impl_);
|
||||
let scoped_name = ScopedNameId(m.name, NameId(name.intern(), Id::new()));
|
||||
let instance = Instance::<T> {
|
||||
scoped_name,
|
||||
instantiated,
|
||||
|
@ -2530,9 +2460,7 @@ fn memory_impl<Element: Type, Len: Size>(
|
|||
source_location: SourceLocation,
|
||||
) -> MemBuilder<Element, Len> {
|
||||
ModuleBuilder::with(|m| {
|
||||
let mut impl_ = m.impl_.borrow_mut();
|
||||
let scoped_name = ScopedNameId(m.name, impl_.name_id_gen.gen(name.intern()));
|
||||
drop(impl_);
|
||||
let scoped_name = ScopedNameId(m.name, NameId(name.intern(), Id::new()));
|
||||
let (retval, target_mem) = MemBuilder::new(scoped_name, source_location, mem_element_type);
|
||||
let mut impl_ = m.impl_.borrow_mut();
|
||||
let body = impl_.body.builder_normal_body();
|
||||
|
@ -2608,6 +2536,7 @@ pub fn memory<Element: Type>(
|
|||
pub struct ModuleIO<T: Type> {
|
||||
containing_module_name: NameId,
|
||||
bundle_field: BundleField,
|
||||
id: Id,
|
||||
ty: T,
|
||||
source_location: SourceLocation,
|
||||
}
|
||||
|
@ -2627,12 +2556,14 @@ impl<T: Type> ModuleIO<T> {
|
|||
let Self {
|
||||
containing_module_name,
|
||||
bundle_field,
|
||||
id,
|
||||
ty: _,
|
||||
source_location,
|
||||
} = *self;
|
||||
ModuleIO {
|
||||
containing_module_name,
|
||||
bundle_field,
|
||||
id,
|
||||
ty: bundle_field.ty,
|
||||
source_location,
|
||||
}
|
||||
|
@ -2656,7 +2587,7 @@ impl<T: Type> ModuleIO<T> {
|
|||
self.bundle_field.name
|
||||
}
|
||||
pub fn name_id(&self) -> NameId {
|
||||
NameId(self.bundle_field.name, 0)
|
||||
NameId(self.bundle_field.name, self.id)
|
||||
}
|
||||
pub fn scoped_name(&self) -> ScopedNameId {
|
||||
ScopedNameId(self.containing_module_name, self.name_id())
|
||||
|
@ -2666,7 +2597,7 @@ impl<T: Type> ModuleIO<T> {
|
|||
}
|
||||
pub fn new_unchecked(
|
||||
containing_module_name: NameId,
|
||||
name: Interned<str>,
|
||||
name: NameId,
|
||||
source_location: SourceLocation,
|
||||
is_input: bool,
|
||||
ty: T,
|
||||
|
@ -2674,10 +2605,11 @@ impl<T: Type> ModuleIO<T> {
|
|||
Self {
|
||||
containing_module_name,
|
||||
bundle_field: BundleField {
|
||||
name,
|
||||
name: name.0,
|
||||
flipped: is_input,
|
||||
ty: ty.canonical(),
|
||||
},
|
||||
id: name.1,
|
||||
ty,
|
||||
source_location,
|
||||
}
|
||||
|
|
|
@ -14,8 +14,7 @@ use crate::{
|
|||
memory::{DynPortType, Mem, MemPort},
|
||||
module::{
|
||||
transform::visit::{Fold, Folder},
|
||||
Block, Module, NameId, NameIdGen, ScopedNameId, Stmt, StmtConnect, StmtIf, StmtMatch,
|
||||
StmtWire,
|
||||
Block, Id, Module, NameId, ScopedNameId, Stmt, StmtConnect, StmtIf, StmtMatch, StmtWire,
|
||||
},
|
||||
source_location::SourceLocation,
|
||||
ty::{CanonicalType, Type},
|
||||
|
@ -92,13 +91,12 @@ enum EnumTypeState {
|
|||
}
|
||||
|
||||
struct ModuleState {
|
||||
name_id_gen: NameIdGen,
|
||||
module_name: NameId,
|
||||
}
|
||||
|
||||
impl ModuleState {
|
||||
fn gen_name(&mut self, name: &str) -> ScopedNameId {
|
||||
ScopedNameId(self.module_name, self.name_id_gen.gen(name.intern()))
|
||||
ScopedNameId(self.module_name, NameId(name.intern(), Id::new()))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -632,7 +630,6 @@ impl Folder for State {
|
|||
|
||||
fn fold_module<T: BundleType>(&mut self, v: Module<T>) -> Result<Module<T>, Self::Error> {
|
||||
self.module_state_stack.push(ModuleState {
|
||||
name_id_gen: NameIdGen::for_module(v.canonical()),
|
||||
module_name: v.name_id(),
|
||||
});
|
||||
let retval = Fold::default_fold(v, self);
|
||||
|
|
|
@ -10,7 +10,7 @@ use crate::{
|
|||
memory::{Mem, MemPort, PortType},
|
||||
module::{
|
||||
transform::visit::{Fold, Folder},
|
||||
Block, Module, NameId, NameIdGen, ScopedNameId, Stmt, StmtConnect, StmtWire,
|
||||
Block, Id, Module, NameId, ScopedNameId, Stmt, StmtConnect, StmtWire,
|
||||
},
|
||||
source_location::SourceLocation,
|
||||
ty::{CanonicalType, Type},
|
||||
|
@ -417,7 +417,6 @@ impl SplitMemState<'_, '_> {
|
|||
|
||||
struct ModuleState {
|
||||
output_module: Option<Interned<Module<Bundle>>>,
|
||||
name_id_gen: NameIdGen,
|
||||
memories: HashMap<ScopedNameId, MemState>,
|
||||
}
|
||||
|
||||
|
@ -626,10 +625,10 @@ impl ModuleState {
|
|||
mem_name_path: &str,
|
||||
split_state: &SplitState<'_>,
|
||||
) -> Mem {
|
||||
let mem_name = self.name_id_gen.gen(Intern::intern_owned(format!(
|
||||
"{}{mem_name_path}",
|
||||
input_mem.scoped_name().1 .0
|
||||
)));
|
||||
let mem_name = NameId(
|
||||
Intern::intern_owned(format!("{}{mem_name_path}", input_mem.scoped_name().1 .0)),
|
||||
Id::new(),
|
||||
);
|
||||
let mem_name = ScopedNameId(input_mem.scoped_name().0, mem_name);
|
||||
let output_element_type = match single_type {
|
||||
SingleType::UInt(ty) => ty.canonical(),
|
||||
|
@ -753,9 +752,10 @@ impl ModuleState {
|
|||
let port_ty = port.ty();
|
||||
let NameId(mem_name, _) = input_mem.scoped_name().1;
|
||||
let port_name = port.port_name();
|
||||
let wire_name = self
|
||||
.name_id_gen
|
||||
.gen(Intern::intern_owned(format!("{mem_name}_{port_name}")));
|
||||
let wire_name = NameId(
|
||||
Intern::intern_owned(format!("{mem_name}_{port_name}")),
|
||||
Id::new(),
|
||||
);
|
||||
let wire = Wire::new_unchecked(
|
||||
ScopedNameId(input_mem.scoped_name().0, wire_name),
|
||||
port.source_location(),
|
||||
|
@ -887,7 +887,6 @@ impl Folder for State {
|
|||
module,
|
||||
ModuleState {
|
||||
output_module: None,
|
||||
name_id_gen: NameIdGen::for_module(*module),
|
||||
memories: HashMap::new(),
|
||||
},
|
||||
);
|
||||
|
|
|
@ -175,9 +175,9 @@ circuit check_array_repeat:
|
|||
#[rustfmt::skip] // work around https://github.com/rust-lang/rustfmt/issues/6161
|
||||
assert_export_firrtl! {
|
||||
m =>
|
||||
"/test/check_array_repeat_1.fir": r"FIRRTL version 3.2.0
|
||||
circuit check_array_repeat_1:
|
||||
module check_array_repeat_1: @[module-XXXXXXXXXX.rs 1:1]
|
||||
"/test/check_array_repeat.fir": r"FIRRTL version 3.2.0
|
||||
circuit check_array_repeat:
|
||||
module check_array_repeat: @[module-XXXXXXXXXX.rs 1:1]
|
||||
input i: UInt<8> @[module-XXXXXXXXXX.rs 2:1]
|
||||
output o: UInt<8>[4] @[module-XXXXXXXXXX.rs 3:1]
|
||||
wire _array_literal_expr: UInt<8>[4]
|
||||
|
@ -1672,9 +1672,9 @@ fn test_memory_of_arrays() {
|
|||
circuit check_memory_of_arrays: %[[
|
||||
{
|
||||
"class": "firrtl.annotations.MemoryFileInlineAnnotation",
|
||||
"filename": "/test/check_memory_of_arrays/mem_1.mem",
|
||||
"filename": "/test/check_memory_of_arrays/mem.mem",
|
||||
"hexOrBinary": "h",
|
||||
"target": "~check_memory_of_arrays|check_memory_of_arrays>mem_1"
|
||||
"target": "~check_memory_of_arrays|check_memory_of_arrays>mem"
|
||||
}
|
||||
]]
|
||||
type Ty0 = {addr: UInt<4>, en: UInt<1>, clk: Clock, flip data: UInt<8>[2][3]}
|
||||
|
@ -1688,7 +1688,7 @@ circuit check_memory_of_arrays: %[[
|
|||
input wdata: UInt<8>[2][3] @[module-XXXXXXXXXX.rs 5:1]
|
||||
input wmask: UInt<1>[2][3] @[module-XXXXXXXXXX.rs 6:1]
|
||||
input clk: Clock @[module-XXXXXXXXXX.rs 7:1]
|
||||
mem mem_1: @[module-XXXXXXXXXX.rs 8:1]
|
||||
mem `mem`: @[module-XXXXXXXXXX.rs 8:1]
|
||||
data-type => UInt<8>[6]
|
||||
depth => 16
|
||||
read-latency => 0
|
||||
|
@ -1698,30 +1698,30 @@ circuit check_memory_of_arrays: %[[
|
|||
writer => w1
|
||||
wire mem_r0: Ty0 @[module-XXXXXXXXXX.rs 9:1]
|
||||
wire mem_w1: Ty1 @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_r0.data[0][0], mem_1.r0.data[0] @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_r0.data[0][1], mem_1.r0.data[1] @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_r0.data[1][0], mem_1.r0.data[2] @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_r0.data[1][1], mem_1.r0.data[3] @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_r0.data[2][0], mem_1.r0.data[4] @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_r0.data[2][1], mem_1.r0.data[5] @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_1.w1.data[0], mem_w1.data[0][0] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.w1.mask[0], mem_w1.mask[0][0] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.w1.data[1], mem_w1.data[0][1] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.w1.mask[1], mem_w1.mask[0][1] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.w1.data[2], mem_w1.data[1][0] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.w1.mask[2], mem_w1.mask[1][0] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.w1.data[3], mem_w1.data[1][1] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.w1.mask[3], mem_w1.mask[1][1] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.w1.data[4], mem_w1.data[2][0] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.w1.mask[4], mem_w1.mask[2][0] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.w1.data[5], mem_w1.data[2][1] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.w1.mask[5], mem_w1.mask[2][1] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.r0.addr, mem_r0.addr @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_1.r0.clk, mem_r0.clk @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_1.r0.en, mem_r0.en @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_1.w1.addr, mem_w1.addr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.w1.clk, mem_w1.clk @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.w1.en, mem_w1.en @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_r0.data[0][0], `mem`.r0.data[0] @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_r0.data[0][1], `mem`.r0.data[1] @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_r0.data[1][0], `mem`.r0.data[2] @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_r0.data[1][1], `mem`.r0.data[3] @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_r0.data[2][0], `mem`.r0.data[4] @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_r0.data[2][1], `mem`.r0.data[5] @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect `mem`.w1.data[0], mem_w1.data[0][0] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.mask[0], mem_w1.mask[0][0] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.data[1], mem_w1.data[0][1] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.mask[1], mem_w1.mask[0][1] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.data[2], mem_w1.data[1][0] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.mask[2], mem_w1.mask[1][0] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.data[3], mem_w1.data[1][1] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.mask[3], mem_w1.mask[1][1] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.data[4], mem_w1.data[2][0] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.mask[4], mem_w1.mask[2][0] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.data[5], mem_w1.data[2][1] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.mask[5], mem_w1.mask[2][1] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.r0.addr, mem_r0.addr @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect `mem`.r0.clk, mem_r0.clk @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect `mem`.r0.en, mem_r0.en @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect `mem`.w1.addr, mem_w1.addr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.clk, mem_w1.clk @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.en, mem_w1.en @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_r0.addr, raddr @[module-XXXXXXXXXX.rs 10:1]
|
||||
connect mem_r0.en, UInt<1>(0h1) @[module-XXXXXXXXXX.rs 11:1]
|
||||
connect mem_r0.clk, clk @[module-XXXXXXXXXX.rs 12:1]
|
||||
|
@ -1732,7 +1732,7 @@ circuit check_memory_of_arrays: %[[
|
|||
connect mem_w1.data, wdata @[module-XXXXXXXXXX.rs 18:1]
|
||||
connect mem_w1.mask, wmask @[module-XXXXXXXXXX.rs 19:1]
|
||||
"#,
|
||||
"/test/check_memory_of_arrays/mem_1.mem": r"000000000000
|
||||
"/test/check_memory_of_arrays/mem.mem": r"000000000000
|
||||
020103020101
|
||||
04080c080402
|
||||
061b1b120903
|
||||
|
@ -2445,9 +2445,9 @@ fn test_memory_of_enum() {
|
|||
circuit check_memory_of_enum: %[[
|
||||
{
|
||||
"class": "firrtl.annotations.MemoryFileInlineAnnotation",
|
||||
"filename": "/test/check_memory_of_enum/mem_1.mem",
|
||||
"filename": "/test/check_memory_of_enum/mem.mem",
|
||||
"hexOrBinary": "b",
|
||||
"target": "~check_memory_of_enum|check_memory_of_enum>mem_1"
|
||||
"target": "~check_memory_of_enum|check_memory_of_enum>mem"
|
||||
}
|
||||
]]
|
||||
type Ty0 = {|A, B: UInt<8>, C: UInt<1>[3]|}
|
||||
|
@ -2462,7 +2462,7 @@ circuit check_memory_of_enum: %[[
|
|||
input wdata: Ty0 @[module-XXXXXXXXXX.rs 5:1]
|
||||
input wmask: UInt<1> @[module-XXXXXXXXXX.rs 6:1]
|
||||
input clk: Clock @[module-XXXXXXXXXX.rs 7:1]
|
||||
mem mem_1: @[module-XXXXXXXXXX.rs 8:1]
|
||||
mem `mem`: @[module-XXXXXXXXXX.rs 8:1]
|
||||
data-type => UInt<10>
|
||||
depth => 16
|
||||
read-latency => 0
|
||||
|
@ -2474,10 +2474,10 @@ circuit check_memory_of_enum: %[[
|
|||
wire mem_w1: Ty2 @[module-XXXXXXXXXX.rs 14:1]
|
||||
wire _cast_bits_to_enum_expr: Ty0
|
||||
wire _cast_bits_to_enum_expr_body: UInt<8>
|
||||
connect _cast_bits_to_enum_expr_body, head(mem_1.r0.data, 8)
|
||||
when eq(UInt<2>(0), tail(mem_1.r0.data, 8)):
|
||||
connect _cast_bits_to_enum_expr_body, head(`mem`.r0.data, 8)
|
||||
when eq(UInt<2>(0), tail(`mem`.r0.data, 8)):
|
||||
connect _cast_bits_to_enum_expr, {|A, B: UInt<8>, C: UInt<1>[3]|}(A)
|
||||
else when eq(UInt<2>(1), tail(mem_1.r0.data, 8)):
|
||||
else when eq(UInt<2>(1), tail(`mem`.r0.data, 8)):
|
||||
connect _cast_bits_to_enum_expr, {|A, B: UInt<8>, C: UInt<1>[3]|}(B, _cast_bits_to_enum_expr_body)
|
||||
else:
|
||||
wire _cast_bits_to_array_expr: UInt<1>[3]
|
||||
|
@ -2504,14 +2504,14 @@ circuit check_memory_of_enum: %[[
|
|||
wire _cast_to_bits_expr: UInt<3>
|
||||
connect _cast_to_bits_expr, cat(_cast_array_to_bits_expr[2], cat(_cast_array_to_bits_expr[1], _cast_array_to_bits_expr[0]))
|
||||
connect _cast_enum_to_bits_expr, pad(cat(_cast_to_bits_expr, UInt<2>(2)), 10)
|
||||
connect mem_1.w1.data, _cast_enum_to_bits_expr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.w1.mask, mem_w1.mask @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.r0.addr, mem_r0.addr @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_1.r0.clk, mem_r0.clk @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_1.r0.en, mem_r0.en @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_1.w1.addr, mem_w1.addr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.w1.clk, mem_w1.clk @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.w1.en, mem_w1.en @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.data, _cast_enum_to_bits_expr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.mask, mem_w1.mask @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.r0.addr, mem_r0.addr @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect `mem`.r0.clk, mem_r0.clk @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect `mem`.r0.en, mem_r0.en @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect `mem`.w1.addr, mem_w1.addr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.clk, mem_w1.clk @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.en, mem_w1.en @[module-XXXXXXXXXX.rs 14:1]
|
||||
; connect different types:
|
||||
; lhs: UInt<4>
|
||||
; rhs: UInt<8>
|
||||
|
@ -2528,7 +2528,7 @@ circuit check_memory_of_enum: %[[
|
|||
connect mem_w1.data, wdata @[module-XXXXXXXXXX.rs 18:1]
|
||||
connect mem_w1.mask, wmask @[module-XXXXXXXXXX.rs 19:1]
|
||||
"#,
|
||||
"/test/check_memory_of_enum/mem_1.mem": r"0000000000
|
||||
"/test/check_memory_of_enum/mem.mem": r"0000000000
|
||||
0000000110
|
||||
0000001010
|
||||
0000010010
|
||||
|
@ -2602,7 +2602,7 @@ circuit check_memory_of_enum: %[[
|
|||
reader => r0
|
||||
writer => w1
|
||||
wire mem_r0: Ty2 @[module-XXXXXXXXXX.rs 9:1]
|
||||
wire mem_w1_1: Ty4 @[module-XXXXXXXXXX.rs 14:1]
|
||||
wire mem_w1: Ty4 @[module-XXXXXXXXXX.rs 14:1]
|
||||
wire _cast_bits_to_enum_expr: Ty0
|
||||
when eq(UInt<2>(0), tail(mem_tag.r0.data, 0)):
|
||||
connect _cast_bits_to_enum_expr, {|A, B, C|}(A)
|
||||
|
@ -2612,7 +2612,7 @@ circuit check_memory_of_enum: %[[
|
|||
connect _cast_bits_to_enum_expr, {|A, B, C|}(C)
|
||||
connect mem_r0.data.tag, _cast_bits_to_enum_expr @[module-XXXXXXXXXX.rs 9:1]
|
||||
wire _cast_enum_to_bits_expr: UInt<2>
|
||||
match mem_w1_1.data.tag:
|
||||
match mem_w1.data.tag:
|
||||
A:
|
||||
connect _cast_enum_to_bits_expr, UInt<2>(0)
|
||||
B:
|
||||
|
@ -2620,29 +2620,29 @@ circuit check_memory_of_enum: %[[
|
|||
C:
|
||||
connect _cast_enum_to_bits_expr, UInt<2>(2)
|
||||
connect mem_tag.w1.data, _cast_enum_to_bits_expr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_tag.w1.mask, mem_w1_1.mask.tag @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_tag.w1.mask, mem_w1.mask.tag @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_tag.r0.addr, mem_r0.addr @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_tag.r0.clk, mem_r0.clk @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_tag.r0.en, mem_r0.en @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_tag.w1.addr, mem_w1_1.addr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_tag.w1.clk, mem_w1_1.clk @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_tag.w1.en, mem_w1_1.en @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_tag.w1.addr, mem_w1.addr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_tag.w1.clk, mem_w1.clk @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_tag.w1.en, mem_w1.en @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_r0.data.body, mem_body.r0.data @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_body.w1.data, mem_w1_1.data.body @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_body.w1.mask, mem_w1_1.mask.body @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_body.w1.data, mem_w1.data.body @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_body.w1.mask, mem_w1.mask.body @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_body.r0.addr, mem_r0.addr @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_body.r0.clk, mem_r0.clk @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_body.r0.en, mem_r0.en @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_body.w1.addr, mem_w1_1.addr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_body.w1.clk, mem_w1_1.clk @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_body.w1.en, mem_w1_1.en @[module-XXXXXXXXXX.rs 14:1]
|
||||
wire mem_w1: Ty9 @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1_1.addr, mem_w1.addr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1_1.en, mem_w1.en @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1_1.clk, mem_w1.clk @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1_1.data, mem_w1.data @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1_1.mask.tag, mem_w1.mask @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1_1.mask.body, mem_w1.mask @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_body.w1.addr, mem_w1.addr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_body.w1.clk, mem_w1.clk @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_body.w1.en, mem_w1.en @[module-XXXXXXXXXX.rs 14:1]
|
||||
wire mem_w1_1: Ty9 @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1.addr, mem_w1_1.addr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1.en, mem_w1_1.en @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1.clk, mem_w1_1.clk @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1.data, mem_w1_1.data @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1.mask.tag, mem_w1_1.mask @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1.mask.body, mem_w1_1.mask @[module-XXXXXXXXXX.rs 14:1]
|
||||
; connect different types:
|
||||
; lhs: UInt<4>
|
||||
; rhs: UInt<8>
|
||||
|
@ -2653,11 +2653,11 @@ circuit check_memory_of_enum: %[[
|
|||
; connect different types:
|
||||
; lhs: UInt<4>
|
||||
; rhs: UInt<8>
|
||||
connect mem_w1.addr, waddr @[module-XXXXXXXXXX.rs 15:1]
|
||||
connect mem_w1.en, UInt<1>(0h1) @[module-XXXXXXXXXX.rs 16:1]
|
||||
connect mem_w1.clk, clk @[module-XXXXXXXXXX.rs 17:1]
|
||||
connect mem_w1.data, wdata @[module-XXXXXXXXXX.rs 18:1]
|
||||
connect mem_w1.mask, wmask @[module-XXXXXXXXXX.rs 19:1]
|
||||
connect mem_w1_1.addr, waddr @[module-XXXXXXXXXX.rs 15:1]
|
||||
connect mem_w1_1.en, UInt<1>(0h1) @[module-XXXXXXXXXX.rs 16:1]
|
||||
connect mem_w1_1.clk, clk @[module-XXXXXXXXXX.rs 17:1]
|
||||
connect mem_w1_1.data, wdata @[module-XXXXXXXXXX.rs 18:1]
|
||||
connect mem_w1_1.mask, wmask @[module-XXXXXXXXXX.rs 19:1]
|
||||
"#,
|
||||
"/test/check_memory_of_enum/mem_body.mem": r"00
|
||||
01
|
||||
|
@ -2748,32 +2748,32 @@ circuit check_memory_of_enum: %[[
|
|||
reader => r0
|
||||
writer => w1
|
||||
wire mem_r0: Ty1 @[module-XXXXXXXXXX.rs 9:1]
|
||||
wire mem_w1_1: Ty3 @[module-XXXXXXXXXX.rs 14:1]
|
||||
wire mem_w1: Ty3 @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_r0.data.tag, mem_tag.r0.data @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_tag.w1.data, mem_w1_1.data.tag @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_tag.w1.mask, mem_w1_1.mask.tag @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_tag.w1.data, mem_w1.data.tag @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_tag.w1.mask, mem_w1.mask.tag @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_tag.r0.addr, mem_r0.addr @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_tag.r0.clk, mem_r0.clk @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_tag.r0.en, mem_r0.en @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_tag.w1.addr, mem_w1_1.addr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_tag.w1.clk, mem_w1_1.clk @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_tag.w1.en, mem_w1_1.en @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_tag.w1.addr, mem_w1.addr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_tag.w1.clk, mem_w1.clk @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_tag.w1.en, mem_w1.en @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_r0.data.body, mem_body.r0.data @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_body.w1.data, mem_w1_1.data.body @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_body.w1.mask, mem_w1_1.mask.body @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_body.w1.data, mem_w1.data.body @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_body.w1.mask, mem_w1.mask.body @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_body.r0.addr, mem_r0.addr @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_body.r0.clk, mem_r0.clk @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_body.r0.en, mem_r0.en @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_body.w1.addr, mem_w1_1.addr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_body.w1.clk, mem_w1_1.clk @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_body.w1.en, mem_w1_1.en @[module-XXXXXXXXXX.rs 14:1]
|
||||
wire mem_w1: Ty8 @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1_1.addr, mem_w1.addr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1_1.en, mem_w1.en @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1_1.clk, mem_w1.clk @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1_1.data, mem_w1.data @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1_1.mask.tag, mem_w1.mask @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1_1.mask.body, mem_w1.mask @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_body.w1.addr, mem_w1.addr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_body.w1.clk, mem_w1.clk @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_body.w1.en, mem_w1.en @[module-XXXXXXXXXX.rs 14:1]
|
||||
wire mem_w1_1: Ty8 @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1.addr, mem_w1_1.addr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1.en, mem_w1_1.en @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1.clk, mem_w1_1.clk @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1.data, mem_w1_1.data @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1.mask.tag, mem_w1_1.mask @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_w1.mask.body, mem_w1_1.mask @[module-XXXXXXXXXX.rs 14:1]
|
||||
; connect different types:
|
||||
; lhs: UInt<4>
|
||||
; rhs: UInt<8>
|
||||
|
@ -2784,11 +2784,11 @@ circuit check_memory_of_enum: %[[
|
|||
; connect different types:
|
||||
; lhs: UInt<4>
|
||||
; rhs: UInt<8>
|
||||
connect mem_w1.addr, waddr @[module-XXXXXXXXXX.rs 15:1]
|
||||
connect mem_w1.en, UInt<1>(0h1) @[module-XXXXXXXXXX.rs 16:1]
|
||||
connect mem_w1.clk, clk @[module-XXXXXXXXXX.rs 17:1]
|
||||
connect mem_w1.data, wdata @[module-XXXXXXXXXX.rs 18:1]
|
||||
connect mem_w1.mask, wmask @[module-XXXXXXXXXX.rs 19:1]
|
||||
connect mem_w1_1.addr, waddr @[module-XXXXXXXXXX.rs 15:1]
|
||||
connect mem_w1_1.en, UInt<1>(0h1) @[module-XXXXXXXXXX.rs 16:1]
|
||||
connect mem_w1_1.clk, clk @[module-XXXXXXXXXX.rs 17:1]
|
||||
connect mem_w1_1.data, wdata @[module-XXXXXXXXXX.rs 18:1]
|
||||
connect mem_w1_1.mask, wmask @[module-XXXXXXXXXX.rs 19:1]
|
||||
"#,
|
||||
"/test/check_memory_of_enum/mem_body.mem": r"00
|
||||
01
|
||||
|
@ -2950,7 +2950,7 @@ circuit check_memory_of_array_of_enum:
|
|||
input wdata: Ty0[2] @[module-XXXXXXXXXX.rs 5:1]
|
||||
input wmask: UInt<1>[2] @[module-XXXXXXXXXX.rs 6:1]
|
||||
input clk: Clock @[module-XXXXXXXXXX.rs 7:1]
|
||||
mem mem_1: @[module-XXXXXXXXXX.rs 8:1]
|
||||
mem `mem`: @[module-XXXXXXXXXX.rs 8:1]
|
||||
data-type => UInt<10>[2]
|
||||
depth => 256
|
||||
read-latency => 0
|
||||
|
@ -2962,10 +2962,10 @@ circuit check_memory_of_array_of_enum:
|
|||
wire mem_w1: Ty2 @[module-XXXXXXXXXX.rs 14:1]
|
||||
wire _cast_bits_to_enum_expr: Ty0
|
||||
wire _cast_bits_to_enum_expr_body: UInt<8>
|
||||
connect _cast_bits_to_enum_expr_body, head(mem_1.r0.data[0], 8)
|
||||
when eq(UInt<2>(0), tail(mem_1.r0.data[0], 8)):
|
||||
connect _cast_bits_to_enum_expr_body, head(`mem`.r0.data[0], 8)
|
||||
when eq(UInt<2>(0), tail(`mem`.r0.data[0], 8)):
|
||||
connect _cast_bits_to_enum_expr, {|A, B: UInt<8>, C: UInt<1>[3]|}(A)
|
||||
else when eq(UInt<2>(1), tail(mem_1.r0.data[0], 8)):
|
||||
else when eq(UInt<2>(1), tail(`mem`.r0.data[0], 8)):
|
||||
connect _cast_bits_to_enum_expr, {|A, B: UInt<8>, C: UInt<1>[3]|}(B, _cast_bits_to_enum_expr_body)
|
||||
else:
|
||||
wire _cast_bits_to_array_expr: UInt<1>[3]
|
||||
|
@ -2980,10 +2980,10 @@ circuit check_memory_of_array_of_enum:
|
|||
connect mem_r0.data[0], _cast_bits_to_enum_expr @[module-XXXXXXXXXX.rs 9:1]
|
||||
wire _cast_bits_to_enum_expr_1: Ty0
|
||||
wire _cast_bits_to_enum_expr_body_1: UInt<8>
|
||||
connect _cast_bits_to_enum_expr_body_1, head(mem_1.r0.data[1], 8)
|
||||
when eq(UInt<2>(0), tail(mem_1.r0.data[1], 8)):
|
||||
connect _cast_bits_to_enum_expr_body_1, head(`mem`.r0.data[1], 8)
|
||||
when eq(UInt<2>(0), tail(`mem`.r0.data[1], 8)):
|
||||
connect _cast_bits_to_enum_expr_1, {|A, B: UInt<8>, C: UInt<1>[3]|}(A)
|
||||
else when eq(UInt<2>(1), tail(mem_1.r0.data[1], 8)):
|
||||
else when eq(UInt<2>(1), tail(`mem`.r0.data[1], 8)):
|
||||
connect _cast_bits_to_enum_expr_1, {|A, B: UInt<8>, C: UInt<1>[3]|}(B, _cast_bits_to_enum_expr_body_1)
|
||||
else:
|
||||
wire _cast_bits_to_array_expr_1: UInt<1>[3]
|
||||
|
@ -3010,8 +3010,8 @@ circuit check_memory_of_array_of_enum:
|
|||
wire _cast_to_bits_expr: UInt<3>
|
||||
connect _cast_to_bits_expr, cat(_cast_array_to_bits_expr[2], cat(_cast_array_to_bits_expr[1], _cast_array_to_bits_expr[0]))
|
||||
connect _cast_enum_to_bits_expr, pad(cat(_cast_to_bits_expr, UInt<2>(2)), 10)
|
||||
connect mem_1.w1.data[0], _cast_enum_to_bits_expr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.w1.mask[0], mem_w1.mask[0] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.data[0], _cast_enum_to_bits_expr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.mask[0], mem_w1.mask[0] @[module-XXXXXXXXXX.rs 14:1]
|
||||
wire _cast_enum_to_bits_expr_1: UInt<10>
|
||||
match mem_w1.data[1]:
|
||||
A:
|
||||
|
@ -3026,14 +3026,14 @@ circuit check_memory_of_array_of_enum:
|
|||
wire _cast_to_bits_expr_1: UInt<3>
|
||||
connect _cast_to_bits_expr_1, cat(_cast_array_to_bits_expr_1[2], cat(_cast_array_to_bits_expr_1[1], _cast_array_to_bits_expr_1[0]))
|
||||
connect _cast_enum_to_bits_expr_1, pad(cat(_cast_to_bits_expr_1, UInt<2>(2)), 10)
|
||||
connect mem_1.w1.data[1], _cast_enum_to_bits_expr_1 @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.w1.mask[1], mem_w1.mask[1] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.r0.addr, mem_r0.addr @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_1.r0.clk, mem_r0.clk @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_1.r0.en, mem_r0.en @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect mem_1.w1.addr, mem_w1.addr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.w1.clk, mem_w1.clk @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_1.w1.en, mem_w1.en @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.data[1], _cast_enum_to_bits_expr_1 @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.mask[1], mem_w1.mask[1] @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.r0.addr, mem_r0.addr @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect `mem`.r0.clk, mem_r0.clk @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect `mem`.r0.en, mem_r0.en @[module-XXXXXXXXXX.rs 9:1]
|
||||
connect `mem`.w1.addr, mem_w1.addr @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.clk, mem_w1.clk @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect `mem`.w1.en, mem_w1.en @[module-XXXXXXXXXX.rs 14:1]
|
||||
connect mem_r0.addr, raddr @[module-XXXXXXXXXX.rs 10:1]
|
||||
connect mem_r0.en, UInt<1>(0h1) @[module-XXXXXXXXXX.rs 11:1]
|
||||
connect mem_r0.clk, clk @[module-XXXXXXXXXX.rs 12:1]
|
||||
|
@ -3344,11 +3344,11 @@ circuit check_uninit:
|
|||
simplify_enums: None,
|
||||
..ExportOptions::default()
|
||||
},
|
||||
"/test/check_uninit_1.fir": r"FIRRTL version 3.2.0
|
||||
circuit check_uninit_1:
|
||||
"/test/check_uninit.fir": r"FIRRTL version 3.2.0
|
||||
circuit check_uninit:
|
||||
type Ty0 = {}
|
||||
type Ty1 = {|HdlNone, HdlSome: Ty0|}
|
||||
module check_uninit_1: @[module-XXXXXXXXXX.rs 1:1]
|
||||
module check_uninit: @[module-XXXXXXXXXX.rs 1:1]
|
||||
output o: Ty1[3] @[module-XXXXXXXXXX.rs 2:1]
|
||||
wire _uninit_expr: Ty1[3]
|
||||
invalidate _uninit_expr
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
"$kind": "Struct",
|
||||
"$constructor": "ModuleIO::new_unchecked",
|
||||
"containing_module_name_id()": "Visible",
|
||||
"name()": "Visible",
|
||||
"name_id()": "Visible",
|
||||
"source_location()": "Visible",
|
||||
"is_input()": "Visible",
|
||||
"ty()": "Visible"
|
||||
|
|
Loading…
Reference in a new issue