@@ -13,6 +13,8 @@ use crate::{
13
13
error:: { Error , ErrorKind , Result } ,
14
14
helpers:: PrettyField ,
15
15
imports:: FnHandle ,
16
+ parser:: types:: TyKind ,
17
+ utils:: { log_array_type, log_custom_type, log_string_type} ,
16
18
var:: { ConstOrCell , Value , Var } ,
17
19
witness:: WitnessEnv ,
18
20
} ;
@@ -413,15 +415,105 @@ pub trait Backend: Clone {
413
415
) -> Result < ( ) > ;
414
416
415
417
/// Generate the witness for a backend.
416
- fn generate_witness < B : Backend > (
418
+ fn generate_witness (
417
419
& self ,
418
420
witness_env : & mut WitnessEnv < Self :: Field > ,
419
421
sources : & Sources ,
420
- typed : & Mast < B > ,
422
+ typed : & Mast < Self > ,
421
423
) -> Result < Self :: GeneratedWitness > ;
422
424
423
425
/// Generate the asm for a backend.
424
426
fn generate_asm ( & self , sources : & Sources , debug : bool ) -> String ;
425
427
426
- fn log_var ( & mut self , var : & VarInfo < Self :: Field , Self :: Var > , msg : String , span : Span ) ;
428
+ fn log_var ( & mut self , var : & VarInfo < Self :: Field , Self :: Var > , span : Span ) ;
429
+
430
+ /// print the log given the log_info
431
+ fn print_log (
432
+ & self ,
433
+ witness_env : & mut WitnessEnv < Self :: Field > ,
434
+ logs : & [ ( Span , VarInfo < Self :: Field , Self :: Var > ) ] ,
435
+ sources : & Sources ,
436
+ typed : & Mast < Self > ,
437
+ ) -> Result < ( ) > {
438
+ let mut logs_iter = logs. into_iter ( ) ;
439
+ while let Some ( ( span, var_info) ) = logs_iter. next ( ) {
440
+ let ( filename, source) = sources. get ( & span. filename_id ) . unwrap ( ) ;
441
+ let ( line, _, _) = crate :: utils:: find_exact_line ( source, * span) ;
442
+ let dbg_msg = format ! ( "[{filename}:{line}] -> " ) ;
443
+
444
+ match & var_info. typ {
445
+ // Field
446
+ Some ( TyKind :: Field { .. } ) => match & var_info. var [ 0 ] {
447
+ ConstOrCell :: Const ( cst) => {
448
+ println ! ( "{dbg_msg}{}" , cst. pretty( ) ) ;
449
+ }
450
+ ConstOrCell :: Cell ( cell) => {
451
+ let val = self . compute_var ( witness_env, cell) ?;
452
+ println ! ( "{dbg_msg}{}" , val. pretty( ) ) ;
453
+ }
454
+ } ,
455
+
456
+ // Bool
457
+ Some ( TyKind :: Bool ) => match & var_info. var [ 0 ] {
458
+ ConstOrCell :: Const ( cst) => {
459
+ let val = * cst == Self :: Field :: one ( ) ;
460
+ println ! ( "{dbg_msg}{}" , val) ;
461
+ }
462
+ ConstOrCell :: Cell ( cell) => {
463
+ let val = self . compute_var ( witness_env, cell) ? == Self :: Field :: one ( ) ;
464
+ println ! ( "{dbg_msg}{}" , val) ;
465
+ }
466
+ } ,
467
+
468
+ // Array
469
+ Some ( TyKind :: Array ( b, s) ) => {
470
+ let ( output, remaining) =
471
+ log_array_type ( self , & var_info. var . cvars , b, * s, witness_env, typed, span) ?;
472
+ assert ! ( remaining. is_empty( ) ) ;
473
+ println ! ( "{dbg_msg}{}" , output) ;
474
+ }
475
+
476
+ // Custom types
477
+ Some ( TyKind :: Custom {
478
+ module,
479
+ name : struct_name,
480
+ } ) => {
481
+ let mut string_vec = Vec :: new ( ) ;
482
+ let ( output, remaining) = log_custom_type (
483
+ self ,
484
+ module,
485
+ struct_name,
486
+ typed,
487
+ & var_info. var . cvars ,
488
+ witness_env,
489
+ span,
490
+ & mut string_vec,
491
+ ) ?;
492
+ assert ! ( remaining. is_empty( ) ) ;
493
+ println ! ( "{dbg_msg}{}{}" , struct_name, output) ;
494
+ }
495
+
496
+ // GenericSizedArray
497
+ Some ( TyKind :: GenericSizedArray ( _, _) ) => {
498
+ unreachable ! ( "GenericSizedArray should be monomorphized" )
499
+ }
500
+
501
+ Some ( TyKind :: String ( s) ) => {
502
+ let output =
503
+ log_string_type ( self , & mut logs_iter, s, witness_env, typed, span) ?;
504
+ println ! ( "{dbg_msg}{}" , output) ;
505
+ }
506
+
507
+ None => {
508
+ return Err ( Error :: new (
509
+ "log" ,
510
+ ErrorKind :: UnexpectedError ( "No type info for logging" ) ,
511
+ * span,
512
+ ) )
513
+ }
514
+ }
515
+ }
516
+
517
+ Ok ( ( ) )
518
+ }
427
519
}
0 commit comments