1
1
use itertools:: Itertools ;
2
- use triton_vm:: isa:: parser:: tokenize;
3
2
use triton_vm:: prelude:: * ;
4
3
5
4
use super :: inner_function:: InnerFunction ;
@@ -52,12 +51,6 @@ impl BasicSnippet for Filter {
52
51
53
52
let inner_function_name = match & self . f {
54
53
InnerFunction :: RawCode ( rc) => rc. entrypoint ( ) ,
55
- InnerFunction :: DeprecatedSnippet ( sn) => {
56
- let fn_body = sn. function_code ( library) ;
57
- let ( _, instructions) = tokenize ( & fn_body) . unwrap ( ) ;
58
- let labelled_instructions = isa:: parser:: to_labelled_instructions ( & instructions) ;
59
- library. explicit_import ( & sn. entrypoint_name ( ) , & labelled_instructions)
60
- }
61
54
InnerFunction :: NoFunctionBody ( _) => todo ! ( ) ,
62
55
InnerFunction :: BasicSnippet ( bs) => {
63
56
let labelled_instructions = bs. annotated_code ( library) ;
@@ -71,7 +64,6 @@ impl BasicSnippet for Filter {
71
64
// body. Otherwise, `library` handles the imports.
72
65
let maybe_inner_function_body_raw = match & self . f {
73
66
InnerFunction :: RawCode ( rc) => rc. function . iter ( ) . join ( "\n " ) ,
74
- InnerFunction :: DeprecatedSnippet ( _) => String :: default ( ) ,
75
67
InnerFunction :: NoFunctionBody ( _) => todo ! ( ) ,
76
68
InnerFunction :: BasicSnippet ( _) => String :: default ( ) ,
77
69
} ;
@@ -167,7 +159,6 @@ mod tests {
167
159
use crate :: list:: higher_order:: inner_function:: RawCode ;
168
160
use crate :: rust_shadowing_helper_functions;
169
161
use crate :: test_prelude:: * ;
170
- use crate :: traits:: deprecated_snippet:: DeprecatedSnippet ;
171
162
172
163
impl Function for Filter {
173
164
fn rust_shadow (
@@ -272,152 +263,63 @@ mod tests {
272
263
#[ derive( Debug , Clone ) ]
273
264
pub struct TestHashXFieldElementLsb ;
274
265
275
- impl DeprecatedSnippet for TestHashXFieldElementLsb {
276
- fn entrypoint_name ( & self ) -> String {
277
- "test_hash_xfield_element_lsb ". to_string ( )
266
+ impl BasicSnippet for TestHashXFieldElementLsb {
267
+ fn inputs ( & self ) -> Vec < ( DataType , String ) > {
268
+ vec ! [ ( DataType :: Xfe , "element ". to_string( ) ) ]
278
269
}
279
270
280
- fn input_field_names ( & self ) -> Vec < String >
281
- where
282
- Self : Sized ,
283
- {
284
- vec ! [
285
- "elem2" . to_string( ) ,
286
- "elem1" . to_string( ) ,
287
- "elem0" . to_string( ) ,
288
- ]
271
+ fn outputs ( & self ) -> Vec < ( DataType , String ) > {
272
+ vec ! [ ( DataType :: Bool , "b" . to_string( ) ) ]
289
273
}
290
274
291
- fn input_types ( & self ) -> Vec < DataType > {
292
- vec ! [ DataType :: Xfe ]
293
- }
294
-
295
- fn output_field_names ( & self ) -> Vec < String >
296
- where
297
- Self : Sized ,
298
- {
299
- vec ! [ "bool" . to_string( ) ]
300
- }
301
-
302
- fn output_types ( & self ) -> Vec < DataType > {
303
- vec ! [ DataType :: Bool ]
304
- }
305
-
306
- fn stack_diff ( & self ) -> isize
307
- where
308
- Self : Sized ,
309
- {
310
- -2
275
+ fn entrypoint ( & self ) -> String {
276
+ "test_hash_xfield_element_lsb" . to_string ( )
311
277
}
312
278
313
- fn function_code ( & self , library : & mut Library ) -> String {
314
- let entrypoint = self . entrypoint_name ( ) ;
279
+ fn code ( & self , library : & mut Library ) -> Vec < LabelledInstruction > {
280
+ let entrypoint = self . entrypoint ( ) ;
315
281
let unused_import = library. import ( Box :: new ( arithmetic:: u32:: safe_add:: SafeAdd ) ) ;
316
- format ! (
317
- "
318
- // BEFORE: _ x2 x1 x0
319
- // AFTER: _ b
320
- {entrypoint}:
321
- // Useless additions, to ensure that dependencies are accepted inside the filter generated code
322
- push 0
323
- push 0
324
- call {unused_import}
325
- pop 1
326
-
327
- push 0
328
- push 0
329
- push 0
330
- push 1 // _ x2 x1 x0 0 0 0 1
331
- push 0 swap 7 // _ 0 x1 x0 0 0 0 1 x2
332
- push 0 swap 7 // _ 0 0 x0 0 0 0 1 x2 x1
333
- push 0 swap 7 // _ 0 0 0 0 0 0 1 x2 x1 x0
334
-
335
- sponge_init
336
- sponge_absorb
337
- sponge_squeeze // _ d9 d8 d7 d6 d5 d4 d3 d2 d1 d0
338
- swap 5 pop 1 // _ d9 d8 d7 d6 d0 d4 d3 d2 d1
339
- swap 5 pop 1 // _ d9 d8 d7 d1 d0 d4 d3 d2
340
- swap 5 pop 1
341
- swap 5 pop 1
342
- swap 5 pop 1
343
-
344
- // _ d4 d3 d2 d1 d0
345
-
346
- split // _ d4 d3 d2 d1 hi lo
347
- push 2 // _ d4 d3 d2 d1 hi lo 2
348
- swap 1
349
- div_mod // _ d4 d3 d2 d1 hi q r
350
- swap 6
351
- pop 5 pop 1
352
- return
353
- "
354
- )
355
- }
356
-
357
- fn crash_conditions ( & self ) -> Vec < String >
358
- where
359
- Self : Sized ,
360
- {
361
- vec ! [ ]
362
- }
363
-
364
- fn gen_input_states ( & self ) -> Vec < InitVmState >
365
- where
366
- Self : Sized ,
367
- {
368
- let mut stack = empty_stack ( ) ;
369
- stack. extend ( random :: < [ BFieldElement ; 3 ] > ( ) ) ;
370
-
371
- vec ! [ InitVmState :: with_stack( stack) ]
372
- }
373
-
374
- fn common_case_input_state ( & self ) -> InitVmState
375
- where
376
- Self : Sized ,
377
- {
378
- let mut stack = empty_stack ( ) ;
379
- stack. extend ( random :: < [ BFieldElement ; 3 ] > ( ) ) ;
380
-
381
- InitVmState :: with_stack ( stack)
382
- }
383
-
384
- fn worst_case_input_state ( & self ) -> InitVmState
385
- where
386
- Self : Sized ,
387
- {
388
- let mut stack = empty_stack ( ) ;
389
- stack. extend ( random :: < [ BFieldElement ; 3 ] > ( ) ) ;
390
-
391
- InitVmState :: with_stack ( stack)
392
- }
393
-
394
- fn rust_shadowing (
395
- & self ,
396
- stack : & mut Vec < BFieldElement > ,
397
- _: Vec < BFieldElement > ,
398
- _: Vec < BFieldElement > ,
399
- _: & mut HashMap < BFieldElement , BFieldElement > ,
400
- ) where
401
- Self : Sized ,
402
- {
403
- let mut xfield_element = vec ! [ ] ;
404
- for _ in 0 ..3 {
405
- xfield_element. push ( stack. pop ( ) . unwrap ( ) ) ;
406
- }
407
- let digest = Tip5 :: hash_varlen ( & xfield_element) . values ( ) . to_vec ( ) ;
408
- let b = digest[ 0 ] . value ( ) % 2 ;
409
- stack. push ( BFieldElement :: new ( b) ) ;
282
+ triton_asm ! (
283
+ // BEFORE: _ x2 x1 x0
284
+ // AFTER: _ b
285
+ { entrypoint} :
286
+ // Useless additions, to ensure that dependencies are accepted inside
287
+ // the filter-generated code
288
+ push 0
289
+ push 0
290
+ call { unused_import}
291
+ pop 1
292
+
293
+ push 0
294
+ push 0
295
+ push 0
296
+ push 1 // _ x2 x1 x0 0 0 0 1
297
+ push 0 swap 7 // _ 0 x1 x0 0 0 0 1 x2
298
+ push 0 swap 7 // _ 0 0 x0 0 0 0 1 x2 x1
299
+ push 0 swap 7 // _ 0 0 0 0 0 0 1 x2 x1 x0
300
+
301
+ sponge_init
302
+ sponge_absorb
303
+ sponge_squeeze // _ d9 d8 d7 d6 d5 d4 d3 d2 d1 d0
304
+ swap 5 pop 1 // _ d9 d8 d7 d6 d0 d4 d3 d2 d1
305
+ swap 5 pop 1 // _ d9 d8 d7 d1 d0 d4 d3 d2
306
+ swap 5 pop 1
307
+ swap 5 pop 1
308
+ swap 5 pop 1
309
+
310
+ // _ d4 d3 d2 d1 d0
311
+
312
+ split // _ d4 d3 d2 d1 hi lo
313
+ push 2 // _ d4 d3 d2 d1 hi lo 2
314
+ swap 1
315
+ div_mod // _ d4 d3 d2 d1 hi q r
316
+ swap 6
317
+ pop 5 pop 1
318
+ return
319
+ )
410
320
}
411
321
}
412
322
413
- #[ test]
414
- fn prop_test ( ) {
415
- ShadowedFunction :: new ( Filter {
416
- f : InnerFunction :: DeprecatedSnippet ( Box :: new ( TestHashXFieldElementLsb ) ) ,
417
- } )
418
- . test ( ) ;
419
- }
420
-
421
323
#[ test]
422
324
fn test_with_raw_function_lsb_on_bfe ( ) {
423
325
let rawcode = RawCode :: new (
@@ -472,7 +374,7 @@ mod benches {
472
374
#[ test]
473
375
fn benchmark ( ) {
474
376
ShadowedFunction :: new ( Filter {
475
- f : InnerFunction :: DeprecatedSnippet ( Box :: new ( TestHashXFieldElementLsb ) ) ,
377
+ f : InnerFunction :: BasicSnippet ( Box :: new ( TestHashXFieldElementLsb ) ) ,
476
378
} )
477
379
. bench ( ) ;
478
380
}
0 commit comments