rust_hdl_widgets/i2c/
sim.rs

1#[macro_export]
2macro_rules! i2c_begin_write {
3    ($sim: ident, $clock: ident, $uut: ident, $addr: expr) => {
4        $uut = $sim.watch(|x| !x.controller.busy.val(), $uut)?;
5        wait_clock_true!($sim, $clock, $uut);
6        $uut.controller.cmd.next = I2CControllerCmd::BeginWrite;
7        $uut.controller.write_data_in.next = ($addr as u32).to_bits();
8        $uut.controller.run.next = true;
9        wait_clock_cycle!($sim, $clock, $uut);
10        $uut.controller.run.next = false;
11        $uut = $sim.watch(|x| x.controller.nack.val() | x.controller.ack.val(), $uut)?;
12    };
13}
14
15#[macro_export]
16macro_rules! i2c_begin_read {
17    ($sim: ident, $clock: ident, $uut: ident, $addr: expr) => {
18        $uut = $sim.watch(|x| !x.controller.busy.val(), $uut)?;
19        wait_clock_true!($sim, $clock, $uut);
20        $uut.controller.cmd.next = I2CControllerCmd::BeginRead;
21        $uut.controller.write_data_in.next = ($addr as u32).to_bits();
22        $uut.controller.run.next = true;
23        wait_clock_cycle!($sim, $clock, $uut);
24        $uut.controller.run.next = false;
25        $uut = $sim.watch(|x| x.controller.nack.val() | x.controller.ack.val(), $uut)?;
26    };
27}
28
29#[macro_export]
30macro_rules! i2c_end_transmission {
31    ($sim: ident, $clock: ident, $uut: ident) => {
32        $uut = $sim.watch(|x| !x.controller.busy.val(), $uut)?;
33        wait_clock_true!($sim, $clock, $uut);
34        $uut.controller.cmd.next = I2CControllerCmd::EndTransmission;
35        $uut.controller.run.next = true;
36        wait_clock_cycle!($sim, $clock, $uut);
37        $uut.controller.run.next = false;
38        $uut = $sim.watch(|x| !x.controller.busy.val(), $uut)?;
39        wait_clock_cycles!($sim, $clock, $uut, 10);
40    };
41}
42
43#[macro_export]
44macro_rules! i2c_write {
45    ($sim: ident, $clock: ident, $uut: ident, $val: expr) => {
46        $uut = $sim.watch(|x| !x.controller.busy.val(), $uut)?;
47        wait_clock_true!($sim, $clock, $uut);
48        $uut.controller.cmd.next = I2CControllerCmd::Write;
49        $uut.controller.write_data_in.next = ($val as u32).to_bits();
50        $uut.controller.run.next = true;
51        wait_clock_cycle!($sim, $clock, $uut);
52        $uut.controller.run.next = false;
53        $uut = $sim.watch(|x| x.controller.nack.val() | x.controller.ack.val(), $uut)?;
54    };
55}
56
57#[macro_export]
58macro_rules! i2c_read {
59    ($sim: ident, $clock: ident, $uut: ident) => {{
60        $uut = $sim.watch(|x| !x.controller.busy.val(), $uut)?;
61        wait_clock_true!($sim, $clock, $uut);
62        $uut.controller.cmd.next = I2CControllerCmd::Read;
63        $uut.controller.run.next = true;
64        wait_clock_cycle!($sim, $clock, $uut);
65        $uut.controller.run.next = false;
66        $uut = $sim.watch(|x| x.controller.read_valid.val(), $uut)?;
67        $uut.controller.read_data_out.val()
68    }};
69}
70
71#[macro_export]
72macro_rules! i2c_read_last {
73    ($sim: ident, $clock: ident, $uut: ident) => {{
74        $uut = $sim.watch(|x| !x.controller.busy.val(), $uut)?;
75        wait_clock_true!($sim, $clock, $uut);
76        $uut.controller.cmd.next = I2CControllerCmd::ReadLast;
77        $uut.controller.run.next = true;
78        wait_clock_cycle!($sim, $clock, $uut);
79        $uut.controller.run.next = false;
80        $uut = $sim.watch(|x| x.controller.read_valid.val(), $uut)?;
81        $uut.controller.read_data_out.val()
82    }};
83}