Skip to content

Commit f624f9f

Browse files
committed
test(elliptic_curve): add test for elliptic curve syntax
1 parent 8433dbe commit f624f9f

File tree

2 files changed

+191
-0
lines changed

2 files changed

+191
-0
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
load("//bazel:lit.bzl", "glob_lit_tests")
2+
3+
package(
4+
licenses = ["notice"],
5+
)
6+
7+
glob_lit_tests(
8+
name = "all_tests",
9+
data = ["//tests:test_utilities"],
10+
driver = "//tests:run_lit.sh",
11+
test_file_exts = ["mlir"],
12+
)
Lines changed: 179 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,179 @@
1+
// RUN: zkir-opt --split-input-file %s | FileCheck %s --enable-var-scope
2+
3+
!PF = !field.pf<35:i32>
4+
5+
#1 = #field.pf_elem<1:i32> : !PF
6+
#2 = #field.pf_elem<2:i32> : !PF
7+
#3 = #field.pf_elem<3:i32> : !PF
8+
#4 = #field.pf_elem<4:i32> : !PF
9+
10+
#curve = #elliptic_curve.sw<#1, #2, (#3, #4)>
11+
!affine = !elliptic_curve.affine<#curve>
12+
!jacobian = !elliptic_curve.jacobian<#curve>
13+
!xyzz = !elliptic_curve.xyzz<#curve>
14+
15+
// CHECK-LABEL: @test_intialization_and_conversion
16+
func.func @test_intialization_and_conversion() {
17+
// CHECK: %[[AFFINE1:.*]] = elliptic_curve.point [[TMP1:.*]] : ![[AF:.*]]
18+
%affine1 = elliptic_curve.point 1, 5 : !affine
19+
// CHECK: %[[JACOBIAN1:.*]] = elliptic_curve.point [[TMP2:.*]] : ![[JA:.*]]
20+
%jacobian1 = elliptic_curve.point 1, 5, 2 : !jacobian
21+
// CHECK: %[[XYZZ1:.*]] = elliptic_curve.point [[TMP3:.*]] : ![[XY:.*]]
22+
%xyzz1 = elliptic_curve.point 1, 5, 4, 3 : !xyzz
23+
24+
// CHECK: %[[JACOBIAN2:.*]] = elliptic_curve.convert_point_type %[[AFFINE1]] : ![[AF]] -> ![[JA]]
25+
%jacobian2 = elliptic_curve.convert_point_type %affine1 : !affine -> !jacobian
26+
// CHECK: %[[XYZZ2:.*]] = elliptic_curve.convert_point_type %[[AFFINE1]] : ![[AF]] -> ![[XY]]
27+
%xyzz2 = elliptic_curve.convert_point_type %affine1 : !affine -> !xyzz
28+
// CHECK: %[[AFFINE2:.*]] = elliptic_curve.convert_point_type %[[JACOBIAN1]] : ![[JA]] -> ![[AF]]
29+
%affine2 = elliptic_curve.convert_point_type %jacobian1 : !jacobian -> !affine
30+
// CHECK: %[[XYZZ3:.*]] = elliptic_curve.convert_point_type %[[JACOBIAN1]] : ![[JA]] -> ![[XY]]
31+
%xyzz3 = elliptic_curve.convert_point_type %jacobian1 : !jacobian -> !xyzz
32+
// CHECK: %[[AFFINE3:.*]] = elliptic_curve.convert_point_type %[[XYZZ1]] : ![[XY]] -> ![[AF]]
33+
%affine3 = elliptic_curve.convert_point_type %xyzz1 : !xyzz -> !affine
34+
// CHECK: %[[JACOBIAN3:.*]] = elliptic_curve.convert_point_type %[[XYZZ1]] : ![[XY]] -> ![[JA]]
35+
%jacobian3 = elliptic_curve.convert_point_type %xyzz1 : !xyzz -> !jacobian
36+
return
37+
}
38+
39+
// CHECK-LABEL: @test_add
40+
func.func @test_add() {
41+
// CHECK: %[[AFFINE1:.*]] = elliptic_curve.point [[TMP1:.*]] : ![[AF:.*]]
42+
%affine1 = elliptic_curve.point 1, 5 : !affine
43+
// CHECK: %[[AFFINE2:.*]] = elliptic_curve.point
44+
%affine2 = elliptic_curve.point 3, 6 : !affine
45+
46+
// CHECK: %[[JACOBIAN1:.*]] = elliptic_curve.point [[TMP2:.*]] : ![[JA:.*]]
47+
%jacobian1 = elliptic_curve.point 1, 5, 2 : !jacobian
48+
// CHECK: %[[JACOBIAN2:.*]] = elliptic_curve.point
49+
%jacobian2 = elliptic_curve.point 3, 6, 1 : !jacobian
50+
51+
// CHECK: %[[XYZZ1:.*]] = elliptic_curve.point [[TMP3:.*]] : ![[XY:.*]]
52+
%xyzz1 = elliptic_curve.point 1, 5, 4, 3 : !xyzz
53+
// CHECK: %[[XYZZ2:.*]] = elliptic_curve.point
54+
%xyzz2 = elliptic_curve.point 3, 6, 1, 2 : !xyzz
55+
56+
// affine, affine -> jacobian
57+
// CHECK: %[[AFFINE3:.*]] = elliptic_curve.add %[[AFFINE1]], %[[AFFINE2]] : ![[AF]], ![[AF]] -> ![[JA]]
58+
%affine3 = elliptic_curve.add %affine1, %affine2 : !affine, !affine -> !jacobian
59+
// affine, jacobian -> jacobian
60+
// CHECK: %[[JACOBIAN3:.*]] = elliptic_curve.add %[[AFFINE1]], %[[JACOBIAN1]] : ![[AF]], ![[JA]] -> ![[JA]]
61+
%jacobian3 = elliptic_curve.add %affine1, %jacobian1 : !affine, !jacobian -> !jacobian
62+
// CHECK: %[[JACOBIAN10:.*]] = elliptic_curve.add %[[JACOBIAN1]], %[[AFFINE1]] : ![[JA]], ![[AF]] -> ![[JA]]
63+
%jacobian10 = elliptic_curve.add %jacobian1, %affine1 : !jacobian, !affine -> !jacobian
64+
// affine, xyzz -> xyzz
65+
// CHECK: %[[XYZZ3:.*]] = elliptic_curve.add %[[AFFINE1]], %[[XYZZ1]] : ![[AF]], ![[XY]] -> ![[XY]]
66+
%xyzz3 = elliptic_curve.add %affine1, %xyzz1 : !affine, !xyzz -> !xyzz
67+
// jacobian, jacobian -> jacobian
68+
// CHECK: %[[JACOBIAN4:.*]] = elliptic_curve.add %[[JACOBIAN1]], %[[JACOBIAN2]] : ![[JA]], ![[JA]] -> ![[JA]]
69+
%jacobian4 = elliptic_curve.add %jacobian1, %jacobian2 : !jacobian, !jacobian -> !jacobian
70+
// xyzz, xyzz -> xyzz
71+
// CHECK: %[[XYZZ4:.*]] = elliptic_curve.add %[[XYZZ1]], %[[XYZZ2]] : ![[XY]], ![[XY]] -> ![[XY]]
72+
%xyzz4 = elliptic_curve.add %xyzz1, %xyzz2 : !xyzz, !xyzz -> !xyzz
73+
return
74+
}
75+
76+
// CHECK-LABEL: @test_sub
77+
func.func @test_sub() {
78+
// CHECK: %[[AFFINE1:.*]] = elliptic_curve.point [[TMP1:.*]] : ![[AF:.*]]
79+
%affine1 = elliptic_curve.point 1, 5 : !affine
80+
// CHECK: %[[AFFINE2:.*]] = elliptic_curve.point
81+
%affine2 = elliptic_curve.point 3, 6 : !affine
82+
83+
// CHECK: %[[JACOBIAN1:.*]] = elliptic_curve.point [[TMP2:.*]] : ![[JA:.*]]
84+
%jacobian1 = elliptic_curve.point 1, 5, 2 : !jacobian
85+
// CHECK: %[[JACOBIAN2:.*]] = elliptic_curve.point
86+
%jacobian2 = elliptic_curve.point 3, 6, 1 : !jacobian
87+
88+
// CHECK: %[[XYZZ1:.*]] = elliptic_curve.point [[TMP3:.*]] : ![[XY:.*]]
89+
%xyzz1 = elliptic_curve.point 1, 5, 4, 3 : !xyzz
90+
// CHECK: %[[XYZZ2:.*]] = elliptic_curve.point
91+
%xyzz2 = elliptic_curve.point 3, 6, 1, 2 : !xyzz
92+
93+
// affine, affine -> jacobian
94+
// CHECK: %[[AFFINE3:.*]] = elliptic_curve.sub %[[AFFINE1]], %[[AFFINE2]] : ![[AF]], ![[AF]] -> ![[JA]]
95+
%affine3 = elliptic_curve.sub %affine1, %affine2 : !affine, !affine -> !jacobian
96+
// affine, jacobian -> jacobian
97+
// CHECK: %[[JACOBIAN3:.*]] = elliptic_curve.sub %[[AFFINE1]], %[[JACOBIAN1]] : ![[AF]], ![[JA]] -> ![[JA]]
98+
%jacobian3 = elliptic_curve.sub %affine1, %jacobian1 : !affine, !jacobian -> !jacobian
99+
// CHECK: %[[JACOBIAN10:.*]] = elliptic_curve.sub %[[JACOBIAN1]], %[[AFFINE1]] : ![[JA]], ![[AF]] -> ![[JA]]
100+
%jacobian10 = elliptic_curve.sub %jacobian1, %affine1 : !jacobian, !affine -> !jacobian
101+
// affine, xyzz -> xyzz
102+
// CHECK: %[[XYZZ3:.*]] = elliptic_curve.sub %[[AFFINE1]], %[[XYZZ1]] : ![[AF]], ![[XY]] -> ![[XY]]
103+
%xyzz3 = elliptic_curve.sub %affine1, %xyzz1 : !affine, !xyzz -> !xyzz
104+
// jacobian, jacobian -> jacobian
105+
// CHECK: %[[JACOBIAN4:.*]] = elliptic_curve.sub %[[JACOBIAN1]], %[[JACOBIAN2]] : ![[JA]], ![[JA]] -> ![[JA]]
106+
%jacobian4 = elliptic_curve.sub %jacobian1, %jacobian2 : !jacobian, !jacobian -> !jacobian
107+
// xyzz, xyzz -> xyzz
108+
// CHECK: %[[XYZZ4:.*]] = elliptic_curve.sub %[[XYZZ1]], %[[XYZZ2]] : ![[XY]], ![[XY]] -> ![[XY]]
109+
%xyzz4 = elliptic_curve.sub %xyzz1, %xyzz2 : !xyzz, !xyzz -> !xyzz
110+
return
111+
}
112+
113+
// CHECK-LABEL: @test_negation
114+
func.func @test_negation() {
115+
// CHECK: %[[AFFINE1:.*]] = elliptic_curve.point [[TMP1:.*]] : ![[AF:.*]]
116+
%affine1 = elliptic_curve.point 1, 5 : !affine
117+
// CHECK: %[[AFFINE2:.*]] = elliptic_curve.neg %[[AFFINE1]] : ![[AF]]
118+
%affine2 = elliptic_curve.neg %affine1 : !affine
119+
120+
// CHECK: %[[JACOBIAN1:.*]] = elliptic_curve.point [[TMP2:.*]] : ![[JA:.*]]
121+
%jacobian1 = elliptic_curve.point 1, 5, 2 : !jacobian
122+
// CHECK: %[[JACOBIAN2:.*]] = elliptic_curve.neg %[[JACOBIAN1]] : ![[JA]]
123+
%jacobian2 = elliptic_curve.neg %jacobian1 : !jacobian
124+
125+
// CHECK: %[[XYZZ1:.*]] = elliptic_curve.point [[TMP3:.*]] : ![[XY:.*]]
126+
%xyzz1 = elliptic_curve.point 1, 5, 4, 3 : !xyzz
127+
// CHECK: %[[XYZZ2:.*]] = elliptic_curve.neg %[[XYZZ1]] : ![[XY]]
128+
%xyzz2 = elliptic_curve.neg %xyzz1 : !xyzz
129+
return
130+
}
131+
132+
// CHECK-LABEL: @test_double
133+
func.func @test_double() {
134+
// CHECK: %[[AFFINE1:.*]] = elliptic_curve.point [[TMP1:.*]] : ![[AF:.*]]
135+
%affine1 = elliptic_curve.point 1, 5 : !affine
136+
// CHECK: %[[AFFINE2:.*]] = elliptic_curve.dbl %[[AFFINE1]] : ![[AF]] -> ![[JA:.*]]
137+
%affine2 = elliptic_curve.dbl %affine1 : !affine -> !jacobian
138+
139+
// CHECK: %[[JACOBIAN1:.*]] = elliptic_curve.point [[TMP2:.*]] : ![[JA]]
140+
%jacobian1 = elliptic_curve.point 1, 5, 2 : !jacobian
141+
// CHECK: %[[JACOBIAN2:.*]] = elliptic_curve.dbl %[[JACOBIAN1]] : ![[JA]] -> ![[JA]]
142+
%jacobian2 = elliptic_curve.dbl %jacobian1 : !jacobian -> !jacobian
143+
144+
// CHECK: %[[XYZZ1:.*]] = elliptic_curve.point [[TMP3:.*]] : ![[XY:.*]]
145+
%xyzz1 = elliptic_curve.point 1, 5, 4, 3 : !xyzz
146+
// CHECK: %[[XYZZ2:.*]] = elliptic_curve.dbl %[[XYZZ1]] : ![[XY]] -> ![[XY]]
147+
%xyzz2 = elliptic_curve.dbl %xyzz1 : !xyzz -> !xyzz
148+
return
149+
}
150+
151+
// CHECK-LABEL: @test_scalar_mul
152+
func.func @test_scalar_mul() {
153+
// CHECK: %[[SCALAR1:.*]] = field.pf.constant 1 : ![[PF:.*]]
154+
%scalar1 = field.pf.constant 1 : !PF
155+
// CHECK: %[[SCALAR2:.*]] = field.pf.constant 7 : ![[PF]]
156+
%scalar2 = field.pf.constant 7 : !PF
157+
158+
// CHECK: %[[AFFINE1:.*]] = elliptic_curve.point [[TMP1:.*]] : ![[AF:.*]]
159+
%affine1 = elliptic_curve.point 1, 5 : !affine
160+
// CHECK: %[[AFFINE2:.*]] = elliptic_curve.scalar_mul %[[AFFINE1]], %[[SCALAR1]] : ![[AF]], ![[PF]] -> ![[JA:.*]]
161+
%affine2 = elliptic_curve.scalar_mul %affine1, %scalar1 : !affine, !PF -> !jacobian
162+
// CHECK: %[[JACOBIAN4:.*]] = elliptic_curve.scalar_mul %[[AFFINE1]], %[[SCALAR2]] : ![[AF]], ![[PF]] -> ![[JA]]
163+
%jacobian4 = elliptic_curve.scalar_mul %affine1, %scalar2 : !affine, !PF -> !jacobian
164+
165+
// CHECK: %[[JACOBIAN1:.*]] = elliptic_curve.point [[TMP2:.*]] : ![[JA]]
166+
%jacobian1 = elliptic_curve.point 1, 5, 2 : !jacobian
167+
// CHECK: %[[JACOBIAN2:.*]] = elliptic_curve.scalar_mul %[[JACOBIAN1]], %[[SCALAR1]] : ![[JA]], ![[PF]] -> ![[JA]]
168+
%jacobian2 = elliptic_curve.scalar_mul %jacobian1, %scalar1 : !jacobian, !PF -> !jacobian
169+
// CHECK: %[[JACOBIAN3:.*]] = elliptic_curve.scalar_mul %[[JACOBIAN1]], %[[SCALAR2]] : ![[JA]], ![[PF]] -> ![[JA]]
170+
%jacobian3 = elliptic_curve.scalar_mul %jacobian1, %scalar2 : !jacobian, !PF -> !jacobian
171+
172+
// CHECK: %[[XYZZ1:.*]] = elliptic_curve.point [[TMP3:.*]] : ![[XY:.*]]
173+
%xyzz1 = elliptic_curve.point 1, 5, 4, 3 : !xyzz
174+
// CHECK: %[[XYZZ2:.*]] = elliptic_curve.scalar_mul %[[XYZZ1]], %[[SCALAR1]] : ![[XY]], ![[PF]] -> ![[XY]]
175+
%xyzz2 = elliptic_curve.scalar_mul %xyzz1, %scalar1 : !xyzz, !PF -> !xyzz
176+
// CHECK: %[[XYZZ3:.*]] = elliptic_curve.scalar_mul %[[XYZZ1]], %[[SCALAR2]] : ![[XY]], ![[PF]] -> ![[XY]]
177+
%xyzz3 = elliptic_curve.scalar_mul %xyzz1, %scalar2 : !xyzz, !PF -> !xyzz
178+
return
179+
}

0 commit comments

Comments
 (0)