986 lines
37 KiB
Rust
986 lines
37 KiB
Rust
// SPDX-License-Identifier: LGPL-3.0-or-later
|
|
// See Notices.txt for copyright information
|
|
use fayalite::{int::UIntValue, prelude::*, sim::Simulation};
|
|
|
|
#[hdl_module(outline_generated)]
|
|
pub fn connect_const() {
|
|
#[hdl]
|
|
let o: UInt<8> = m.output();
|
|
connect(o, 5u8);
|
|
}
|
|
|
|
#[test]
|
|
fn test_connect_const() {
|
|
let _n = SourceLocation::normalize_files_for_tests();
|
|
let mut sim = Simulation::new(connect_const());
|
|
sim.settle_step();
|
|
let sim_debug = format!("{sim:#?}");
|
|
println!("#######\n{sim_debug}\n#######");
|
|
if sim_debug
|
|
!= r#"Simulation {
|
|
state: State {
|
|
insns: Insns {
|
|
state_layout: StateLayout {
|
|
ty: TypeLayout {
|
|
small_slots: StatePartAllocationLayout<SmallSlots> {
|
|
len: 0,
|
|
debug_data: [],
|
|
..
|
|
},
|
|
big_slots: StatePartAllocationLayout<BigSlots> {
|
|
len: 2,
|
|
debug_data: [
|
|
SlotDebugData {
|
|
name: "InstantiatedModule(connect_const: connect_const).connect_const::o",
|
|
ty: UInt<8>,
|
|
},
|
|
SlotDebugData {
|
|
name: "",
|
|
ty: UInt<8>,
|
|
},
|
|
],
|
|
..
|
|
},
|
|
},
|
|
},
|
|
insns: [
|
|
// at: module-XXXXXXXXXX.rs:1:1
|
|
Const {
|
|
dest: StatePartIndex<BigSlots>(1), // SlotDebugData { name: "", ty: UInt<8> },
|
|
value: 5,
|
|
},
|
|
// at: module-XXXXXXXXXX.rs:3:1
|
|
Copy {
|
|
dest: StatePartIndex<BigSlots>(0), // SlotDebugData { name: "InstantiatedModule(connect_const: connect_const).connect_const::o", ty: UInt<8> },
|
|
src: StatePartIndex<BigSlots>(1), // SlotDebugData { name: "", ty: UInt<8> },
|
|
},
|
|
// at: module-XXXXXXXXXX.rs:1:1
|
|
Return,
|
|
],
|
|
..
|
|
},
|
|
pc: 2,
|
|
small_slots: StatePart {
|
|
value: [],
|
|
},
|
|
big_slots: StatePart {
|
|
value: [
|
|
5,
|
|
5,
|
|
],
|
|
},
|
|
},
|
|
io: Instance {
|
|
name: <simulator>::connect_const,
|
|
instantiated: Module {
|
|
name: connect_const,
|
|
..
|
|
},
|
|
},
|
|
uninitialized_inputs: {},
|
|
io_targets: {
|
|
Instance {
|
|
name: <simulator>::connect_const,
|
|
instantiated: Module {
|
|
name: connect_const,
|
|
..
|
|
},
|
|
}.o: CompiledValue {
|
|
layout: CompiledTypeLayout {
|
|
ty: UInt<8>,
|
|
layout: TypeLayout {
|
|
small_slots: StatePartAllocationLayout<SmallSlots> {
|
|
len: 0,
|
|
debug_data: [],
|
|
..
|
|
},
|
|
big_slots: StatePartAllocationLayout<BigSlots> {
|
|
len: 1,
|
|
debug_data: [
|
|
SlotDebugData {
|
|
name: "InstantiatedModule(connect_const: connect_const).connect_const::o",
|
|
ty: UInt<8>,
|
|
},
|
|
],
|
|
..
|
|
},
|
|
},
|
|
body: Scalar,
|
|
},
|
|
range: TypeIndexRange {
|
|
small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
|
|
big_slots: StatePartIndexRange<BigSlots> { start: 0, len: 1 },
|
|
},
|
|
write: None,
|
|
},
|
|
},
|
|
made_initial_step: true,
|
|
trace_decls: TraceModule {
|
|
name: "connect_const",
|
|
children: [
|
|
TraceModuleIO {
|
|
name: "o",
|
|
child: TraceUInt {
|
|
id: TraceScalarId(0),
|
|
name: "o",
|
|
ty: UInt<8>,
|
|
flow: Sink,
|
|
},
|
|
ty: UInt<8>,
|
|
flow: Sink,
|
|
},
|
|
],
|
|
},
|
|
traces: [
|
|
SimTrace {
|
|
id: TraceScalarId(0),
|
|
kind: BigUInt {
|
|
index: StatePartIndex<BigSlots>(0),
|
|
ty: UInt<8>,
|
|
},
|
|
state: 0x05,
|
|
last_state: 0x05,
|
|
},
|
|
],
|
|
trace_writers: [],
|
|
instant: 0 s,
|
|
}"# {
|
|
panic!();
|
|
}
|
|
assert_eq!(sim.read_bool_or_int(sim.io().o), UIntValue::from(5u8));
|
|
}
|
|
|
|
#[hdl_module(outline_generated)]
|
|
pub fn mod1_child() {
|
|
#[hdl]
|
|
let i: UInt<4> = m.input();
|
|
#[hdl]
|
|
let o: SInt<2> = m.output();
|
|
#[hdl]
|
|
let i2: SInt<2> = m.input();
|
|
#[hdl]
|
|
let o2: UInt<4> = m.output();
|
|
connect(o, i.cast_to_static());
|
|
connect(o2, i2.cast_to_static());
|
|
#[hdl]
|
|
if i.cmp_gt(5_hdl_u4) {
|
|
connect(o2, 0xF_hdl_u4);
|
|
}
|
|
}
|
|
|
|
#[hdl_module(outline_generated)]
|
|
pub fn mod1() {
|
|
#[hdl]
|
|
let child = instance(mod1_child());
|
|
#[hdl]
|
|
let o: mod1_child = m.output(Expr::ty(child));
|
|
connect(o, child);
|
|
}
|
|
|
|
#[hdl]
|
|
#[test]
|
|
fn test_mod1() {
|
|
let _n = SourceLocation::normalize_files_for_tests();
|
|
let mut sim = Simulation::new(mod1());
|
|
sim.write_bool_or_int(sim.io().o.i, 0xA_hdl_u4);
|
|
sim.write_bool_or_int(sim.io().o.i2, -2_hdl_i2);
|
|
sim.settle_step();
|
|
let sim_debug = format!("{sim:#?}");
|
|
println!("#######\n{sim_debug}\n#######");
|
|
if sim_debug
|
|
!= r#"Simulation {
|
|
state: State {
|
|
insns: Insns {
|
|
state_layout: StateLayout {
|
|
ty: TypeLayout {
|
|
small_slots: StatePartAllocationLayout<SmallSlots> {
|
|
len: 0,
|
|
debug_data: [],
|
|
..
|
|
},
|
|
big_slots: StatePartAllocationLayout<BigSlots> {
|
|
len: 17,
|
|
debug_data: [
|
|
SlotDebugData {
|
|
name: "InstantiatedModule(mod1: mod1).mod1::o.i",
|
|
ty: UInt<4>,
|
|
},
|
|
SlotDebugData {
|
|
name: "InstantiatedModule(mod1: mod1).mod1::o.o",
|
|
ty: SInt<2>,
|
|
},
|
|
SlotDebugData {
|
|
name: "InstantiatedModule(mod1: mod1).mod1::o.i2",
|
|
ty: SInt<2>,
|
|
},
|
|
SlotDebugData {
|
|
name: "InstantiatedModule(mod1: mod1).mod1::o.o2",
|
|
ty: UInt<4>,
|
|
},
|
|
SlotDebugData {
|
|
name: "InstantiatedModule(mod1: mod1).mod1::child.i",
|
|
ty: UInt<4>,
|
|
},
|
|
SlotDebugData {
|
|
name: "InstantiatedModule(mod1: mod1).mod1::child.o",
|
|
ty: SInt<2>,
|
|
},
|
|
SlotDebugData {
|
|
name: "InstantiatedModule(mod1: mod1).mod1::child.i2",
|
|
ty: SInt<2>,
|
|
},
|
|
SlotDebugData {
|
|
name: "InstantiatedModule(mod1: mod1).mod1::child.o2",
|
|
ty: UInt<4>,
|
|
},
|
|
SlotDebugData {
|
|
name: "InstantiatedModule(mod1.child: mod1_child).mod1_child::i",
|
|
ty: UInt<4>,
|
|
},
|
|
SlotDebugData {
|
|
name: "InstantiatedModule(mod1.child: mod1_child).mod1_child::o",
|
|
ty: SInt<2>,
|
|
},
|
|
SlotDebugData {
|
|
name: "InstantiatedModule(mod1.child: mod1_child).mod1_child::i2",
|
|
ty: SInt<2>,
|
|
},
|
|
SlotDebugData {
|
|
name: "InstantiatedModule(mod1.child: mod1_child).mod1_child::o2",
|
|
ty: UInt<4>,
|
|
},
|
|
SlotDebugData {
|
|
name: "",
|
|
ty: SInt<2>,
|
|
},
|
|
SlotDebugData {
|
|
name: "",
|
|
ty: UInt<4>,
|
|
},
|
|
SlotDebugData {
|
|
name: "",
|
|
ty: UInt<4>,
|
|
},
|
|
SlotDebugData {
|
|
name: "",
|
|
ty: Bool,
|
|
},
|
|
SlotDebugData {
|
|
name: "",
|
|
ty: UInt<4>,
|
|
},
|
|
],
|
|
..
|
|
},
|
|
},
|
|
},
|
|
insns: [
|
|
// at: module-XXXXXXXXXX.rs:4:1
|
|
Copy {
|
|
dest: StatePartIndex<BigSlots>(6), // SlotDebugData { name: "InstantiatedModule(mod1: mod1).mod1::child.i2", ty: SInt<2> },
|
|
src: StatePartIndex<BigSlots>(2), // SlotDebugData { name: "InstantiatedModule(mod1: mod1).mod1::o.i2", ty: SInt<2> },
|
|
},
|
|
Copy {
|
|
dest: StatePartIndex<BigSlots>(4), // SlotDebugData { name: "InstantiatedModule(mod1: mod1).mod1::child.i", ty: UInt<4> },
|
|
src: StatePartIndex<BigSlots>(0), // SlotDebugData { name: "InstantiatedModule(mod1: mod1).mod1::o.i", ty: UInt<4> },
|
|
},
|
|
// at: module-XXXXXXXXXX.rs:2:1
|
|
Copy {
|
|
dest: StatePartIndex<BigSlots>(10), // SlotDebugData { name: "InstantiatedModule(mod1.child: mod1_child).mod1_child::i2", ty: SInt<2> },
|
|
src: StatePartIndex<BigSlots>(6), // SlotDebugData { name: "InstantiatedModule(mod1: mod1).mod1::child.i2", ty: SInt<2> },
|
|
},
|
|
Copy {
|
|
dest: StatePartIndex<BigSlots>(8), // SlotDebugData { name: "InstantiatedModule(mod1.child: mod1_child).mod1_child::i", ty: UInt<4> },
|
|
src: StatePartIndex<BigSlots>(4), // SlotDebugData { name: "InstantiatedModule(mod1: mod1).mod1::child.i", ty: UInt<4> },
|
|
},
|
|
// at: module-XXXXXXXXXX-2.rs:1:1
|
|
Const {
|
|
dest: StatePartIndex<BigSlots>(16), // SlotDebugData { name: "", ty: UInt<4> },
|
|
value: 15,
|
|
},
|
|
Const {
|
|
dest: StatePartIndex<BigSlots>(14), // SlotDebugData { name: "", ty: UInt<4> },
|
|
value: 5,
|
|
},
|
|
CmpLt {
|
|
dest: StatePartIndex<BigSlots>(15), // SlotDebugData { name: "", ty: Bool },
|
|
lhs: StatePartIndex<BigSlots>(14), // SlotDebugData { name: "", ty: UInt<4> },
|
|
rhs: StatePartIndex<BigSlots>(8), // SlotDebugData { name: "InstantiatedModule(mod1.child: mod1_child).mod1_child::i", ty: UInt<4> },
|
|
},
|
|
CastToUInt {
|
|
dest: StatePartIndex<BigSlots>(13), // SlotDebugData { name: "", ty: UInt<4> },
|
|
src: StatePartIndex<BigSlots>(10), // SlotDebugData { name: "InstantiatedModule(mod1.child: mod1_child).mod1_child::i2", ty: SInt<2> },
|
|
dest_width: 4,
|
|
},
|
|
// at: module-XXXXXXXXXX-2.rs:7:1
|
|
Copy {
|
|
dest: StatePartIndex<BigSlots>(11), // SlotDebugData { name: "InstantiatedModule(mod1.child: mod1_child).mod1_child::o2", ty: UInt<4> },
|
|
src: StatePartIndex<BigSlots>(13), // SlotDebugData { name: "", ty: UInt<4> },
|
|
},
|
|
// at: module-XXXXXXXXXX-2.rs:8:1
|
|
BranchIfZero {
|
|
target: 11,
|
|
value: StatePartIndex<BigSlots>(15), // SlotDebugData { name: "", ty: Bool },
|
|
},
|
|
// at: module-XXXXXXXXXX-2.rs:9:1
|
|
Copy {
|
|
dest: StatePartIndex<BigSlots>(11), // SlotDebugData { name: "InstantiatedModule(mod1.child: mod1_child).mod1_child::o2", ty: UInt<4> },
|
|
src: StatePartIndex<BigSlots>(16), // SlotDebugData { name: "", ty: UInt<4> },
|
|
},
|
|
// at: module-XXXXXXXXXX.rs:2:1
|
|
Copy {
|
|
dest: StatePartIndex<BigSlots>(7), // SlotDebugData { name: "InstantiatedModule(mod1: mod1).mod1::child.o2", ty: UInt<4> },
|
|
src: StatePartIndex<BigSlots>(11), // SlotDebugData { name: "InstantiatedModule(mod1.child: mod1_child).mod1_child::o2", ty: UInt<4> },
|
|
},
|
|
// at: module-XXXXXXXXXX.rs:4:1
|
|
Copy {
|
|
dest: StatePartIndex<BigSlots>(3), // SlotDebugData { name: "InstantiatedModule(mod1: mod1).mod1::o.o2", ty: UInt<4> },
|
|
src: StatePartIndex<BigSlots>(7), // SlotDebugData { name: "InstantiatedModule(mod1: mod1).mod1::child.o2", ty: UInt<4> },
|
|
},
|
|
// at: module-XXXXXXXXXX-2.rs:1:1
|
|
CastToSInt {
|
|
dest: StatePartIndex<BigSlots>(12), // SlotDebugData { name: "", ty: SInt<2> },
|
|
src: StatePartIndex<BigSlots>(8), // SlotDebugData { name: "InstantiatedModule(mod1.child: mod1_child).mod1_child::i", ty: UInt<4> },
|
|
dest_width: 2,
|
|
},
|
|
// at: module-XXXXXXXXXX-2.rs:6:1
|
|
Copy {
|
|
dest: StatePartIndex<BigSlots>(9), // SlotDebugData { name: "InstantiatedModule(mod1.child: mod1_child).mod1_child::o", ty: SInt<2> },
|
|
src: StatePartIndex<BigSlots>(12), // SlotDebugData { name: "", ty: SInt<2> },
|
|
},
|
|
// at: module-XXXXXXXXXX.rs:2:1
|
|
Copy {
|
|
dest: StatePartIndex<BigSlots>(5), // SlotDebugData { name: "InstantiatedModule(mod1: mod1).mod1::child.o", ty: SInt<2> },
|
|
src: StatePartIndex<BigSlots>(9), // SlotDebugData { name: "InstantiatedModule(mod1.child: mod1_child).mod1_child::o", ty: SInt<2> },
|
|
},
|
|
// at: module-XXXXXXXXXX.rs:4:1
|
|
Copy {
|
|
dest: StatePartIndex<BigSlots>(1), // SlotDebugData { name: "InstantiatedModule(mod1: mod1).mod1::o.o", ty: SInt<2> },
|
|
src: StatePartIndex<BigSlots>(5), // SlotDebugData { name: "InstantiatedModule(mod1: mod1).mod1::child.o", ty: SInt<2> },
|
|
},
|
|
// at: module-XXXXXXXXXX.rs:1:1
|
|
Return,
|
|
],
|
|
..
|
|
},
|
|
pc: 17,
|
|
small_slots: StatePart {
|
|
value: [],
|
|
},
|
|
big_slots: StatePart {
|
|
value: [
|
|
10,
|
|
-2,
|
|
-2,
|
|
15,
|
|
10,
|
|
-2,
|
|
-2,
|
|
15,
|
|
10,
|
|
-2,
|
|
-2,
|
|
15,
|
|
-2,
|
|
14,
|
|
5,
|
|
1,
|
|
15,
|
|
],
|
|
},
|
|
},
|
|
io: Instance {
|
|
name: <simulator>::mod1,
|
|
instantiated: Module {
|
|
name: mod1,
|
|
..
|
|
},
|
|
},
|
|
uninitialized_inputs: {},
|
|
io_targets: {
|
|
Instance {
|
|
name: <simulator>::mod1,
|
|
instantiated: Module {
|
|
name: mod1,
|
|
..
|
|
},
|
|
}.o: CompiledValue {
|
|
layout: CompiledTypeLayout {
|
|
ty: Bundle {
|
|
#[hdl(flip)] /* offset = 0 */
|
|
i: UInt<4>,
|
|
/* offset = 4 */
|
|
o: SInt<2>,
|
|
#[hdl(flip)] /* offset = 6 */
|
|
i2: SInt<2>,
|
|
/* offset = 8 */
|
|
o2: UInt<4>,
|
|
},
|
|
layout: TypeLayout {
|
|
small_slots: StatePartAllocationLayout<SmallSlots> {
|
|
len: 0,
|
|
debug_data: [],
|
|
..
|
|
},
|
|
big_slots: StatePartAllocationLayout<BigSlots> {
|
|
len: 4,
|
|
debug_data: [
|
|
SlotDebugData {
|
|
name: "InstantiatedModule(mod1: mod1).mod1::o.i",
|
|
ty: UInt<4>,
|
|
},
|
|
SlotDebugData {
|
|
name: "InstantiatedModule(mod1: mod1).mod1::o.o",
|
|
ty: SInt<2>,
|
|
},
|
|
SlotDebugData {
|
|
name: "InstantiatedModule(mod1: mod1).mod1::o.i2",
|
|
ty: SInt<2>,
|
|
},
|
|
SlotDebugData {
|
|
name: "InstantiatedModule(mod1: mod1).mod1::o.o2",
|
|
ty: UInt<4>,
|
|
},
|
|
],
|
|
..
|
|
},
|
|
},
|
|
body: Bundle {
|
|
fields: [
|
|
CompiledBundleField {
|
|
offset: TypeIndex {
|
|
small_slots: StatePartIndex<SmallSlots>(0),
|
|
big_slots: StatePartIndex<BigSlots>(0),
|
|
},
|
|
ty: CompiledTypeLayout {
|
|
ty: UInt<4>,
|
|
layout: TypeLayout {
|
|
small_slots: StatePartAllocationLayout<SmallSlots> {
|
|
len: 0,
|
|
debug_data: [],
|
|
..
|
|
},
|
|
big_slots: StatePartAllocationLayout<BigSlots> {
|
|
len: 1,
|
|
debug_data: [
|
|
SlotDebugData {
|
|
name: "",
|
|
ty: UInt<4>,
|
|
},
|
|
],
|
|
..
|
|
},
|
|
},
|
|
body: Scalar,
|
|
},
|
|
},
|
|
CompiledBundleField {
|
|
offset: TypeIndex {
|
|
small_slots: StatePartIndex<SmallSlots>(0),
|
|
big_slots: StatePartIndex<BigSlots>(1),
|
|
},
|
|
ty: CompiledTypeLayout {
|
|
ty: SInt<2>,
|
|
layout: TypeLayout {
|
|
small_slots: StatePartAllocationLayout<SmallSlots> {
|
|
len: 0,
|
|
debug_data: [],
|
|
..
|
|
},
|
|
big_slots: StatePartAllocationLayout<BigSlots> {
|
|
len: 1,
|
|
debug_data: [
|
|
SlotDebugData {
|
|
name: "",
|
|
ty: SInt<2>,
|
|
},
|
|
],
|
|
..
|
|
},
|
|
},
|
|
body: Scalar,
|
|
},
|
|
},
|
|
CompiledBundleField {
|
|
offset: TypeIndex {
|
|
small_slots: StatePartIndex<SmallSlots>(0),
|
|
big_slots: StatePartIndex<BigSlots>(2),
|
|
},
|
|
ty: CompiledTypeLayout {
|
|
ty: SInt<2>,
|
|
layout: TypeLayout {
|
|
small_slots: StatePartAllocationLayout<SmallSlots> {
|
|
len: 0,
|
|
debug_data: [],
|
|
..
|
|
},
|
|
big_slots: StatePartAllocationLayout<BigSlots> {
|
|
len: 1,
|
|
debug_data: [
|
|
SlotDebugData {
|
|
name: "",
|
|
ty: SInt<2>,
|
|
},
|
|
],
|
|
..
|
|
},
|
|
},
|
|
body: Scalar,
|
|
},
|
|
},
|
|
CompiledBundleField {
|
|
offset: TypeIndex {
|
|
small_slots: StatePartIndex<SmallSlots>(0),
|
|
big_slots: StatePartIndex<BigSlots>(3),
|
|
},
|
|
ty: CompiledTypeLayout {
|
|
ty: UInt<4>,
|
|
layout: TypeLayout {
|
|
small_slots: StatePartAllocationLayout<SmallSlots> {
|
|
len: 0,
|
|
debug_data: [],
|
|
..
|
|
},
|
|
big_slots: StatePartAllocationLayout<BigSlots> {
|
|
len: 1,
|
|
debug_data: [
|
|
SlotDebugData {
|
|
name: "",
|
|
ty: UInt<4>,
|
|
},
|
|
],
|
|
..
|
|
},
|
|
},
|
|
body: Scalar,
|
|
},
|
|
},
|
|
],
|
|
},
|
|
},
|
|
range: TypeIndexRange {
|
|
small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
|
|
big_slots: StatePartIndexRange<BigSlots> { start: 0, len: 4 },
|
|
},
|
|
write: None,
|
|
},
|
|
Instance {
|
|
name: <simulator>::mod1,
|
|
instantiated: Module {
|
|
name: mod1,
|
|
..
|
|
},
|
|
}.o.i: CompiledValue {
|
|
layout: CompiledTypeLayout {
|
|
ty: UInt<4>,
|
|
layout: TypeLayout {
|
|
small_slots: StatePartAllocationLayout<SmallSlots> {
|
|
len: 0,
|
|
debug_data: [],
|
|
..
|
|
},
|
|
big_slots: StatePartAllocationLayout<BigSlots> {
|
|
len: 1,
|
|
debug_data: [
|
|
SlotDebugData {
|
|
name: "",
|
|
ty: UInt<4>,
|
|
},
|
|
],
|
|
..
|
|
},
|
|
},
|
|
body: Scalar,
|
|
},
|
|
range: TypeIndexRange {
|
|
small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
|
|
big_slots: StatePartIndexRange<BigSlots> { start: 0, len: 1 },
|
|
},
|
|
write: None,
|
|
},
|
|
Instance {
|
|
name: <simulator>::mod1,
|
|
instantiated: Module {
|
|
name: mod1,
|
|
..
|
|
},
|
|
}.o.i2: CompiledValue {
|
|
layout: CompiledTypeLayout {
|
|
ty: SInt<2>,
|
|
layout: TypeLayout {
|
|
small_slots: StatePartAllocationLayout<SmallSlots> {
|
|
len: 0,
|
|
debug_data: [],
|
|
..
|
|
},
|
|
big_slots: StatePartAllocationLayout<BigSlots> {
|
|
len: 1,
|
|
debug_data: [
|
|
SlotDebugData {
|
|
name: "",
|
|
ty: SInt<2>,
|
|
},
|
|
],
|
|
..
|
|
},
|
|
},
|
|
body: Scalar,
|
|
},
|
|
range: TypeIndexRange {
|
|
small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
|
|
big_slots: StatePartIndexRange<BigSlots> { start: 2, len: 1 },
|
|
},
|
|
write: None,
|
|
},
|
|
Instance {
|
|
name: <simulator>::mod1,
|
|
instantiated: Module {
|
|
name: mod1,
|
|
..
|
|
},
|
|
}.o.o: CompiledValue {
|
|
layout: CompiledTypeLayout {
|
|
ty: SInt<2>,
|
|
layout: TypeLayout {
|
|
small_slots: StatePartAllocationLayout<SmallSlots> {
|
|
len: 0,
|
|
debug_data: [],
|
|
..
|
|
},
|
|
big_slots: StatePartAllocationLayout<BigSlots> {
|
|
len: 1,
|
|
debug_data: [
|
|
SlotDebugData {
|
|
name: "",
|
|
ty: SInt<2>,
|
|
},
|
|
],
|
|
..
|
|
},
|
|
},
|
|
body: Scalar,
|
|
},
|
|
range: TypeIndexRange {
|
|
small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
|
|
big_slots: StatePartIndexRange<BigSlots> { start: 1, len: 1 },
|
|
},
|
|
write: None,
|
|
},
|
|
Instance {
|
|
name: <simulator>::mod1,
|
|
instantiated: Module {
|
|
name: mod1,
|
|
..
|
|
},
|
|
}.o.o2: CompiledValue {
|
|
layout: CompiledTypeLayout {
|
|
ty: UInt<4>,
|
|
layout: TypeLayout {
|
|
small_slots: StatePartAllocationLayout<SmallSlots> {
|
|
len: 0,
|
|
debug_data: [],
|
|
..
|
|
},
|
|
big_slots: StatePartAllocationLayout<BigSlots> {
|
|
len: 1,
|
|
debug_data: [
|
|
SlotDebugData {
|
|
name: "",
|
|
ty: UInt<4>,
|
|
},
|
|
],
|
|
..
|
|
},
|
|
},
|
|
body: Scalar,
|
|
},
|
|
range: TypeIndexRange {
|
|
small_slots: StatePartIndexRange<SmallSlots> { start: 0, len: 0 },
|
|
big_slots: StatePartIndexRange<BigSlots> { start: 3, len: 1 },
|
|
},
|
|
write: None,
|
|
},
|
|
},
|
|
made_initial_step: true,
|
|
trace_decls: TraceModule {
|
|
name: "mod1",
|
|
children: [
|
|
TraceModuleIO {
|
|
name: "o",
|
|
child: TraceBundle {
|
|
name: "o",
|
|
fields: [
|
|
TraceUInt {
|
|
id: TraceScalarId(0),
|
|
name: "i",
|
|
ty: UInt<4>,
|
|
flow: Source,
|
|
},
|
|
TraceSInt {
|
|
id: TraceScalarId(1),
|
|
name: "o",
|
|
ty: SInt<2>,
|
|
flow: Sink,
|
|
},
|
|
TraceSInt {
|
|
id: TraceScalarId(2),
|
|
name: "i2",
|
|
ty: SInt<2>,
|
|
flow: Source,
|
|
},
|
|
TraceUInt {
|
|
id: TraceScalarId(3),
|
|
name: "o2",
|
|
ty: UInt<4>,
|
|
flow: Sink,
|
|
},
|
|
],
|
|
ty: Bundle {
|
|
#[hdl(flip)] /* offset = 0 */
|
|
i: UInt<4>,
|
|
/* offset = 4 */
|
|
o: SInt<2>,
|
|
#[hdl(flip)] /* offset = 6 */
|
|
i2: SInt<2>,
|
|
/* offset = 8 */
|
|
o2: UInt<4>,
|
|
},
|
|
flow: Sink,
|
|
},
|
|
ty: Bundle {
|
|
#[hdl(flip)] /* offset = 0 */
|
|
i: UInt<4>,
|
|
/* offset = 4 */
|
|
o: SInt<2>,
|
|
#[hdl(flip)] /* offset = 6 */
|
|
i2: SInt<2>,
|
|
/* offset = 8 */
|
|
o2: UInt<4>,
|
|
},
|
|
flow: Sink,
|
|
},
|
|
TraceInstance {
|
|
name: "child",
|
|
instance_io: TraceBundle {
|
|
name: "child",
|
|
fields: [
|
|
TraceUInt {
|
|
id: TraceScalarId(8),
|
|
name: "i",
|
|
ty: UInt<4>,
|
|
flow: Sink,
|
|
},
|
|
TraceSInt {
|
|
id: TraceScalarId(9),
|
|
name: "o",
|
|
ty: SInt<2>,
|
|
flow: Source,
|
|
},
|
|
TraceSInt {
|
|
id: TraceScalarId(10),
|
|
name: "i2",
|
|
ty: SInt<2>,
|
|
flow: Sink,
|
|
},
|
|
TraceUInt {
|
|
id: TraceScalarId(11),
|
|
name: "o2",
|
|
ty: UInt<4>,
|
|
flow: Source,
|
|
},
|
|
],
|
|
ty: Bundle {
|
|
#[hdl(flip)] /* offset = 0 */
|
|
i: UInt<4>,
|
|
/* offset = 4 */
|
|
o: SInt<2>,
|
|
#[hdl(flip)] /* offset = 6 */
|
|
i2: SInt<2>,
|
|
/* offset = 8 */
|
|
o2: UInt<4>,
|
|
},
|
|
flow: Source,
|
|
},
|
|
module: TraceModule {
|
|
name: "mod1_child",
|
|
children: [
|
|
TraceModuleIO {
|
|
name: "i",
|
|
child: TraceUInt {
|
|
id: TraceScalarId(4),
|
|
name: "i",
|
|
ty: UInt<4>,
|
|
flow: Source,
|
|
},
|
|
ty: UInt<4>,
|
|
flow: Source,
|
|
},
|
|
TraceModuleIO {
|
|
name: "o",
|
|
child: TraceSInt {
|
|
id: TraceScalarId(5),
|
|
name: "o",
|
|
ty: SInt<2>,
|
|
flow: Sink,
|
|
},
|
|
ty: SInt<2>,
|
|
flow: Sink,
|
|
},
|
|
TraceModuleIO {
|
|
name: "i2",
|
|
child: TraceSInt {
|
|
id: TraceScalarId(6),
|
|
name: "i2",
|
|
ty: SInt<2>,
|
|
flow: Source,
|
|
},
|
|
ty: SInt<2>,
|
|
flow: Source,
|
|
},
|
|
TraceModuleIO {
|
|
name: "o2",
|
|
child: TraceUInt {
|
|
id: TraceScalarId(7),
|
|
name: "o2",
|
|
ty: UInt<4>,
|
|
flow: Sink,
|
|
},
|
|
ty: UInt<4>,
|
|
flow: Sink,
|
|
},
|
|
],
|
|
},
|
|
ty: Bundle {
|
|
#[hdl(flip)] /* offset = 0 */
|
|
i: UInt<4>,
|
|
/* offset = 4 */
|
|
o: SInt<2>,
|
|
#[hdl(flip)] /* offset = 6 */
|
|
i2: SInt<2>,
|
|
/* offset = 8 */
|
|
o2: UInt<4>,
|
|
},
|
|
},
|
|
],
|
|
},
|
|
traces: [
|
|
SimTrace {
|
|
id: TraceScalarId(0),
|
|
kind: BigUInt {
|
|
index: StatePartIndex<BigSlots>(0),
|
|
ty: UInt<4>,
|
|
},
|
|
state: 0xa,
|
|
last_state: 0xa,
|
|
},
|
|
SimTrace {
|
|
id: TraceScalarId(1),
|
|
kind: BigSInt {
|
|
index: StatePartIndex<BigSlots>(1),
|
|
ty: SInt<2>,
|
|
},
|
|
state: 0x2,
|
|
last_state: 0x2,
|
|
},
|
|
SimTrace {
|
|
id: TraceScalarId(2),
|
|
kind: BigSInt {
|
|
index: StatePartIndex<BigSlots>(2),
|
|
ty: SInt<2>,
|
|
},
|
|
state: 0x2,
|
|
last_state: 0x2,
|
|
},
|
|
SimTrace {
|
|
id: TraceScalarId(3),
|
|
kind: BigUInt {
|
|
index: StatePartIndex<BigSlots>(3),
|
|
ty: UInt<4>,
|
|
},
|
|
state: 0xf,
|
|
last_state: 0xf,
|
|
},
|
|
SimTrace {
|
|
id: TraceScalarId(4),
|
|
kind: BigUInt {
|
|
index: StatePartIndex<BigSlots>(8),
|
|
ty: UInt<4>,
|
|
},
|
|
state: 0xa,
|
|
last_state: 0xa,
|
|
},
|
|
SimTrace {
|
|
id: TraceScalarId(5),
|
|
kind: BigSInt {
|
|
index: StatePartIndex<BigSlots>(9),
|
|
ty: SInt<2>,
|
|
},
|
|
state: 0x2,
|
|
last_state: 0x2,
|
|
},
|
|
SimTrace {
|
|
id: TraceScalarId(6),
|
|
kind: BigSInt {
|
|
index: StatePartIndex<BigSlots>(10),
|
|
ty: SInt<2>,
|
|
},
|
|
state: 0x2,
|
|
last_state: 0x2,
|
|
},
|
|
SimTrace {
|
|
id: TraceScalarId(7),
|
|
kind: BigUInt {
|
|
index: StatePartIndex<BigSlots>(11),
|
|
ty: UInt<4>,
|
|
},
|
|
state: 0xf,
|
|
last_state: 0xf,
|
|
},
|
|
SimTrace {
|
|
id: TraceScalarId(8),
|
|
kind: BigUInt {
|
|
index: StatePartIndex<BigSlots>(4),
|
|
ty: UInt<4>,
|
|
},
|
|
state: 0xa,
|
|
last_state: 0xa,
|
|
},
|
|
SimTrace {
|
|
id: TraceScalarId(9),
|
|
kind: BigSInt {
|
|
index: StatePartIndex<BigSlots>(5),
|
|
ty: SInt<2>,
|
|
},
|
|
state: 0x2,
|
|
last_state: 0x2,
|
|
},
|
|
SimTrace {
|
|
id: TraceScalarId(10),
|
|
kind: BigSInt {
|
|
index: StatePartIndex<BigSlots>(6),
|
|
ty: SInt<2>,
|
|
},
|
|
state: 0x2,
|
|
last_state: 0x2,
|
|
},
|
|
SimTrace {
|
|
id: TraceScalarId(11),
|
|
kind: BigUInt {
|
|
index: StatePartIndex<BigSlots>(7),
|
|
ty: UInt<4>,
|
|
},
|
|
state: 0xf,
|
|
last_state: 0xf,
|
|
},
|
|
],
|
|
trace_writers: [],
|
|
instant: 0 s,
|
|
}"# {
|
|
panic!();
|
|
}
|
|
let expected = -2_hdl_i2;
|
|
assert_eq!(sim.read_bool_or_int(sim.io().o.o).to_expr(), expected);
|
|
let expected = 0xF_hdl_u4;
|
|
assert_eq!(sim.read_bool_or_int(sim.io().o.o2).to_expr(), expected);
|
|
}
|