@@ -13,6 +13,8 @@ use crate::{
13
13
structs:: { PCUInt , TSUInt , UInt64 } ,
14
14
} ;
15
15
16
+ use super :: constants:: RISCV64_PC_STEP_SIZE ;
17
+
16
18
pub struct AddInstruction ;
17
19
18
20
pub struct InstructionConfig < E : ExtensionField > {
@@ -40,16 +42,13 @@ impl<E: ExtensionField> Instruction<E> for AddInstruction {
40
42
circuit_builder : & mut CircuitBuilder < E > ,
41
43
) -> Result < InstructionConfig < E > , ZKVMError > {
42
44
let pc = PCUInt :: new ( circuit_builder) ;
43
- let memory_ts = TSUInt :: new ( circuit_builder) ;
45
+ let mut memory_ts = TSUInt :: new ( circuit_builder) ;
44
46
let clk = circuit_builder. create_witin ( ) ;
45
47
46
48
// state in
47
49
circuit_builder. state_in ( & pc, & memory_ts, clk. expr ( ) ) ?;
48
50
49
- let next_pc = pc. add_const ( circuit_builder, 1 . into ( ) ) ?;
50
- let next_memory_ts = memory_ts. add_const ( circuit_builder, 1 . into ( ) ) ?;
51
-
52
- circuit_builder. state_out ( & next_pc, & next_memory_ts, clk. expr ( ) + 1 . into ( ) ) ?;
51
+ let next_pc = pc. add_const ( circuit_builder, RISCV64_PC_STEP_SIZE . into ( ) ) ?;
53
52
54
53
// Execution result = addend0 + addend1, with carry.
55
54
let prev_rd_memory_value = UInt64 :: new ( circuit_builder) ;
@@ -60,38 +59,43 @@ impl<E: ExtensionField> Instruction<E> for AddInstruction {
60
59
let computed_outcome = addend_0. add ( circuit_builder, & addend_1) ?;
61
60
outcome. eq ( circuit_builder, & computed_outcome) ?;
62
61
63
- // TODO rs1_id, rs2_id, rd_id should be byte code lookup
62
+ // TODO rs1_id, rs2_id, rd_id should be bytecode lookup
64
63
let rs1_id = circuit_builder. create_witin ( ) ;
65
64
let rs2_id = circuit_builder. create_witin ( ) ;
66
65
let rd_id = circuit_builder. create_witin ( ) ;
67
66
circuit_builder. assert_u5 ( rs1_id. expr ( ) ) ?;
68
67
circuit_builder. assert_u5 ( rs2_id. expr ( ) ) ?;
69
68
circuit_builder. assert_u5 ( rd_id. expr ( ) ) ?;
70
- let prev_rs1_memory_ts = TSUInt :: new ( circuit_builder) ;
71
- let prev_rs2_memory_ts = TSUInt :: new ( circuit_builder) ;
72
- let prev_rd_memory_ts = TSUInt :: new ( circuit_builder) ;
73
-
74
- let is_lt_0 = prev_rs1_memory_ts. lt ( circuit_builder, & memory_ts) ?;
75
- let is_lt_1 = prev_rs2_memory_ts. lt ( circuit_builder, & memory_ts) ?;
76
- let is_lt_2 = prev_rd_memory_ts. lt ( circuit_builder, & memory_ts) ?;
77
69
78
- // less than = true
79
- circuit_builder. require_one ( is_lt_0) ?;
80
- circuit_builder. require_one ( is_lt_1) ?;
81
- circuit_builder. require_one ( is_lt_2) ?;
70
+ let mut prev_rs1_memory_ts = TSUInt :: new ( circuit_builder) ;
71
+ let mut prev_rs2_memory_ts = TSUInt :: new ( circuit_builder) ;
72
+ let mut prev_rd_memory_ts = TSUInt :: new ( circuit_builder) ;
82
73
83
- circuit_builder. register_read ( & rs1_id, & prev_rs1_memory_ts, & memory_ts, & addend_0) ?;
74
+ let mut memory_ts = circuit_builder. register_read (
75
+ & rs1_id,
76
+ & mut prev_rs1_memory_ts,
77
+ & mut memory_ts,
78
+ & addend_0,
79
+ ) ?;
84
80
85
- circuit_builder. register_read ( & rs2_id, & prev_rs2_memory_ts, & memory_ts, & addend_1) ?;
81
+ let mut memory_ts = circuit_builder. register_read (
82
+ & rs2_id,
83
+ & mut prev_rs2_memory_ts,
84
+ & mut memory_ts,
85
+ & addend_1,
86
+ ) ?;
86
87
87
- circuit_builder. register_write (
88
+ let memory_ts = circuit_builder. register_write (
88
89
& rd_id,
89
- & prev_rd_memory_ts,
90
- & memory_ts,
90
+ & mut prev_rd_memory_ts,
91
+ & mut memory_ts,
91
92
& prev_rd_memory_value,
92
93
& computed_outcome,
93
94
) ?;
94
95
96
+ let next_memory_ts = memory_ts. add_const ( circuit_builder, 1 . into ( ) ) ?;
97
+ circuit_builder. state_out ( & next_pc, & next_memory_ts, clk. expr ( ) + 1 . into ( ) ) ?;
98
+
95
99
Ok ( InstructionConfig {
96
100
pc,
97
101
memory_ts,
0 commit comments