Skip to content

Commit c2a30b4

Browse files
committed
feat: sync constraints for UType (AUIPC/LUI)
1 parent 828bd76 commit c2a30b4

File tree

8 files changed

+140
-14
lines changed

8 files changed

+140
-14
lines changed

SP1Chips.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ import SP1Chips.Lt.Constraints
1515
import SP1Chips.LtChip
1616
import SP1Chips.Mul.Constraints
1717
import SP1Chips.MulChip
18+
import SP1Chips.UType.Constraints
19+
import SP1Chips.UTypeChip
1820
import SP1Chips.ShiftLeft.Constraints
1921
import SP1Chips.ShiftLeftChip
2022
import SP1Chips.ShiftRight.Constraints

SP1Chips/UType/Constraints.lean

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import SP1Operations.Reader.CPUState
2+
import SP1Operations.Reader.JTypeReader
3+
import SP1Operations.Operation.AddOperation
4+
5+
namespace UType
6+
7+
section constraints
8+
9+
-- Generated Lean code for chip UTypeChip
10+
def constraints (Main : Vector (Fin BB) 31) : SP1ConstraintList :=
11+
let E0 : Fin BB := Main[30] - 1
12+
let E1 : Fin BB := Main[30] * E0
13+
let E2 : Fin BB := Main[29] - 1
14+
let E3 : Fin BB := Main[29] * E2
15+
let E4 : Fin BB := Main[29] * 35
16+
let E5 : Fin BB := 1 - Main[29]
17+
let E6 : Fin BB := E5 * 36
18+
let E7 : Fin BB := E4 + E6
19+
let E8 : Fin BB := 1 - Main[29]
20+
let E9 : Fin BB := Main[29] * 0
21+
let E10 : Fin BB := E8 * 0
22+
let E11 : Fin BB := E9 + E10
23+
let E12 : Fin BB := Main[29] * 0
24+
let E13 : Fin BB := E8 * 0
25+
let E14 : Fin BB := E12 + E13
26+
let E15 : Fin BB := Main[29] * 23
27+
let E16 : Fin BB := E8 * 55
28+
let E17 : Fin BB := E15 + E16
29+
let E18 : Fin BB := Main[3] + 4
30+
let CS0 : SP1ConstraintList := CPUState.constraints { clk_high := Main[0], clk_16_24 := Main[1], clk_0_16 := Main[2], pc := #v[Main[3], Main[4], Main[5]] } #v[E18, Main[4], Main[5]] 8 Main[30]
31+
let E19 : Fin BB := Main[29] * Main[3]
32+
let E20 : Fin BB := 1 - Main[29]
33+
let E21 : Fin BB := E20 * 0
34+
let E22 : Fin BB := E19 + E21
35+
let E23 : Fin BB := Main[29] * Main[4]
36+
let E24 : Fin BB := 1 - Main[29]
37+
let E25 : Fin BB := E24 * 0
38+
let E26 : Fin BB := E23 + E25
39+
let E27 : Fin BB := Main[29] * Main[5]
40+
let E28 : Fin BB := 1 - Main[29]
41+
let E29 : Fin BB := E28 * 0
42+
let E30 : Fin BB := E27 + E29
43+
let E31 : Fin BB := Main[29] * 0
44+
let E32 : Fin BB := 1 - Main[29]
45+
let E33 : Fin BB := E32 * 0
46+
let E34 : Fin BB := E31 + E33
47+
let E35 : Fin BB := Main[22] - E22
48+
let E36 : Fin BB := Main[23] - E26
49+
let E37 : Fin BB := Main[24] - E30
50+
let E38 : Fin BB := 0 - E34
51+
let E39 : Fin BB := Main[30] - 1
52+
let E40 : Fin BB := E39 * Main[13]
53+
let E41 : Fin BB := Main[30] - Main[13]
54+
let CS1 : SP1ConstraintList := AddOperation.constraints #v[Main[22], Main[23], Main[24], 0] #v[Main[14], Main[15], Main[16], Main[17]] { value := #v[Main[25], Main[26], Main[27], Main[28]] } E41
55+
let E42 : Fin BB := Main[1] * 65536
56+
let E43 : Fin BB := Main[2] + E42
57+
let CS2 : SP1ConstraintList := JTypeReader.constraints Main[0] E43 #v[Main[3], Main[4], Main[5]] E7 #v[E17, E11, E14] #v[Main[25], Main[26], Main[27], Main[28]] { op_a := Main[6], op_a_memory := { prev_value := #v[Main[7], Main[8], Main[9], Main[10]], access_timestamp := { prev_low := Main[11], diff_low_limb := Main[12] } }, op_a_0 := Main[13], op_b_imm := #v[Main[14], Main[15], Main[16], Main[17]], op_c_imm := #v[Main[18], Main[19], Main[20], Main[21]] } Main[30]
58+
CS0 ++ CS1 ++ CS2 ++ [
59+
(.assertZero E1),
60+
(.assertZero E3),
61+
(.assertZero E35),
62+
(.assertZero E36),
63+
(.assertZero E37),
64+
(.assertZero E38),
65+
(.assertZero E40),
66+
]
67+
68+
end constraints
69+
70+
end UType

SP1Chips/UTypeChip.lean

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import SP1Chips.UType.Constraints

SP1Operations.lean

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ import SP1Operations.Reader.ITypeReader
5656
import SP1Operations.Reader.ITypeReader.Constraints
5757
import SP1Operations.Reader.ITypeReader.Operation
5858
import SP1Operations.Reader.JTypeReader
59+
import SP1Operations.Reader.JTypeReader.Constraints
60+
import SP1Operations.Reader.JTypeReader.Operation
5961
import SP1Operations.Reader.RTypeReader
6062
import SP1Operations.Reader.RTypeReader.Constraints
6163
import SP1Operations.Reader.RTypeReader.Operation
Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,2 @@
1-
-- import SP1Foundations
2-
-- import SP1Operations.MemoryConsistency
3-
-- import LeanRV32IM.RiscvRegs
4-
5-
-- open Sail
6-
-- open LeanRV32IM.Functions
7-
8-
-- --- A Reader that only accesses values of type `T`.
9-
-- structure JTypeReader (T : Type) where
10-
-- op_a : T
11-
-- op_a_memory : MemoryAccessInSharedCols
12-
-- op_a_0 : T
13-
-- op_b_imm : Word T
14-
-- op_c_imm : Word T
1+
import SP1Operations.Reader.JTypeReader.Operation
2+
import SP1Operations.Reader.JTypeReader.Constraints
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import SP1Operations.Reader.JTypeReader.Operation
2+
3+
namespace JTypeReader
4+
5+
set_option linter.unusedVariables false
6+
-- Generated Lean code for operation JTypeReader (from chip Add)
7+
section constraints
8+
9+
def constraints
10+
(clk_high : (Fin BB))
11+
(clk_low : (Fin BB))
12+
(pc : (Vector (Fin BB) 3))
13+
(opcode : (Fin BB))
14+
(instr_field_consts : (Vector (Fin BB) 3))
15+
(op_a_write_value : (Word (Fin BB)))
16+
(cols : JTypeReader)
17+
(is_real : (Fin BB))
18+
: SP1ConstraintList :=
19+
let E0 : Fin BB := is_real - 1
20+
let E1 : Fin BB := is_real * E0
21+
let E2 : Fin BB := op_a_write_value[0] - 0
22+
let E3 : Fin BB := cols.op_a_0 * E2
23+
let E4 : Fin BB := op_a_write_value[1] - 0
24+
let E5 : Fin BB := cols.op_a_0 * E4
25+
let E6 : Fin BB := op_a_write_value[2] - 0
26+
let E7 : Fin BB := cols.op_a_0 * E6
27+
let E8 : Fin BB := op_a_write_value[3] - 0
28+
let E9 : Fin BB := cols.op_a_0 * E8
29+
let E10 : Fin BB := clk_low + 3
30+
let E11 : Fin BB := is_real - 1
31+
let E12 : Fin BB := is_real * E11
32+
let E13 : Fin BB := E10 - cols.op_a_memory.access_timestamp.prev_low
33+
let E14 : Fin BB := E13 - 1
34+
let E15 : Fin BB := E14 - cols.op_a_memory.access_timestamp.diff_low_limb
35+
let E16 : Fin BB := E15 * 2013235201
36+
[
37+
(.assertZero E1),
38+
(.send (.program pc[0] pc[1] pc[2] (Opcode.ofNat opcode) cols.op_a cols.op_b_imm[0] cols.op_b_imm[1] cols.op_b_imm[2] cols.op_b_imm[3] cols.op_c_imm[0] cols.op_c_imm[1] cols.op_c_imm[2] cols.op_c_imm[3] cols.op_a_0 1 1 instr_field_consts[0] instr_field_consts[1] instr_field_consts[2]) is_real),
39+
(.assertZero E3),
40+
(.assertZero E5),
41+
(.assertZero E7),
42+
(.assertZero E9),
43+
(.assertZero E12),
44+
(.send (.byte (ByteOpcode.ofNat 6) cols.op_a_memory.access_timestamp.diff_low_limb 16 0) is_real),
45+
(.send (.byte (ByteOpcode.ofNat 3) 0 E16 0) is_real),
46+
(.send (.memory clk_high cols.op_a_memory.access_timestamp.prev_low cols.op_a 0 0 cols.op_a_memory.prev_value[0] cols.op_a_memory.prev_value[1] cols.op_a_memory.prev_value[2] cols.op_a_memory.prev_value[3]) is_real),
47+
(.receive (.memory clk_high E10 cols.op_a 0 0 op_a_write_value[0] op_a_write_value[1] op_a_write_value[2] op_a_write_value[3]) is_real),
48+
]
49+
50+
end constraints
51+
52+
end JTypeReader
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import SP1Foundations
2+
3+
--- A Reader that only accesses values of type `T`.
4+
structure JTypeReader where
5+
op_a : Fin BB
6+
op_a_memory : MemoryAccessInSharedCols
7+
op_a_0 : Fin BB
8+
op_b_imm : Word (Fin BB)
9+
op_c_imm : Word (Fin BB)

update_constraints.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
("Mul", None, ""),
2424
("Sub", None, ""),
2525
("Subw", None, ""),
26+
("UType", None, ""),
2627

2728
# Operations
2829
("Add", "AddOperation", "Operation"),
@@ -49,6 +50,7 @@
4950
("Add", "CPUState", "Reader"),
5051
("Addi", "ITypeReader", "Reader"),
5152
("Bitwise", "ALUTypeReader", "Reader"),
53+
("UType", "JTypeReader", "Reader"),
5254
]
5355

5456
def run_constraint_compiler(sp1_dir: str, chip: str, operation: Optional[str] = None) -> str:

0 commit comments

Comments
 (0)