@@ -17,6 +17,9 @@ use crate::circuit_writer::VarInfo;
17
17
use crate :: compiler:: Sources ;
18
18
use crate :: constants:: Span ;
19
19
use crate :: error:: { Error , ErrorKind , Result } ;
20
+ use crate :: mast:: Mast ;
21
+ use crate :: parser:: types:: { ModulePath , TyKind } ;
22
+ use crate :: type_checker:: FullyQualified ;
20
23
use crate :: var:: ConstOrCell ;
21
24
use crate :: { circuit_writer:: DebugInfo , var:: Value } ;
22
25
@@ -485,10 +488,11 @@ where
485
488
486
489
/// Generate the witnesses
487
490
/// This process should check if the constraints are satisfied.
488
- fn generate_witness (
491
+ fn generate_witness < B : Backend > (
489
492
& self ,
490
493
witness_env : & mut crate :: witness:: WitnessEnv < F > ,
491
494
sources : & Sources ,
495
+ typed : & Mast < B > ,
492
496
) -> crate :: error:: Result < Self :: GeneratedWitness > {
493
497
assert ! ( self . finalized, "the circuit is not finalized yet!" ) ;
494
498
@@ -520,15 +524,69 @@ where
520
524
let ( line, _, line_str) = crate :: utils:: find_exact_line ( source, * span) ;
521
525
let line_str = line_str. trim_start ( ) ;
522
526
let dbg_msg = format ! ( "[{filename}:{line}] `{line_str}` -> " ) ;
523
- for cvar in var_info. var . iter ( ) {
524
- match cvar {
527
+
528
+ match & var_info. typ {
529
+ // Field
530
+ Some ( TyKind :: Field { .. } ) => match & var_info. var [ 0 ] {
525
531
ConstOrCell :: Const ( cst) => {
526
532
println ! ( "{dbg_msg}{}" , cst. pretty( ) ) ;
527
533
}
528
534
ConstOrCell :: Cell ( cell) => {
529
535
let val = cell. evaluate ( & witness) ;
530
536
println ! ( "{dbg_msg}{}" , val. pretty( ) ) ;
531
537
}
538
+ } ,
539
+
540
+ // Bool
541
+ Some ( TyKind :: Bool ) => match & var_info. var [ 0 ] {
542
+ ConstOrCell :: Const ( cst) => {
543
+ let val = * cst == F :: one ( ) ;
544
+ println ! ( "{dbg_msg}{}" , val) ;
545
+ }
546
+ ConstOrCell :: Cell ( cell) => {
547
+ let val = cell. evaluate ( & witness) == F :: one ( ) ;
548
+ println ! ( "{dbg_msg}{}" , val) ;
549
+ }
550
+ } ,
551
+
552
+ // Array
553
+ Some ( TyKind :: Array ( b, s) ) => {
554
+ let ( output, remaining) =
555
+ log_array_type ( & var_info. var . cvars , b, * s, & witness, typed, span) ;
556
+ assert ! ( remaining. is_empty( ) ) ;
557
+ println ! ( "{dbg_msg}{}" , output) ;
558
+ }
559
+
560
+ // Custom types
561
+ Some ( TyKind :: Custom {
562
+ module,
563
+ name : struct_name,
564
+ } ) => {
565
+ let mut string_vec = Vec :: new ( ) ;
566
+ let ( output, remaining) = log_custom_type (
567
+ module,
568
+ struct_name,
569
+ typed,
570
+ & var_info. var . cvars ,
571
+ & witness,
572
+ span,
573
+ & mut string_vec,
574
+ ) ;
575
+ assert ! ( remaining. is_empty( ) ) ;
576
+ println ! ( "{dbg_msg}{}{}" , struct_name, output) ;
577
+ }
578
+
579
+ // GenericSizedArray
580
+ Some ( TyKind :: GenericSizedArray ( _, _) ) => {
581
+ unreachable ! ( "GenericSizedArray should be monomorphized" )
582
+ }
583
+
584
+ None => {
585
+ return Err ( Error :: new (
586
+ "log" ,
587
+ ErrorKind :: UnexpectedError ( "No type info for logging" ) ,
588
+ * span,
589
+ ) )
532
590
}
533
591
}
534
592
}
@@ -704,6 +762,173 @@ where
704
762
}
705
763
}
706
764
765
+ fn log_custom_type < F : BackendField , B : Backend > (
766
+ module : & ModulePath ,
767
+ struct_name : & String ,
768
+ typed : & Mast < B > ,
769
+ var_info_var : & [ ConstOrCell < F , LinearCombination < F > > ] ,
770
+ witness : & [ F ] ,
771
+ span : & Span ,
772
+ string_vec : & mut Vec < String > ,
773
+ ) -> ( String , Vec < ConstOrCell < F , LinearCombination < F > > > ) {
774
+ let qualified = FullyQualified :: new ( module, struct_name) ;
775
+ let struct_info = typed
776
+ . struct_info ( & qualified)
777
+ . ok_or (
778
+ typed
779
+ . 0
780
+ . error ( ErrorKind :: UnexpectedError ( "struct not found" ) , * span) ,
781
+ )
782
+ . unwrap ( ) ;
783
+
784
+ let mut remaining = var_info_var. to_vec ( ) ;
785
+
786
+ for ( field_name, field_typ) in & struct_info. fields {
787
+ let len = typed. size_of ( field_typ) ;
788
+ match field_typ {
789
+ TyKind :: Field { .. } => match & remaining[ 0 ] {
790
+ ConstOrCell :: Const ( cst) => {
791
+ string_vec. push ( format ! ( "{field_name}: {}" , cst. pretty( ) ) ) ;
792
+ remaining = remaining[ len..] . to_vec ( ) ;
793
+ }
794
+ ConstOrCell :: Cell ( cell) => {
795
+ let val = cell. evaluate ( witness) ;
796
+ string_vec. push ( format ! ( "{field_name}: {}" , val. pretty( ) ) ) ;
797
+ remaining = remaining[ len..] . to_vec ( ) ;
798
+ }
799
+ } ,
800
+
801
+ TyKind :: Bool => match & remaining[ 0 ] {
802
+ ConstOrCell :: Const ( cst) => {
803
+ let val = * cst == F :: one ( ) ;
804
+ string_vec. push ( format ! ( "{field_name}: {}" , val) ) ;
805
+ remaining = remaining[ len..] . to_vec ( ) ;
806
+ }
807
+ ConstOrCell :: Cell ( cell) => {
808
+ let val = cell. evaluate ( witness) == F :: one ( ) ;
809
+ string_vec. push ( format ! ( "{field_name}: {}" , val) ) ;
810
+ remaining = remaining[ len..] . to_vec ( ) ;
811
+ }
812
+ } ,
813
+
814
+ TyKind :: Array ( b, s) => {
815
+ let ( output, new_remaining) =
816
+ log_array_type ( & remaining, b, * s, witness, typed, span) ;
817
+ string_vec. push ( format ! ( "{field_name}: {}" , output) ) ;
818
+ remaining = new_remaining;
819
+ }
820
+
821
+ TyKind :: Custom {
822
+ module,
823
+ name : struct_name,
824
+ } => {
825
+ let mut custom_string_vec = Vec :: new ( ) ;
826
+ let ( output, new_remaining) = log_custom_type (
827
+ module,
828
+ struct_name,
829
+ typed,
830
+ & remaining,
831
+ witness,
832
+ span,
833
+ & mut custom_string_vec,
834
+ ) ;
835
+ string_vec. push ( format ! ( "{}: {}{}" , field_name, struct_name, output) ) ;
836
+ remaining = new_remaining;
837
+ }
838
+
839
+ TyKind :: GenericSizedArray ( _, _) => {
840
+ unreachable ! ( "GenericSizedArray should be monomorphized" )
841
+ }
842
+ }
843
+ }
844
+
845
+ ( format ! ( "{{ {} }}" , string_vec. join( ", " ) ) , remaining)
846
+ }
847
+
848
+ fn log_array_type < F : BackendField , B : Backend > (
849
+ var_info_var : & [ ConstOrCell < F , LinearCombination < F > > ] ,
850
+ base_type : & TyKind ,
851
+ size : u32 ,
852
+ witness : & [ F ] ,
853
+ typed : & Mast < B > ,
854
+ span : & Span ,
855
+ ) -> ( String , Vec < ConstOrCell < F , LinearCombination < F > > > ) {
856
+ match base_type {
857
+ TyKind :: Field { .. } => {
858
+ let values: Vec < String > = var_info_var
859
+ . iter ( )
860
+ . take ( size as usize )
861
+ . map ( |cvar| match cvar {
862
+ ConstOrCell :: Const ( cst) => cst. pretty ( ) ,
863
+ ConstOrCell :: Cell ( cell) => cell. evaluate ( witness) . pretty ( ) ,
864
+ } )
865
+ . collect ( ) ;
866
+
867
+ let remaining = var_info_var[ size as usize ..] . to_vec ( ) ;
868
+ ( format ! ( "[{}]" , values. join( ", " ) ) , remaining)
869
+ }
870
+
871
+ TyKind :: Bool => {
872
+ let values: Vec < String > = var_info_var
873
+ . iter ( )
874
+ . take ( size as usize )
875
+ . map ( |cvar| match cvar {
876
+ ConstOrCell :: Const ( cst) => {
877
+ let val = * cst == F :: one ( ) ;
878
+ val. to_string ( )
879
+ }
880
+ ConstOrCell :: Cell ( cell) => {
881
+ let val = cell. evaluate ( witness) == F :: one ( ) ;
882
+ val. to_string ( )
883
+ }
884
+ } )
885
+ . collect ( ) ;
886
+
887
+ let remaining = var_info_var[ size as usize ..] . to_vec ( ) ;
888
+ ( format ! ( "[{}]" , values. join( ", " ) ) , remaining)
889
+ }
890
+
891
+ TyKind :: Array ( inner_type, inner_size) => {
892
+ let mut nested_result = Vec :: new ( ) ;
893
+ let mut remaining = var_info_var. to_vec ( ) ;
894
+ for _ in 0 ..size {
895
+ let ( chunk_result, new_remaining) =
896
+ log_array_type ( & remaining, inner_type, * inner_size, witness, typed, span) ;
897
+ nested_result. push ( chunk_result) ;
898
+ remaining = new_remaining;
899
+ }
900
+ ( format ! ( "[{}]" , nested_result. join( ", " ) ) , remaining)
901
+ }
902
+
903
+ TyKind :: Custom {
904
+ module,
905
+ name : struct_name,
906
+ } => {
907
+ let mut nested_result = Vec :: new ( ) ;
908
+ let mut remaining = var_info_var. to_vec ( ) ;
909
+ for _ in 0 ..size {
910
+ let mut string_vec = Vec :: new ( ) ;
911
+ let ( output, new_remaining) = log_custom_type (
912
+ module,
913
+ struct_name,
914
+ typed,
915
+ & remaining,
916
+ witness,
917
+ span,
918
+ & mut string_vec,
919
+ ) ;
920
+ nested_result. push ( format ! ( "{}{}" , struct_name, output) ) ;
921
+ remaining = new_remaining;
922
+ }
923
+ ( format ! ( "[{}]" , nested_result. join( ", " ) ) , remaining)
924
+ }
925
+
926
+ TyKind :: GenericSizedArray ( _, _) => {
927
+ unreachable ! ( "GenericSizedArray should be monomorphized" )
928
+ }
929
+ }
930
+ }
931
+
707
932
#[ cfg( test) ]
708
933
mod tests {
709
934
use crate :: {
0 commit comments