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

This commit is contained in:
Jacob Lifshay 2024-10-07 19:06:01 -07:00
parent eed0afc6ab
commit 30b9a5e48d
Signed by: programmerjake
SSH key fingerprint: SHA256:B1iRVvUJkvd7upMIiMqn6OyxvD2SgJkAH3ZnUOj6z+c
6 changed files with 204 additions and 279 deletions

View file

@ -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!(

View file

@ -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,
}

View file

@ -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);

View file

@ -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(),
},
);

View file

@ -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

View file

@ -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"