From d1ae316fce9770b0f228d8dcb9ef33a47c034699 Mon Sep 17 00:00:00 2001 From: Guillaume Claret Date: Sun, 26 Jan 2025 18:06:33 +0100 Subject: [PATCH] wip --- .../Circomlib/proof/circuits/sha256/xor3.v | 62 ++++ .../translation/circuits/aliascheck.v | 15 +- .../Circomlib/translation/circuits/babyjub.v | 139 +++++--- .../Circomlib/translation/circuits/binsub.v | 39 ++- .../Circomlib/translation/circuits/binsum.v | 56 +-- .../Circomlib/translation/circuits/bitify.v | 122 ++++--- .../translation/circuits/comparators.v | 117 +++++-- .../translation/circuits/compconstant.v | 70 ++-- .../Circomlib/translation/circuits/eddsa.v | 140 ++++---- .../translation/circuits/eddsamimc.v | 131 +++---- .../translation/circuits/eddsamimcsponge.v | 131 +++---- .../translation/circuits/eddsaposeidon.v | 129 +++---- .../translation/circuits/escalarmul.v | 102 +++--- .../translation/circuits/escalarmulany.v | 243 +++++++------ .../translation/circuits/escalarmulfix.v | 328 ++++++++++-------- .../translation/circuits/escalarmulw4table.v | 40 +-- .../Circomlib/translation/circuits/gates.v | 137 +++++--- .../Circomlib/translation/circuits/mimc.v | 79 +++-- .../translation/circuits/mimcsponge.v | 110 +++--- .../translation/circuits/montgomery.v | 90 +++-- .../translation/circuits/multiplexer.v | 90 +++-- .../Circomlib/translation/circuits/mux1.v | 46 ++- .../Circomlib/translation/circuits/mux2.v | 75 ++-- .../Circomlib/translation/circuits/mux3.v | 95 +++-- .../Circomlib/translation/circuits/mux4.v | 150 ++++---- .../Circomlib/translation/circuits/pedersen.v | 293 ++++++++-------- .../translation/circuits/pedersen_old.v | 50 +-- .../translation/circuits/pointbits.v | 182 +++++----- .../Circomlib/translation/circuits/poseidon.v | 309 ++++++++++------- .../translation/circuits/poseidon_old.v | 142 ++++---- .../translation/circuits/sha256/ch.v | 22 +- .../translation/circuits/sha256/constants.v | 34 +- .../translation/circuits/sha256/main.v | 21 +- .../translation/circuits/sha256/maj.v | 27 +- .../translation/circuits/sha256/rotate.v | 16 +- .../translation/circuits/sha256/sha256.v | 117 ++++--- .../translation/circuits/sha256/sha256_2.v | 107 +++--- .../circuits/sha256/sha256compression.v | 244 +++++++------ .../sha256/sha256compression_function.v | 118 +++---- .../translation/circuits/sha256/shift.v | 18 +- .../translation/circuits/sha256/sigma.v | 92 ++--- .../translation/circuits/sha256/sigmaplus.v | 53 +-- .../translation/circuits/sha256/t1.v | 65 ++-- .../translation/circuits/sha256/t2.v | 50 +-- .../translation/circuits/sha256/xor3.v | 27 +- .../Circomlib/translation/circuits/sign.v | 22 +- .../translation/circuits/smt/smthash_mimc.v | 46 ++- .../circuits/smt/smthash_poseidon.v | 44 ++- .../translation/circuits/smt/smtlevins.v | 40 ++- .../translation/circuits/smt/smtprocessor.v | 184 +++++----- .../circuits/smt/smtprocessorlevel.v | 89 +++-- .../translation/circuits/smt/smtprocessorsm.v | 74 ++-- .../translation/circuits/smt/smtverifier.v | 147 ++++---- .../circuits/smt/smtverifierlevel.v | 60 ++-- .../translation/circuits/smt/smtverifiersm.v | 63 ++-- .../Circomlib/translation/circuits/switcher.v | 28 +- .../translation/test/circuits/binsub_test.v | 43 ++- .../test/circuits/constants_test.v | 21 +- .../test/circuits/escalarmul_min_test.v | 32 +- .../test/circuits/escalarmul_test.v | 36 +- .../test/circuits/escalarmul_test_min.v | 32 +- .../test/circuits/escalarmulany_test.v | 35 +- .../test/circuits/escalarmulfix_test.v | 32 +- .../test/circuits/escalarmulw4table.v | 23 +- .../test/circuits/escalarmulw4table_test.v | 26 +- .../test/circuits/escalarmulw4table_test3.v | 26 +- .../translation/test/circuits/mux1_1.v | 43 ++- .../translation/test/circuits/mux2_1.v | 51 +-- .../translation/test/circuits/mux3_1.v | 59 ++-- .../translation/test/circuits/mux4_1.v | 75 ++-- .../test/circuits/pedersen2_test.v | 34 +- .../translation/test/circuits/pedersen_test.v | 34 +- .../test/circuits/pointbits_loopback.v | 23 +- .../translation/test/circuits/sha256_2_test.v | 21 +- .../translation/test/circuits/sum_test.v | 43 ++- Garden/Garden.v | 130 ++++--- scripts/coq_of_circom.py | 21 +- 77 files changed, 3746 insertions(+), 2614 deletions(-) create mode 100644 Garden/Circom/Circomlib/proof/circuits/sha256/xor3.v diff --git a/Garden/Circom/Circomlib/proof/circuits/sha256/xor3.v b/Garden/Circom/Circomlib/proof/circuits/sha256/xor3.v new file mode 100644 index 0000000..33839b9 --- /dev/null +++ b/Garden/Circom/Circomlib/proof/circuits/sha256/xor3.v @@ -0,0 +1,62 @@ +Require Import Garden.Garden. +Require Import Circom.Circomlib.translation.circuits.sha256.xor3. + +Import Run. + +Lemma run_Xor3 (P : Z) (a b c out mid : list F.t) + (H_length_a : List.length a = 3%nat) + (H_length_b : List.length b = 3%nat) + (H_length_c : List.length c = 3%nat) + (H_bits_a : List.Forall (fun x => x = 0 \/ x = 1) a) + (H_bits_b : List.Forall (fun x => x = 0 \/ x = 1) b) + (H_bits_c : List.Forall (fun x => x = 0 \/ x = 1) c) : + let signals := {| + Xor3Signals.a := a; + Xor3Signals.b := b; + Xor3Signals.c := c; + Xor3Signals.out := out; + Xor3Signals.mid := mid; + |} in + {{ Xor3Signals.IsNamed.P, 97 , signals, Scopes.empty ⏩ + Xor3 3 🔽 BlockUnit.Tt + ⏩ Scopes.empty, True, True }}. +Proof. + do 4 (destruct a as [|? a]; cbn in H_length_a; try discriminate). + do 4 (destruct b as [|? b]; cbn in H_length_b; try discriminate). + do 4 (destruct c as [|? c]; cbn in H_length_c; try discriminate). + repeat match goal with + | H : List.Forall _ _ |- _ => inversion_clear H + end. + repeat match goal with + | H : _ \/ _ |- _ => destruct H + end; + subst. + { run_deterministic. + { eapply Run.PrimitiveGetVarAccessSignal; + (* reflexivity. + now constructor. + cbn. + repeat econstructor. *) + [ + reflexivity | now constructor | now repeat econstructor | + ]. + eapply Run.PrimitiveDeclareSignal. + cbn. + { eapply Run.PrimitiveGetVarAccess. + repeat constructor. + 2: { + repeat constructor. + } + reflexivity. + Show. + + } + { + cbn in H_length_a. + discriminate. + } + 2: { + + } + run_deterministic. +Qed. diff --git a/Garden/Circom/Circomlib/translation/circuits/aliascheck.v b/Garden/Circom/Circomlib/translation/circuits/aliascheck.v index e233d34..b89f94d 100644 --- a/Garden/Circom/Circomlib/translation/circuits/aliascheck.v +++ b/Garden/Circom/Circomlib/translation/circuits/aliascheck.v @@ -7,22 +7,27 @@ Module AliasCheckSignals. (* Input *) in_ : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in". + End IsNamed. End AliasCheckSignals. (* Template body *) Definition AliasCheck : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 254 ] ]] in + do~ M.declare_signal "in" in (* Component *) do~ M.declare_component "compConstant" in - do~ M.substitute_var "compConstant" [[ M.call_function ~(| "CompConstant", [ PrefixOp.sub ~(| 1 |) ] |) ]] in + do~ M.substitute_var "compConstant" [] [[ M.call_function ~(| "CompConstant", [ PrefixOp.sub ~(| 1 |) ] |) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 254 |) ]] ( - do~ M.substitute_var "compConstant" [[ M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "compConstant" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.equality_constraint diff --git a/Garden/Circom/Circomlib/translation/circuits/babyjub.v b/Garden/Circom/Circomlib/translation/circuits/babyjub.v index 9e2aeb0..54a08d8 100644 --- a/Garden/Circom/Circomlib/translation/circuits/babyjub.v +++ b/Garden/Circom/Circomlib/translation/circuits/babyjub.v @@ -25,47 +25,61 @@ Module BabyAddSignals. (* Intermediate *) tau : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | x1 : P _ x1 "x1" + | y1 : P _ y1 "y1" + | x2 : P _ x2 "x2" + | y2 : P _ y2 "y2" + | xout : P _ xout "xout" + | yout : P _ yout "yout" + | beta : P _ beta "beta" + | gamma : P _ gamma "gamma" + | delta : P _ delta "delta" + | tau : P _ tau "tau". + End IsNamed. End BabyAddSignals. (* Template body *) Definition BabyAdd : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "x1" [[ ([] : list F.t) ]] in + do~ M.declare_signal "x1" in (* Signal Input *) - do~ M.declare_signal "y1" [[ ([] : list F.t) ]] in + do~ M.declare_signal "y1" in (* Signal Input *) - do~ M.declare_signal "x2" [[ ([] : list F.t) ]] in + do~ M.declare_signal "x2" in (* Signal Input *) - do~ M.declare_signal "y2" [[ ([] : list F.t) ]] in + do~ M.declare_signal "y2" in (* Signal Output *) - do~ M.declare_signal "xout" [[ ([] : list F.t) ]] in + do~ M.declare_signal "xout" in (* Signal Output *) - do~ M.declare_signal "yout" [[ ([] : list F.t) ]] in + do~ M.declare_signal "yout" in (* Signal Intermediate *) - do~ M.declare_signal "beta" [[ ([] : list F.t) ]] in + do~ M.declare_signal "beta" in (* Signal Intermediate *) - do~ M.declare_signal "gamma" [[ ([] : list F.t) ]] in + do~ M.declare_signal "gamma" in (* Signal Intermediate *) - do~ M.declare_signal "delta" [[ ([] : list F.t) ]] in + do~ M.declare_signal "delta" in (* Signal Intermediate *) - do~ M.declare_signal "tau" [[ ([] : list F.t) ]] in + do~ M.declare_signal "tau" in (* Var *) do~ M.declare_var "a" [[ ([] : list F.t) ]] in - do~ M.substitute_var "a" [[ 168700 ]] in + do~ M.substitute_var "a" [] [[ 168700 ]] in (* Var *) do~ M.declare_var "d" [[ ([] : list F.t) ]] in - do~ M.substitute_var "d" [[ 168696 ]] in - do~ M.substitute_var "beta" [[ InfixOp.mul ~(| M.var (| "x1" |), M.var (| "y2" |) |) ]] in - do~ M.substitute_var "gamma" [[ InfixOp.mul ~(| M.var (| "y1" |), M.var (| "x2" |) |) ]] in - do~ M.substitute_var "delta" [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.mul ~(| PrefixOp.sub ~(| M.var (| "a" |) |), M.var (| "x1" |) |), M.var (| "y1" |) |), InfixOp.add ~(| M.var (| "x2" |), M.var (| "y2" |) |) |) ]] in - do~ M.substitute_var "tau" [[ InfixOp.mul ~(| M.var (| "beta" |), M.var (| "gamma" |) |) ]] in - do~ M.substitute_var "xout" [[ InfixOp.div ~(| InfixOp.add ~(| M.var (| "beta" |), M.var (| "gamma" |) |), InfixOp.add ~(| 1, InfixOp.mul ~(| M.var (| "d" |), M.var (| "tau" |) |) |) |) ]] in + do~ M.substitute_var "d" [] [[ 168696 ]] in + do~ M.substitute_var "beta" [] [[ InfixOp.mul ~(| M.var (| "x1" |), M.var (| "y2" |) |) ]] in + do~ M.substitute_var "gamma" [] [[ InfixOp.mul ~(| M.var (| "y1" |), M.var (| "x2" |) |) ]] in + do~ M.substitute_var "delta" [] [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.mul ~(| PrefixOp.sub ~(| M.var (| "a" |) |), M.var (| "x1" |) |), M.var (| "y1" |) |), InfixOp.add ~(| M.var (| "x2" |), M.var (| "y2" |) |) |) ]] in + do~ M.substitute_var "tau" [] [[ InfixOp.mul ~(| M.var (| "beta" |), M.var (| "gamma" |) |) ]] in + do~ M.substitute_var "xout" [] [[ InfixOp.div ~(| InfixOp.add ~(| M.var (| "beta" |), M.var (| "gamma" |) |), InfixOp.add ~(| 1, InfixOp.mul ~(| M.var (| "d" |), M.var (| "tau" |) |) |) |) ]] in do~ M.equality_constraint [[ InfixOp.mul ~(| InfixOp.add ~(| 1, InfixOp.mul ~(| M.var (| "d" |), M.var (| "tau" |) |) |), M.var (| "xout" |) |) ]] [[ InfixOp.add ~(| M.var (| "beta" |), M.var (| "gamma" |) |) ]] in - do~ M.substitute_var "yout" [[ InfixOp.div ~(| InfixOp.sub ~(| InfixOp.add ~(| M.var (| "delta" |), InfixOp.mul ~(| M.var (| "a" |), M.var (| "beta" |) |) |), M.var (| "gamma" |) |), InfixOp.sub ~(| 1, InfixOp.mul ~(| M.var (| "d" |), M.var (| "tau" |) |) |) |) ]] in + do~ M.substitute_var "yout" [] [[ InfixOp.div ~(| InfixOp.sub ~(| InfixOp.add ~(| M.var (| "delta" |), InfixOp.mul ~(| M.var (| "a" |), M.var (| "beta" |) |) |), M.var (| "gamma" |) |), InfixOp.sub ~(| 1, InfixOp.mul ~(| M.var (| "d" |), M.var (| "tau" |) |) |) |) ]] in do~ M.equality_constraint [[ InfixOp.mul ~(| InfixOp.sub ~(| 1, InfixOp.mul ~(| M.var (| "d" |), M.var (| "tau" |) |) |), M.var (| "yout" |) |) ]] [[ InfixOp.sub ~(| InfixOp.add ~(| M.var (| "delta" |), InfixOp.mul ~(| M.var (| "a" |), M.var (| "beta" |) |) |), M.var (| "gamma" |) |) ]] @@ -92,28 +106,36 @@ Module BabyDblSignals. (* Output *) yout : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | x : P _ x "x" + | y : P _ y "y" + | xout : P _ xout "xout" + | yout : P _ yout "yout". + End IsNamed. End BabyDblSignals. (* Template body *) Definition BabyDbl : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "x" [[ ([] : list F.t) ]] in + do~ M.declare_signal "x" in (* Signal Input *) - do~ M.declare_signal "y" [[ ([] : list F.t) ]] in + do~ M.declare_signal "y" in (* Signal Output *) - do~ M.declare_signal "xout" [[ ([] : list F.t) ]] in + do~ M.declare_signal "xout" in (* Signal Output *) - do~ M.declare_signal "yout" [[ ([] : list F.t) ]] in + do~ M.declare_signal "yout" in (* Component *) do~ M.declare_component "adder" in - do~ M.substitute_var "adder" [[ M.call_function ~(| "BabyAdd", ([] : list F.t) |) ]] in - do~ M.substitute_var "adder" [[ M.var (| "x" |) ]] in - do~ M.substitute_var "adder" [[ M.var (| "y" |) ]] in - do~ M.substitute_var "adder" [[ M.var (| "x" |) ]] in - do~ M.substitute_var "adder" [[ M.var (| "y" |) ]] in - do~ M.substitute_var "xout" [[ M.var_access (| "adder", [Access.Component "xout"] |) ]] in - do~ M.substitute_var "yout" [[ M.var_access (| "adder", [Access.Component "yout"] |) ]] in + do~ M.substitute_var "adder" [] [[ M.call_function ~(| "BabyAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "adder" [Access.Component "x1"] [[ M.var (| "x" |) ]] in + do~ M.substitute_var "adder" [Access.Component "y1"] [[ M.var (| "y" |) ]] in + do~ M.substitute_var "adder" [Access.Component "x2"] [[ M.var (| "x" |) ]] in + do~ M.substitute_var "adder" [Access.Component "y2"] [[ M.var (| "y" |) ]] in + do~ M.substitute_var "xout" [] [[ M.var_access (| "adder", [Access.Component "xout"] |) ]] in + do~ M.substitute_var "yout" [] [[ M.var_access (| "adder", [Access.Component "yout"] |) ]] in M.pure BlockUnit.Tt ). @@ -135,27 +157,35 @@ Module BabyCheckSignals. (* Intermediate *) y2 : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | x : P _ x "x" + | y : P _ y "y" + | x2 : P _ x2 "x2" + | y2 : P _ y2 "y2". + End IsNamed. End BabyCheckSignals. (* Template body *) Definition BabyCheck : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "x" [[ ([] : list F.t) ]] in + do~ M.declare_signal "x" in (* Signal Input *) - do~ M.declare_signal "y" [[ ([] : list F.t) ]] in + do~ M.declare_signal "y" in (* Signal Intermediate *) - do~ M.declare_signal "x2" [[ ([] : list F.t) ]] in + do~ M.declare_signal "x2" in (* Signal Intermediate *) - do~ M.declare_signal "y2" [[ ([] : list F.t) ]] in + do~ M.declare_signal "y2" in (* Var *) do~ M.declare_var "a" [[ ([] : list F.t) ]] in - do~ M.substitute_var "a" [[ 168700 ]] in + do~ M.substitute_var "a" [] [[ 168700 ]] in (* Var *) do~ M.declare_var "d" [[ ([] : list F.t) ]] in - do~ M.substitute_var "d" [[ 168696 ]] in - do~ M.substitute_var "x2" [[ InfixOp.mul ~(| M.var (| "x" |), M.var (| "x" |) |) ]] in - do~ M.substitute_var "y2" [[ InfixOp.mul ~(| M.var (| "y" |), M.var (| "y" |) |) ]] in + do~ M.substitute_var "d" [] [[ 168696 ]] in + do~ M.substitute_var "x2" [] [[ InfixOp.mul ~(| M.var (| "x" |), M.var (| "x" |) |) ]] in + do~ M.substitute_var "y2" [] [[ InfixOp.mul ~(| M.var (| "y" |), M.var (| "y" |) |) ]] in do~ M.equality_constraint [[ InfixOp.add ~(| InfixOp.mul ~(| M.var (| "a" |), M.var (| "x2" |) |), M.var (| "y2" |) |) ]] [[ InfixOp.add ~(| 1, InfixOp.mul ~(| InfixOp.mul ~(| M.var (| "d" |), M.var (| "x2" |) |), M.var (| "y2" |) |) |) ]] @@ -179,39 +209,46 @@ Module BabyPbkSignals. (* Output *) Ay : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | Ax : P _ Ax "Ax" + | Ay : P _ Ay "Ay". + End IsNamed. End BabyPbkSignals. (* Template body *) Definition BabyPbk : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ ([] : list F.t) ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "Ax" [[ ([] : list F.t) ]] in + do~ M.declare_signal "Ax" in (* Signal Output *) - do~ M.declare_signal "Ay" [[ ([] : list F.t) ]] in + do~ M.declare_signal "Ay" in (* Var *) do~ M.declare_var "BASE8" [[ [ 2 ] ]] in - do~ M.substitute_var "BASE8" [[ array_with_repeat (0) (2) ]] in - do~ M.substitute_var "BASE8" [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in + do~ M.substitute_var "BASE8" [] [[ array_with_repeat (0) (2) ]] in + do~ M.substitute_var "BASE8" [] [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in (* Component *) do~ M.declare_component "pvkBits" in - do~ M.substitute_var "pvkBits" [[ M.call_function ~(| "Num2Bits", [ 253 ] |) ]] in - do~ M.substitute_var "pvkBits" [[ M.var (| "in" |) ]] in + do~ M.substitute_var "pvkBits" [] [[ M.call_function ~(| "Num2Bits", [ 253 ] |) ]] in + do~ M.substitute_var "pvkBits" [Access.Component "in"] [[ M.var (| "in" |) ]] in (* Component *) do~ M.declare_component "mulFix" in - do~ M.substitute_var "mulFix" [[ M.call_function ~(| "EscalarMulFix", [ 253; M.var (| "BASE8" |) ] |) ]] in + do~ M.substitute_var "mulFix" [] [[ M.call_function ~(| "EscalarMulFix", [ 253; M.var (| "BASE8" |) ] |) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 253 |) ]] ( - do~ M.substitute_var "mulFix" [[ M.var_access (| "pvkBits", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mulFix" [Access.Component "e"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "pvkBits", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "Ax" [[ M.var_access (| "mulFix", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "Ay" [[ M.var_access (| "mulFix", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "Ax" [] [[ M.var_access (| "mulFix", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "Ay" [] [[ M.var_access (| "mulFix", [Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/binsub.v b/Garden/Circom/Circomlib/translation/circuits/binsub.v index 501d4a2..a66dab1 100644 --- a/Garden/Circom/Circomlib/translation/circuits/binsub.v +++ b/Garden/Circom/Circomlib/translation/circuits/binsub.v @@ -11,50 +11,57 @@ Module BinSubSignals. (* Intermediate *) aux : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out" + | aux : P _ aux "aux". + End IsNamed. End BinSubSignals. (* Template body *) Definition BinSub (n : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 2; M.var (| "n" |) ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "out" in (* Signal Intermediate *) - do~ M.declare_signal "aux" [[ ([] : list F.t) ]] in + do~ M.declare_signal "aux" in (* Var *) do~ M.declare_var "lin" [[ ([] : list F.t) ]] in - do~ M.substitute_var "lin" [[ InfixOp.pow ~(| 2, M.var (| "n" |) |) ]] in + do~ M.substitute_var "lin" [] [[ InfixOp.pow ~(| 2, M.var (| "n" |) |) ]] in (* Var *) do~ M.declare_var "lout" [[ ([] : list F.t) ]] in - do~ M.substitute_var "lout" [[ 0 ]] in + do~ M.substitute_var "lout" [] [[ 0 ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "n" |) |) ]] ( - do~ M.substitute_var "lin" [[ InfixOp.add ~(| M.var (| "lin" |), InfixOp.mul ~(| M.var_access (| "in", [Access.Array (0); Access.Array (M.var (| "i" |))] |), InfixOp.pow ~(| 2, M.var (| "i" |) |) |) |) ]] in - do~ M.substitute_var "lin" [[ InfixOp.sub ~(| M.var (| "lin" |), InfixOp.mul ~(| M.var_access (| "in", [Access.Array (1); Access.Array (M.var (| "i" |))] |), InfixOp.pow ~(| 2, M.var (| "i" |) |) |) |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "lin" [] [[ InfixOp.add ~(| M.var (| "lin" |), InfixOp.mul ~(| M.var_access (| "in", [Access.Array (0); Access.Array (M.var (| "i" |))] |), InfixOp.pow ~(| 2, M.var (| "i" |) |) |) |) ]] in + do~ M.substitute_var "lin" [] [[ InfixOp.sub ~(| M.var (| "lin" |), InfixOp.mul ~(| M.var_access (| "in", [Access.Array (1); Access.Array (M.var (| "i" |))] |), InfixOp.pow ~(| 2, M.var (| "i" |) |) |) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "n" |) |) ]] ( - do~ M.substitute_var "out" [[ InfixOp.bitAnd ~(| InfixOp.shiftR ~(| M.var (| "lin" |), M.var (| "i" |) |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |))] [[ InfixOp.bitAnd ~(| InfixOp.shiftR ~(| M.var (| "lin" |), M.var (| "i" |) |), 1 |) ]] in do~ M.equality_constraint [[ InfixOp.mul ~(| M.var_access (| "out", [Access.Array (M.var (| "i" |))] |), InfixOp.sub ~(| M.var_access (| "out", [Access.Array (M.var (| "i" |))] |), 1 |) |) ]] [[ 0 ]] in - do~ M.substitute_var "lout" [[ InfixOp.add ~(| M.var (| "lout" |), InfixOp.mul ~(| M.var_access (| "out", [Access.Array (M.var (| "i" |))] |), InfixOp.pow ~(| 2, M.var (| "i" |) |) |) |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "lout" [] [[ InfixOp.add ~(| M.var (| "lout" |), InfixOp.mul ~(| M.var_access (| "out", [Access.Array (M.var (| "i" |))] |), InfixOp.pow ~(| 2, M.var (| "i" |) |) |) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "aux" [[ InfixOp.bitAnd ~(| InfixOp.shiftR ~(| M.var (| "lin" |), M.var (| "n" |) |), 1 |) ]] in + do~ M.substitute_var "aux" [] [[ InfixOp.bitAnd ~(| InfixOp.shiftR ~(| M.var (| "lin" |), M.var (| "n" |) |), 1 |) ]] in do~ M.equality_constraint [[ InfixOp.mul ~(| M.var (| "aux" |), InfixOp.sub ~(| M.var (| "aux" |), 1 |) |) ]] [[ 0 ]] in - do~ M.substitute_var "lout" [[ InfixOp.add ~(| M.var (| "lout" |), InfixOp.mul ~(| M.var (| "aux" |), InfixOp.pow ~(| 2, M.var (| "n" |) |) |) |) ]] in + do~ M.substitute_var "lout" [] [[ InfixOp.add ~(| M.var (| "lout" |), InfixOp.mul ~(| M.var (| "aux" |), InfixOp.pow ~(| 2, M.var (| "n" |) |) |) |) ]] in do~ M.equality_constraint [[ M.var (| "lin" |) ]] [[ M.var (| "lout" |) ]] diff --git a/Garden/Circom/Circomlib/translation/circuits/binsum.v b/Garden/Circom/Circomlib/translation/circuits/binsum.v index f912e54..94cb72a 100644 --- a/Garden/Circom/Circomlib/translation/circuits/binsum.v +++ b/Garden/Circom/Circomlib/translation/circuits/binsum.v @@ -6,13 +6,13 @@ Definition nbits (a : F.t) : M.t F.t := M.function_body [("a", a)] ( (* Var *) do~ M.declare_var "n" [[ ([] : list F.t) ]] in - do~ M.substitute_var "n" [[ 1 ]] in + do~ M.substitute_var "n" [] [[ 1 ]] in (* Var *) do~ M.declare_var "r" [[ ([] : list F.t) ]] in - do~ M.substitute_var "r" [[ 0 ]] in + do~ M.substitute_var "r" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| InfixOp.sub ~(| M.var (| "n" |), 1 |), M.var (| "a" |) |) ]] ( - do~ M.substitute_var "r" [[ InfixOp.add ~(| M.var (| "r" |), 1 |) ]] in - do~ M.substitute_var "n" [[ InfixOp.mul ~(| M.var (| "n" |), 2 |) ]] in + do~ M.substitute_var "r" [] [[ InfixOp.add ~(| M.var (| "r" |), 1 |) ]] in + do~ M.substitute_var "n" [] [[ InfixOp.mul ~(| M.var (| "n" |), 2 |) ]] in M.pure BlockUnit.Tt ) in do~ M.return_ [[ M.var (| "r" |) ]] in @@ -27,6 +27,12 @@ Module BinSumSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End BinSumSignals. (* Template body *) @@ -34,50 +40,50 @@ Definition BinSum (n ops : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n); ("ops", ops)] ( (* Var *) do~ M.declare_var "nout" [[ ([] : list F.t) ]] in - do~ M.substitute_var "nout" [[ M.call_function ~(| "nbits", [ InfixOp.mul ~(| InfixOp.sub ~(| InfixOp.pow ~(| 2, M.var (| "n" |) |), 1 |), M.var (| "ops" |) |) ] |) ]] in + do~ M.substitute_var "nout" [] [[ M.call_function ~(| "nbits", [ InfixOp.mul ~(| InfixOp.sub ~(| InfixOp.pow ~(| 2, M.var (| "n" |) |), 1 |), M.var (| "ops" |) |) ] |) ]] in (* Signal Input *) - do~ M.declare_signal "in" [[ [ M.var (| "ops" |); M.var (| "n" |) ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ M.var (| "nout" |) ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "lin" [[ ([] : list F.t) ]] in - do~ M.substitute_var "lin" [[ 0 ]] in + do~ M.substitute_var "lin" [] [[ 0 ]] in (* Var *) do~ M.declare_var "lout" [[ ([] : list F.t) ]] in - do~ M.substitute_var "lout" [[ 0 ]] in + do~ M.substitute_var "lout" [] [[ 0 ]] in (* Var *) do~ M.declare_var "k" [[ ([] : list F.t) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in (* Var *) do~ M.declare_var "e2" [[ ([] : list F.t) ]] in - do~ M.substitute_var "e2" [[ 0 ]] in - do~ M.substitute_var "e2" [[ 1 ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "e2" [] [[ 0 ]] in + do~ M.substitute_var "e2" [] [[ 1 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), M.var (| "n" |) |) ]] ( - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "ops" |) |) ]] ( - do~ M.substitute_var "lin" [[ InfixOp.add ~(| M.var (| "lin" |), InfixOp.mul ~(| M.var_access (| "in", [Access.Array (M.var (| "j" |)); Access.Array (M.var (| "k" |))] |), M.var (| "e2" |) |) |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "lin" [] [[ InfixOp.add ~(| M.var (| "lin" |), InfixOp.mul ~(| M.var_access (| "in", [Access.Array (M.var (| "j" |)); Access.Array (M.var (| "k" |))] |), M.var (| "e2" |) |) |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "e2" [[ InfixOp.add ~(| M.var (| "e2" |), M.var (| "e2" |) |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "e2" [] [[ InfixOp.add ~(| M.var (| "e2" |), M.var (| "e2" |) |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "e2" [[ 1 ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "e2" [] [[ 1 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), M.var (| "nout" |) |) ]] ( - do~ M.substitute_var "out" [[ InfixOp.bitAnd ~(| InfixOp.shiftR ~(| M.var (| "lin" |), M.var (| "k" |) |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "k" |))] [[ InfixOp.bitAnd ~(| InfixOp.shiftR ~(| M.var (| "lin" |), M.var (| "k" |) |), 1 |) ]] in do~ M.equality_constraint [[ InfixOp.mul ~(| M.var_access (| "out", [Access.Array (M.var (| "k" |))] |), InfixOp.sub ~(| M.var_access (| "out", [Access.Array (M.var (| "k" |))] |), 1 |) |) ]] [[ 0 ]] in - do~ M.substitute_var "lout" [[ InfixOp.add ~(| M.var (| "lout" |), InfixOp.mul ~(| M.var_access (| "out", [Access.Array (M.var (| "k" |))] |), M.var (| "e2" |) |) |) ]] in - do~ M.substitute_var "e2" [[ InfixOp.add ~(| M.var (| "e2" |), M.var (| "e2" |) |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "lout" [] [[ InfixOp.add ~(| M.var (| "lout" |), InfixOp.mul ~(| M.var_access (| "out", [Access.Array (M.var (| "k" |))] |), M.var (| "e2" |) |) |) ]] in + do~ M.substitute_var "e2" [] [[ InfixOp.add ~(| M.var (| "e2" |), M.var (| "e2" |) |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.equality_constraint diff --git a/Garden/Circom/Circomlib/translation/circuits/bitify.v b/Garden/Circom/Circomlib/translation/circuits/bitify.v index bdc75c7..c9a5cb7 100644 --- a/Garden/Circom/Circomlib/translation/circuits/bitify.v +++ b/Garden/Circom/Circomlib/translation/circuits/bitify.v @@ -9,33 +9,39 @@ Module Num2BitsSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End Num2BitsSignals. (* Template body *) Definition Num2Bits (n : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ ([] : list F.t) ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "lc1" [[ ([] : list F.t) ]] in - do~ M.substitute_var "lc1" [[ 0 ]] in + do~ M.substitute_var "lc1" [] [[ 0 ]] in (* Var *) do~ M.declare_var "e2" [[ ([] : list F.t) ]] in - do~ M.substitute_var "e2" [[ 1 ]] in + do~ M.substitute_var "e2" [] [[ 1 ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "n" |) |) ]] ( - do~ M.substitute_var "out" [[ InfixOp.bitAnd ~(| InfixOp.shiftR ~(| M.var (| "in" |), M.var (| "i" |) |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |))] [[ InfixOp.bitAnd ~(| InfixOp.shiftR ~(| M.var (| "in" |), M.var (| "i" |) |), 1 |) ]] in do~ M.equality_constraint [[ InfixOp.mul ~(| M.var_access (| "out", [Access.Array (M.var (| "i" |))] |), InfixOp.sub ~(| M.var_access (| "out", [Access.Array (M.var (| "i" |))] |), 1 |) |) ]] [[ 0 ]] in - do~ M.substitute_var "lc1" [[ InfixOp.add ~(| M.var (| "lc1" |), InfixOp.mul ~(| M.var_access (| "out", [Access.Array (M.var (| "i" |))] |), M.var (| "e2" |) |) |) ]] in - do~ M.substitute_var "e2" [[ InfixOp.add ~(| M.var (| "e2" |), M.var (| "e2" |) |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "lc1" [] [[ InfixOp.add ~(| M.var (| "lc1" |), InfixOp.mul ~(| M.var_access (| "out", [Access.Array (M.var (| "i" |))] |), M.var (| "e2" |) |) |) ]] in + do~ M.substitute_var "e2" [] [[ InfixOp.add ~(| M.var (| "e2" |), M.var (| "e2" |) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.equality_constraint @@ -59,29 +65,35 @@ Module Num2Bits_strictSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End Num2Bits_strictSignals. (* Template body *) Definition Num2Bits_strict : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ ([] : list F.t) ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 254 ] ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "aliasCheck" in - do~ M.substitute_var "aliasCheck" [[ M.call_function ~(| "AliasCheck", ([] : list F.t) |) ]] in + do~ M.substitute_var "aliasCheck" [] [[ M.call_function ~(| "AliasCheck", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "n2b" in - do~ M.substitute_var "n2b" [[ M.call_function ~(| "Num2Bits", [ 254 ] |) ]] in - do~ M.substitute_var "n2b" [[ M.var (| "in" |) ]] in + do~ M.substitute_var "n2b" [] [[ M.call_function ~(| "Num2Bits", [ 254 ] |) ]] in + do~ M.substitute_var "n2b" [Access.Component "in"] [[ M.var (| "in" |) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 254 |) ]] ( - do~ M.substitute_var "out" [[ M.var_access (| "n2b", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "aliasCheck" [[ M.var_access (| "n2b", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |))] [[ M.var_access (| "n2b", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "aliasCheck" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "n2b", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt @@ -101,31 +113,37 @@ Module Bits2NumSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End Bits2NumSignals. (* Template body *) Definition Bits2Num (n : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "lc1" [[ ([] : list F.t) ]] in - do~ M.substitute_var "lc1" [[ 0 ]] in + do~ M.substitute_var "lc1" [] [[ 0 ]] in (* Var *) do~ M.declare_var "e2" [[ ([] : list F.t) ]] in - do~ M.substitute_var "e2" [[ 1 ]] in + do~ M.substitute_var "e2" [] [[ 1 ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "n" |) |) ]] ( - do~ M.substitute_var "lc1" [[ InfixOp.add ~(| M.var (| "lc1" |), InfixOp.mul ~(| M.var_access (| "in", [Access.Array (M.var (| "i" |))] |), M.var (| "e2" |) |) |) ]] in - do~ M.substitute_var "e2" [[ InfixOp.add ~(| M.var (| "e2" |), M.var (| "e2" |) |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "lc1" [] [[ InfixOp.add ~(| M.var (| "lc1" |), InfixOp.mul ~(| M.var_access (| "in", [Access.Array (M.var (| "i" |))] |), M.var (| "e2" |) |) |) ]] in + do~ M.substitute_var "e2" [] [[ InfixOp.add ~(| M.var (| "e2" |), M.var (| "e2" |) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var (| "lc1" |) ]] in + do~ M.substitute_var "out" [] [[ M.var (| "lc1" |) ]] in M.pure BlockUnit.Tt ). @@ -143,31 +161,37 @@ Module Bits2Num_strictSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End Bits2Num_strictSignals. (* Template body *) Definition Bits2Num_strict : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 254 ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "aliasCheck" in - do~ M.substitute_var "aliasCheck" [[ M.call_function ~(| "AliasCheck", ([] : list F.t) |) ]] in + do~ M.substitute_var "aliasCheck" [] [[ M.call_function ~(| "AliasCheck", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "b2n" in - do~ M.substitute_var "b2n" [[ M.call_function ~(| "Bits2Num", [ 254 ] |) ]] in + do~ M.substitute_var "b2n" [] [[ M.call_function ~(| "Bits2Num", [ 254 ] |) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 254 |) ]] ( - do~ M.substitute_var "b2n" [[ M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "aliasCheck" [[ M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "b2n" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "aliasCheck" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "b2n", [Access.Component "out"] |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "b2n", [Access.Component "out"] |) ]] in M.pure BlockUnit.Tt ). @@ -185,38 +209,44 @@ Module Num2BitsNegSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End Num2BitsNegSignals. (* Template body *) Definition Num2BitsNeg (n : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ ([] : list F.t) ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "lc1" [[ ([] : list F.t) ]] in - do~ M.substitute_var "lc1" [[ 0 ]] in + do~ M.substitute_var "lc1" [] [[ 0 ]] in (* Component *) do~ M.declare_component "isZero" in - do~ M.substitute_var "isZero" [[ M.call_function ~(| "IsZero", ([] : list F.t) |) ]] in + do~ M.substitute_var "isZero" [] [[ M.call_function ~(| "IsZero", ([] : list F.t) |) ]] in (* Var *) do~ M.declare_var "neg" [[ ([] : list F.t) ]] in - do~ M.substitute_var "neg" [[ ternary_expression (InfixOp.eq ~(| M.var (| "n" |), 0 |)) (0) (InfixOp.sub ~(| InfixOp.pow ~(| 2, M.var (| "n" |) |), M.var (| "in" |) |)) ]] in + do~ M.substitute_var "neg" [] [[ ternary_expression (InfixOp.eq ~(| M.var (| "n" |), 0 |)) (0) (InfixOp.sub ~(| InfixOp.pow ~(| 2, M.var (| "n" |) |), M.var (| "in" |) |)) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "n" |) |) ]] ( - do~ M.substitute_var "out" [[ InfixOp.bitAnd ~(| InfixOp.shiftR ~(| M.var (| "neg" |), M.var (| "i" |) |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |))] [[ InfixOp.bitAnd ~(| InfixOp.shiftR ~(| M.var (| "neg" |), M.var (| "i" |) |), 1 |) ]] in do~ M.equality_constraint [[ InfixOp.mul ~(| M.var_access (| "out", [Access.Array (M.var (| "i" |))] |), InfixOp.sub ~(| M.var_access (| "out", [Access.Array (M.var (| "i" |))] |), 1 |) |) ]] [[ 0 ]] in - do~ M.substitute_var "lc1" [[ InfixOp.add ~(| M.var (| "lc1" |), InfixOp.mul ~(| M.var_access (| "out", [Access.Array (M.var (| "i" |))] |), InfixOp.pow ~(| 2, M.var (| "i" |) |) |) |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "lc1" [] [[ InfixOp.add ~(| M.var (| "lc1" |), InfixOp.mul ~(| M.var_access (| "out", [Access.Array (M.var (| "i" |))] |), InfixOp.pow ~(| 2, M.var (| "i" |) |) |) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "isZero" [[ M.var (| "in" |) ]] in + do~ M.substitute_var "isZero" [Access.Component "in"] [[ M.var (| "in" |) ]] in do~ M.equality_constraint [[ InfixOp.add ~(| M.var (| "lc1" |), InfixOp.mul ~(| M.var_access (| "isZero", [Access.Component "out"] |), InfixOp.pow ~(| 2, M.var (| "n" |) |) |) |) ]] [[ InfixOp.sub ~(| InfixOp.pow ~(| 2, M.var (| "n" |) |), M.var (| "in" |) |) ]] diff --git a/Garden/Circom/Circomlib/translation/circuits/comparators.v b/Garden/Circom/Circomlib/translation/circuits/comparators.v index 82c9650..96890be 100644 --- a/Garden/Circom/Circomlib/translation/circuits/comparators.v +++ b/Garden/Circom/Circomlib/translation/circuits/comparators.v @@ -11,19 +11,26 @@ Module IsZeroSignals. (* Intermediate *) inv : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out" + | inv : P _ inv "inv". + End IsNamed. End IsZeroSignals. (* Template body *) Definition IsZero : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ ([] : list F.t) ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Signal Intermediate *) - do~ M.declare_signal "inv" [[ ([] : list F.t) ]] in - do~ M.substitute_var "inv" [[ ternary_expression (InfixOp.notEq ~(| M.var (| "in" |), 0 |)) (InfixOp.div ~(| 1, M.var (| "in" |) |)) (0) ]] in - do~ M.substitute_var "out" [[ InfixOp.add ~(| InfixOp.mul ~(| PrefixOp.sub ~(| M.var (| "in" |) |), M.var (| "inv" |) |), 1 |) ]] in + do~ M.declare_signal "inv" in + do~ M.substitute_var "inv" [] [[ ternary_expression (InfixOp.notEq ~(| M.var (| "in" |), 0 |)) (InfixOp.div ~(| 1, M.var (| "in" |) |)) (0) ]] in + do~ M.substitute_var "out" [] [[ InfixOp.add ~(| InfixOp.mul ~(| PrefixOp.sub ~(| M.var (| "in" |) |), M.var (| "inv" |) |), 1 |) ]] in do~ M.equality_constraint [[ InfixOp.mul ~(| M.var (| "in" |), M.var (| "out" |) |) ]] [[ 0 ]] @@ -46,20 +53,26 @@ Module IsEqualSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End IsEqualSignals. (* Template body *) Definition IsEqual : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 2 ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "isz" in - do~ M.substitute_var "isz" [[ M.call_function ~(| "IsZero", ([] : list F.t) |) ]] in - do~ M.substitute_var "isz" [[ InfixOp.sub ~(| M.var_access (| "in", [Access.Array (1)] |), M.var_access (| "in", [Access.Array (0)] |) |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "isz", [Access.Component "out"] |) ]] in + do~ M.substitute_var "isz" [] [[ M.call_function ~(| "IsZero", ([] : list F.t) |) ]] in + do~ M.substitute_var "isz" [Access.Component "in"] [[ InfixOp.sub ~(| M.var_access (| "in", [Access.Array (1)] |), M.var_access (| "in", [Access.Array (0)] |) |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "isz", [Access.Component "out"] |) ]] in M.pure BlockUnit.Tt ). @@ -77,19 +90,25 @@ Module ForceEqualIfEnabledSignals. (* Input *) in_ : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | enabled : P _ enabled "enabled" + | in_ : P _ in_ "in". + End IsNamed. End ForceEqualIfEnabledSignals. (* Template body *) Definition ForceEqualIfEnabled : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "enabled" [[ ([] : list F.t) ]] in + do~ M.declare_signal "enabled" in (* Signal Input *) - do~ M.declare_signal "in" [[ [ 2 ] ]] in + do~ M.declare_signal "in" in (* Component *) do~ M.declare_component "isz" in - do~ M.substitute_var "isz" [[ M.call_function ~(| "IsZero", ([] : list F.t) |) ]] in - do~ M.substitute_var "isz" [[ InfixOp.sub ~(| M.var_access (| "in", [Access.Array (1)] |), M.var_access (| "in", [Access.Array (0)] |) |) ]] in + do~ M.substitute_var "isz" [] [[ M.call_function ~(| "IsZero", ([] : list F.t) |) ]] in + do~ M.substitute_var "isz" [Access.Component "in"] [[ InfixOp.sub ~(| M.var_access (| "in", [Access.Array (1)] |), M.var_access (| "in", [Access.Array (0)] |) |) ]] in do~ M.equality_constraint [[ InfixOp.mul ~(| InfixOp.sub ~(| 1, M.var_access (| "isz", [Access.Component "out"] |) |), M.var (| "enabled" |) |) ]] [[ 0 ]] @@ -110,6 +129,12 @@ Module LessThanSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End LessThanSignals. (* Template body *) @@ -117,14 +142,14 @@ Definition LessThan (n : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n)] ( do~ M.assert [[ InfixOp.lesserEq ~(| M.var (| "n" |), 252 |) ]] in (* Signal Input *) - do~ M.declare_signal "in" [[ [ 2 ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "n2b" in - do~ M.substitute_var "n2b" [[ M.call_function ~(| "Num2Bits", [ InfixOp.add ~(| M.var (| "n" |), 1 |) ] |) ]] in - do~ M.substitute_var "n2b" [[ InfixOp.sub ~(| InfixOp.add ~(| M.var_access (| "in", [Access.Array (0)] |), InfixOp.shiftL ~(| 1, M.var (| "n" |) |) |), M.var_access (| "in", [Access.Array (1)] |) |) ]] in - do~ M.substitute_var "out" [[ InfixOp.sub ~(| 1, M.var_access (| "n2b", [Access.Component "out"; Access.Array (M.var (| "n" |))] |) |) ]] in + do~ M.substitute_var "n2b" [] [[ M.call_function ~(| "Num2Bits", [ InfixOp.add ~(| M.var (| "n" |), 1 |) ] |) ]] in + do~ M.substitute_var "n2b" [Access.Component "in"] [[ InfixOp.sub ~(| InfixOp.add ~(| M.var_access (| "in", [Access.Array (0)] |), InfixOp.shiftL ~(| 1, M.var (| "n" |) |) |), M.var_access (| "in", [Access.Array (1)] |) |) ]] in + do~ M.substitute_var "out" [] [[ InfixOp.sub ~(| 1, M.var_access (| "n2b", [Access.Component "out"; Access.Array (M.var (| "n" |))] |) |) ]] in M.pure BlockUnit.Tt ). @@ -142,21 +167,27 @@ Module LessEqThanSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End LessEqThanSignals. (* Template body *) Definition LessEqThan (n : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 2 ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "lt" in - do~ M.substitute_var "lt" [[ M.call_function ~(| "LessThan", [ M.var (| "n" |) ] |) ]] in - do~ M.substitute_var "lt" [[ M.var_access (| "in", [Access.Array (0)] |) ]] in - do~ M.substitute_var "lt" [[ InfixOp.add ~(| M.var_access (| "in", [Access.Array (1)] |), 1 |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "lt", [Access.Component "out"] |) ]] in + do~ M.substitute_var "lt" [] [[ M.call_function ~(| "LessThan", [ M.var (| "n" |) ] |) ]] in + do~ M.substitute_var "lt" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "in", [Access.Array (0)] |) ]] in + do~ M.substitute_var "lt" [Access.Component "in"; Access.Array (1)] [[ InfixOp.add ~(| M.var_access (| "in", [Access.Array (1)] |), 1 |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "lt", [Access.Component "out"] |) ]] in M.pure BlockUnit.Tt ). @@ -174,21 +205,27 @@ Module GreaterThanSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End GreaterThanSignals. (* Template body *) Definition GreaterThan (n : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 2 ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "lt" in - do~ M.substitute_var "lt" [[ M.call_function ~(| "LessThan", [ M.var (| "n" |) ] |) ]] in - do~ M.substitute_var "lt" [[ M.var_access (| "in", [Access.Array (1)] |) ]] in - do~ M.substitute_var "lt" [[ M.var_access (| "in", [Access.Array (0)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "lt", [Access.Component "out"] |) ]] in + do~ M.substitute_var "lt" [] [[ M.call_function ~(| "LessThan", [ M.var (| "n" |) ] |) ]] in + do~ M.substitute_var "lt" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "in", [Access.Array (1)] |) ]] in + do~ M.substitute_var "lt" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "in", [Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "lt", [Access.Component "out"] |) ]] in M.pure BlockUnit.Tt ). @@ -206,21 +243,27 @@ Module GreaterEqThanSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End GreaterEqThanSignals. (* Template body *) Definition GreaterEqThan (n : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 2 ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "lt" in - do~ M.substitute_var "lt" [[ M.call_function ~(| "LessThan", [ M.var (| "n" |) ] |) ]] in - do~ M.substitute_var "lt" [[ M.var_access (| "in", [Access.Array (1)] |) ]] in - do~ M.substitute_var "lt" [[ InfixOp.add ~(| M.var_access (| "in", [Access.Array (0)] |), 1 |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "lt", [Access.Component "out"] |) ]] in + do~ M.substitute_var "lt" [] [[ M.call_function ~(| "LessThan", [ M.var (| "n" |) ] |) ]] in + do~ M.substitute_var "lt" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "in", [Access.Array (1)] |) ]] in + do~ M.substitute_var "lt" [Access.Component "in"; Access.Array (1)] [[ InfixOp.add ~(| M.var_access (| "in", [Access.Array (0)] |), 1 |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "lt", [Access.Component "out"] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/compconstant.v b/Garden/Circom/Circomlib/translation/circuits/compconstant.v index eb09d5a..ec25a25 100644 --- a/Garden/Circom/Circomlib/translation/circuits/compconstant.v +++ b/Garden/Circom/Circomlib/translation/circuits/compconstant.v @@ -13,84 +13,92 @@ Module CompConstantSignals. (* Intermediate *) sout : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out" + | parts : P _ parts "parts" + | sout : P _ sout "sout". + End IsNamed. End CompConstantSignals. (* Template body *) Definition CompConstant (ct : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("ct", ct)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 254 ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Signal Intermediate *) - do~ M.declare_signal "parts" [[ [ 127 ] ]] in + do~ M.declare_signal "parts" in (* Signal Intermediate *) - do~ M.declare_signal "sout" [[ ([] : list F.t) ]] in + do~ M.declare_signal "sout" in (* Var *) do~ M.declare_var "clsb" [[ ([] : list F.t) ]] in - do~ M.substitute_var "clsb" [[ 0 ]] in + do~ M.substitute_var "clsb" [] [[ 0 ]] in (* Var *) do~ M.declare_var "cmsb" [[ ([] : list F.t) ]] in - do~ M.substitute_var "cmsb" [[ 0 ]] in + do~ M.substitute_var "cmsb" [] [[ 0 ]] in (* Var *) do~ M.declare_var "slsb" [[ ([] : list F.t) ]] in - do~ M.substitute_var "slsb" [[ 0 ]] in + do~ M.substitute_var "slsb" [] [[ 0 ]] in (* Var *) do~ M.declare_var "smsb" [[ ([] : list F.t) ]] in - do~ M.substitute_var "smsb" [[ 0 ]] in + do~ M.substitute_var "smsb" [] [[ 0 ]] in (* Var *) do~ M.declare_var "sum" [[ ([] : list F.t) ]] in - do~ M.substitute_var "sum" [[ 0 ]] in + do~ M.substitute_var "sum" [] [[ 0 ]] in (* Var *) do~ M.declare_var "b" [[ ([] : list F.t) ]] in - do~ M.substitute_var "b" [[ InfixOp.sub ~(| InfixOp.shiftL ~(| 1, 128 |), 1 |) ]] in + do~ M.substitute_var "b" [] [[ InfixOp.sub ~(| InfixOp.shiftL ~(| 1, 128 |), 1 |) ]] in (* Var *) do~ M.declare_var "a" [[ ([] : list F.t) ]] in - do~ M.substitute_var "a" [[ 1 ]] in + do~ M.substitute_var "a" [] [[ 1 ]] in (* Var *) do~ M.declare_var "e" [[ ([] : list F.t) ]] in - do~ M.substitute_var "e" [[ 1 ]] in + do~ M.substitute_var "e" [] [[ 1 ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 127 |) ]] ( - do~ M.substitute_var "clsb" [[ InfixOp.bitAnd ~(| InfixOp.shiftR ~(| M.var (| "ct" |), InfixOp.mul ~(| M.var (| "i" |), 2 |) |), 1 |) ]] in - do~ M.substitute_var "cmsb" [[ InfixOp.bitAnd ~(| InfixOp.shiftR ~(| M.var (| "ct" |), InfixOp.add ~(| InfixOp.mul ~(| M.var (| "i" |), 2 |), 1 |) |), 1 |) ]] in - do~ M.substitute_var "slsb" [[ M.var_access (| "in", [Access.Array (InfixOp.mul ~(| M.var (| "i" |), 2 |))] |) ]] in - do~ M.substitute_var "smsb" [[ M.var_access (| "in", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| M.var (| "i" |), 2 |), 1 |))] |) ]] in + do~ M.substitute_var "clsb" [] [[ InfixOp.bitAnd ~(| InfixOp.shiftR ~(| M.var (| "ct" |), InfixOp.mul ~(| M.var (| "i" |), 2 |) |), 1 |) ]] in + do~ M.substitute_var "cmsb" [] [[ InfixOp.bitAnd ~(| InfixOp.shiftR ~(| M.var (| "ct" |), InfixOp.add ~(| InfixOp.mul ~(| M.var (| "i" |), 2 |), 1 |) |), 1 |) ]] in + do~ M.substitute_var "slsb" [] [[ M.var_access (| "in", [Access.Array (InfixOp.mul ~(| M.var (| "i" |), 2 |))] |) ]] in + do~ M.substitute_var "smsb" [] [[ M.var_access (| "in", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| M.var (| "i" |), 2 |), 1 |))] |) ]] in do~ M.if_ [[ InfixOp.boolAnd ~(| InfixOp.eq ~(| M.var (| "cmsb" |), 0 |), InfixOp.eq ~(| M.var (| "clsb" |), 0 |) |) ]] (* then *) ( - do~ M.substitute_var "parts" [[ InfixOp.add ~(| InfixOp.add ~(| InfixOp.mul ~(| InfixOp.mul ~(| PrefixOp.sub ~(| M.var (| "b" |) |), M.var (| "smsb" |) |), M.var (| "slsb" |) |), InfixOp.mul ~(| M.var (| "b" |), M.var (| "smsb" |) |) |), InfixOp.mul ~(| M.var (| "b" |), M.var (| "slsb" |) |) |) ]] in + do~ M.substitute_var "parts" [Access.Array (M.var (| "i" |))] [[ InfixOp.add ~(| InfixOp.add ~(| InfixOp.mul ~(| InfixOp.mul ~(| PrefixOp.sub ~(| M.var (| "b" |) |), M.var (| "smsb" |) |), M.var (| "slsb" |) |), InfixOp.mul ~(| M.var (| "b" |), M.var (| "smsb" |) |) |), InfixOp.mul ~(| M.var (| "b" |), M.var (| "slsb" |) |) |) ]] in M.pure BlockUnit.Tt ) (* else *) ( do~ M.if_ [[ InfixOp.boolAnd ~(| InfixOp.eq ~(| M.var (| "cmsb" |), 0 |), InfixOp.eq ~(| M.var (| "clsb" |), 1 |) |) ]] (* then *) ( - do~ M.substitute_var "parts" [[ InfixOp.add ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.mul ~(| InfixOp.mul ~(| M.var (| "a" |), M.var (| "smsb" |) |), M.var (| "slsb" |) |), InfixOp.mul ~(| M.var (| "a" |), M.var (| "slsb" |) |) |), InfixOp.mul ~(| M.var (| "b" |), M.var (| "smsb" |) |) |), InfixOp.mul ~(| M.var (| "a" |), M.var (| "smsb" |) |) |), M.var (| "a" |) |) ]] in + do~ M.substitute_var "parts" [Access.Array (M.var (| "i" |))] [[ InfixOp.add ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.mul ~(| InfixOp.mul ~(| M.var (| "a" |), M.var (| "smsb" |) |), M.var (| "slsb" |) |), InfixOp.mul ~(| M.var (| "a" |), M.var (| "slsb" |) |) |), InfixOp.mul ~(| M.var (| "b" |), M.var (| "smsb" |) |) |), InfixOp.mul ~(| M.var (| "a" |), M.var (| "smsb" |) |) |), M.var (| "a" |) |) ]] in M.pure BlockUnit.Tt ) (* else *) ( do~ M.if_ [[ InfixOp.boolAnd ~(| InfixOp.eq ~(| M.var (| "cmsb" |), 1 |), InfixOp.eq ~(| M.var (| "clsb" |), 0 |) |) ]] (* then *) ( - do~ M.substitute_var "parts" [[ InfixOp.add ~(| InfixOp.sub ~(| InfixOp.mul ~(| InfixOp.mul ~(| M.var (| "b" |), M.var (| "smsb" |) |), M.var (| "slsb" |) |), InfixOp.mul ~(| M.var (| "a" |), M.var (| "smsb" |) |) |), M.var (| "a" |) |) ]] in + do~ M.substitute_var "parts" [Access.Array (M.var (| "i" |))] [[ InfixOp.add ~(| InfixOp.sub ~(| InfixOp.mul ~(| InfixOp.mul ~(| M.var (| "b" |), M.var (| "smsb" |) |), M.var (| "slsb" |) |), InfixOp.mul ~(| M.var (| "a" |), M.var (| "smsb" |) |) |), M.var (| "a" |) |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "parts" [[ InfixOp.add ~(| InfixOp.mul ~(| InfixOp.mul ~(| PrefixOp.sub ~(| M.var (| "a" |) |), M.var (| "smsb" |) |), M.var (| "slsb" |) |), M.var (| "a" |) |) ]] in + do~ M.substitute_var "parts" [Access.Array (M.var (| "i" |))] [[ InfixOp.add ~(| InfixOp.mul ~(| InfixOp.mul ~(| PrefixOp.sub ~(| M.var (| "a" |) |), M.var (| "smsb" |) |), M.var (| "slsb" |) |), M.var (| "a" |) |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "sum" [[ InfixOp.add ~(| M.var (| "sum" |), M.var_access (| "parts", [Access.Array (M.var (| "i" |))] |) |) ]] in - do~ M.substitute_var "b" [[ InfixOp.sub ~(| M.var (| "b" |), M.var (| "e" |) |) ]] in - do~ M.substitute_var "a" [[ InfixOp.add ~(| M.var (| "a" |), M.var (| "e" |) |) ]] in - do~ M.substitute_var "e" [[ InfixOp.mul ~(| M.var (| "e" |), 2 |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "sum" [] [[ InfixOp.add ~(| M.var (| "sum" |), M.var_access (| "parts", [Access.Array (M.var (| "i" |))] |) |) ]] in + do~ M.substitute_var "b" [] [[ InfixOp.sub ~(| M.var (| "b" |), M.var (| "e" |) |) ]] in + do~ M.substitute_var "a" [] [[ InfixOp.add ~(| M.var (| "a" |), M.var (| "e" |) |) ]] in + do~ M.substitute_var "e" [] [[ InfixOp.mul ~(| M.var (| "e" |), 2 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "sout" [[ M.var (| "sum" |) ]] in + do~ M.substitute_var "sout" [] [[ M.var (| "sum" |) ]] in (* Component *) do~ M.declare_component "num2bits" in - do~ M.substitute_var "num2bits" [[ M.call_function ~(| "Num2Bits", [ 135 ] |) ]] in - do~ M.substitute_var "num2bits" [[ M.var (| "sout" |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "num2bits", [Access.Component "out"; Access.Array (127)] |) ]] in + do~ M.substitute_var "num2bits" [] [[ M.call_function ~(| "Num2Bits", [ 135 ] |) ]] in + do~ M.substitute_var "num2bits" [Access.Component "in"] [[ M.var (| "sout" |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "num2bits", [Access.Component "out"; Access.Array (127)] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/eddsa.v b/Garden/Circom/Circomlib/translation/circuits/eddsa.v index 55fdf8e..25f1aaf 100644 --- a/Garden/Circom/Circomlib/translation/circuits/eddsa.v +++ b/Garden/Circom/Circomlib/translation/circuits/eddsa.v @@ -21,37 +21,49 @@ Module EdDSAVerifierSignals. (* Intermediate *) R8y : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | msg : P _ msg "msg" + | A : P _ A "A" + | R8 : P _ R8 "R8" + | S : P _ S "S" + | Ax : P _ Ax "Ax" + | Ay : P _ Ay "Ay" + | R8x : P _ R8x "R8x" + | R8y : P _ R8y "R8y". + End IsNamed. End EdDSAVerifierSignals. (* Template body *) Definition EdDSAVerifier (n : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n)] ( (* Signal Input *) - do~ M.declare_signal "msg" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "msg" in (* Signal Input *) - do~ M.declare_signal "A" [[ [ 256 ] ]] in + do~ M.declare_signal "A" in (* Signal Input *) - do~ M.declare_signal "R8" [[ [ 256 ] ]] in + do~ M.declare_signal "R8" in (* Signal Input *) - do~ M.declare_signal "S" [[ [ 256 ] ]] in + do~ M.declare_signal "S" in (* Signal Intermediate *) - do~ M.declare_signal "Ax" [[ ([] : list F.t) ]] in + do~ M.declare_signal "Ax" in (* Signal Intermediate *) - do~ M.declare_signal "Ay" [[ ([] : list F.t) ]] in + do~ M.declare_signal "Ay" in (* Signal Intermediate *) - do~ M.declare_signal "R8x" [[ ([] : list F.t) ]] in + do~ M.declare_signal "R8x" in (* Signal Intermediate *) - do~ M.declare_signal "R8y" [[ ([] : list F.t) ]] in + do~ M.declare_signal "R8y" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Component *) do~ M.declare_component "compConstant" in - do~ M.substitute_var "compConstant" [[ M.call_function ~(| "CompConstant", [ 2736030358979909402780800718157159386076813972158567259200215660948447373040 ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "compConstant" [] [[ M.call_function ~(| "CompConstant", [ 2736030358979909402780800718157159386076813972158567259200215660948447373040 ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 254 |) ]] ( - do~ M.substitute_var "compConstant" [[ M.var_access (| "S", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "compConstant" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "S", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.equality_constraint @@ -68,99 +80,99 @@ Definition EdDSAVerifier (n : F.t) : M.t (BlockUnit.t Empty_set) := in (* Component *) do~ M.declare_component "bits2pointA" in - do~ M.substitute_var "bits2pointA" [[ M.call_function ~(| "Bits2Point_Strict", ([] : list F.t) |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "bits2pointA" [] [[ M.call_function ~(| "Bits2Point_Strict", ([] : list F.t) |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 256 |) ]] ( - do~ M.substitute_var "bits2pointA" [[ M.var_access (| "A", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "bits2pointA" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "A", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "Ax" [[ M.var_access (| "bits2pointA", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "Ay" [[ M.var_access (| "bits2pointA", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "Ax" [] [[ M.var_access (| "bits2pointA", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "Ay" [] [[ M.var_access (| "bits2pointA", [Access.Component "out"; Access.Array (1)] |) ]] in (* Component *) do~ M.declare_component "bits2pointR8" in - do~ M.substitute_var "bits2pointR8" [[ M.call_function ~(| "Bits2Point_Strict", ([] : list F.t) |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "bits2pointR8" [] [[ M.call_function ~(| "Bits2Point_Strict", ([] : list F.t) |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 256 |) ]] ( - do~ M.substitute_var "bits2pointR8" [[ M.var_access (| "R8", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "bits2pointR8" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "R8", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "R8x" [[ M.var_access (| "bits2pointR8", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "R8y" [[ M.var_access (| "bits2pointR8", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "R8x" [] [[ M.var_access (| "bits2pointR8", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "R8y" [] [[ M.var_access (| "bits2pointR8", [Access.Component "out"; Access.Array (1)] |) ]] in (* Component *) do~ M.declare_component "hash" in - do~ M.substitute_var "hash" [[ M.call_function ~(| "Pedersen", [ InfixOp.add ~(| 512, M.var (| "n" |) |) ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "hash" [] [[ M.call_function ~(| "Pedersen", [ InfixOp.add ~(| 512, M.var (| "n" |) |) ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 256 |) ]] ( - do~ M.substitute_var "hash" [[ M.var_access (| "R8", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "hash" [[ M.var_access (| "A", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "hash" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "R8", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "hash" [Access.Component "in"; Access.Array (InfixOp.add ~(| 256, M.var (| "i" |) |))] [[ M.var_access (| "A", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "n" |) |) ]] ( - do~ M.substitute_var "hash" [[ M.var_access (| "msg", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "hash" [Access.Component "in"; Access.Array (InfixOp.add ~(| 512, M.var (| "i" |) |))] [[ M.var_access (| "msg", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "point2bitsH" in - do~ M.substitute_var "point2bitsH" [[ M.call_function ~(| "Point2Bits_Strict", ([] : list F.t) |) ]] in - do~ M.substitute_var "point2bitsH" [[ M.var_access (| "hash", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "point2bitsH" [[ M.var_access (| "hash", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "point2bitsH" [] [[ M.call_function ~(| "Point2Bits_Strict", ([] : list F.t) |) ]] in + do~ M.substitute_var "point2bitsH" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "hash", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "point2bitsH" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "hash", [Access.Component "out"; Access.Array (1)] |) ]] in (* Component *) do~ M.declare_component "dbl1" in - do~ M.substitute_var "dbl1" [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in - do~ M.substitute_var "dbl1" [[ M.var (| "Ax" |) ]] in - do~ M.substitute_var "dbl1" [[ M.var (| "Ay" |) ]] in + do~ M.substitute_var "dbl1" [] [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in + do~ M.substitute_var "dbl1" [Access.Component "x"] [[ M.var (| "Ax" |) ]] in + do~ M.substitute_var "dbl1" [Access.Component "y"] [[ M.var (| "Ay" |) ]] in (* Component *) do~ M.declare_component "dbl2" in - do~ M.substitute_var "dbl2" [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in - do~ M.substitute_var "dbl2" [[ M.var_access (| "dbl1", [Access.Component "xout"] |) ]] in - do~ M.substitute_var "dbl2" [[ M.var_access (| "dbl1", [Access.Component "yout"] |) ]] in + do~ M.substitute_var "dbl2" [] [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in + do~ M.substitute_var "dbl2" [Access.Component "x"] [[ M.var_access (| "dbl1", [Access.Component "xout"] |) ]] in + do~ M.substitute_var "dbl2" [Access.Component "y"] [[ M.var_access (| "dbl1", [Access.Component "yout"] |) ]] in (* Component *) do~ M.declare_component "dbl3" in - do~ M.substitute_var "dbl3" [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in - do~ M.substitute_var "dbl3" [[ M.var_access (| "dbl2", [Access.Component "xout"] |) ]] in - do~ M.substitute_var "dbl3" [[ M.var_access (| "dbl2", [Access.Component "yout"] |) ]] in + do~ M.substitute_var "dbl3" [] [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in + do~ M.substitute_var "dbl3" [Access.Component "x"] [[ M.var_access (| "dbl2", [Access.Component "xout"] |) ]] in + do~ M.substitute_var "dbl3" [Access.Component "y"] [[ M.var_access (| "dbl2", [Access.Component "yout"] |) ]] in (* Component *) do~ M.declare_component "isZero" in - do~ M.substitute_var "isZero" [[ M.call_function ~(| "IsZero", ([] : list F.t) |) ]] in - do~ M.substitute_var "isZero" [[ M.var_access (| "dbl3", [Access.Component "x"] |) ]] in + do~ M.substitute_var "isZero" [] [[ M.call_function ~(| "IsZero", ([] : list F.t) |) ]] in + do~ M.substitute_var "isZero" [Access.Component "in"] [[ M.var_access (| "dbl3", [Access.Component "x"] |) ]] in do~ M.equality_constraint [[ M.var_access (| "isZero", [Access.Component "out"] |) ]] [[ 0 ]] in (* Component *) do~ M.declare_component "mulAny" in - do~ M.substitute_var "mulAny" [[ M.call_function ~(| "EscalarMulAny", [ 256 ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "mulAny" [] [[ M.call_function ~(| "EscalarMulAny", [ 256 ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 256 |) ]] ( - do~ M.substitute_var "mulAny" [[ M.var_access (| "point2bitsH", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mulAny" [Access.Component "e"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "point2bitsH", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "mulAny" [[ M.var_access (| "dbl3", [Access.Component "xout"] |) ]] in - do~ M.substitute_var "mulAny" [[ M.var_access (| "dbl3", [Access.Component "yout"] |) ]] in + do~ M.substitute_var "mulAny" [Access.Component "p"; Access.Array (0)] [[ M.var_access (| "dbl3", [Access.Component "xout"] |) ]] in + do~ M.substitute_var "mulAny" [Access.Component "p"; Access.Array (1)] [[ M.var_access (| "dbl3", [Access.Component "yout"] |) ]] in (* Component *) do~ M.declare_component "addRight" in - do~ M.substitute_var "addRight" [[ M.call_function ~(| "BabyAdd", ([] : list F.t) |) ]] in - do~ M.substitute_var "addRight" [[ M.var (| "R8x" |) ]] in - do~ M.substitute_var "addRight" [[ M.var (| "R8y" |) ]] in - do~ M.substitute_var "addRight" [[ M.var_access (| "mulAny", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "addRight" [[ M.var_access (| "mulAny", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "addRight" [] [[ M.call_function ~(| "BabyAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "addRight" [Access.Component "x1"] [[ M.var (| "R8x" |) ]] in + do~ M.substitute_var "addRight" [Access.Component "y1"] [[ M.var (| "R8y" |) ]] in + do~ M.substitute_var "addRight" [Access.Component "x2"] [[ M.var_access (| "mulAny", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "addRight" [Access.Component "y2"] [[ M.var_access (| "mulAny", [Access.Component "out"; Access.Array (1)] |) ]] in (* Var *) do~ M.declare_var "BASE8" [[ [ 2 ] ]] in - do~ M.substitute_var "BASE8" [[ array_with_repeat (0) (2) ]] in - do~ M.substitute_var "BASE8" [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in + do~ M.substitute_var "BASE8" [] [[ array_with_repeat (0) (2) ]] in + do~ M.substitute_var "BASE8" [] [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in (* Component *) do~ M.declare_component "mulFix" in - do~ M.substitute_var "mulFix" [[ M.call_function ~(| "EscalarMulFix", [ 256; M.var (| "BASE8" |) ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "mulFix" [] [[ M.call_function ~(| "EscalarMulFix", [ 256; M.var (| "BASE8" |) ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 256 |) ]] ( - do~ M.substitute_var "mulFix" [[ M.var_access (| "S", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mulFix" [Access.Component "e"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "S", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.equality_constraint diff --git a/Garden/Circom/Circomlib/translation/circuits/eddsamimc.v b/Garden/Circom/Circomlib/translation/circuits/eddsamimc.v index 2549965..4f17330 100644 --- a/Garden/Circom/Circomlib/translation/circuits/eddsamimc.v +++ b/Garden/Circom/Circomlib/translation/circuits/eddsamimc.v @@ -19,125 +19,136 @@ Module EdDSAMiMCVerifierSignals. (* Input *) M : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | enabled : P _ enabled "enabled" + | Ax : P _ Ax "Ax" + | Ay : P _ Ay "Ay" + | S : P _ S "S" + | R8x : P _ R8x "R8x" + | R8y : P _ R8y "R8y" + | M : P _ M "M". + End IsNamed. End EdDSAMiMCVerifierSignals. (* Template body *) Definition EdDSAMiMCVerifier : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "enabled" [[ ([] : list F.t) ]] in + do~ M.declare_signal "enabled" in (* Signal Input *) - do~ M.declare_signal "Ax" [[ ([] : list F.t) ]] in + do~ M.declare_signal "Ax" in (* Signal Input *) - do~ M.declare_signal "Ay" [[ ([] : list F.t) ]] in + do~ M.declare_signal "Ay" in (* Signal Input *) - do~ M.declare_signal "S" [[ ([] : list F.t) ]] in + do~ M.declare_signal "S" in (* Signal Input *) - do~ M.declare_signal "R8x" [[ ([] : list F.t) ]] in + do~ M.declare_signal "R8x" in (* Signal Input *) - do~ M.declare_signal "R8y" [[ ([] : list F.t) ]] in + do~ M.declare_signal "R8y" in (* Signal Input *) - do~ M.declare_signal "M" [[ ([] : list F.t) ]] in + do~ M.declare_signal "M" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Component *) do~ M.declare_component "snum2bits" in - do~ M.substitute_var "snum2bits" [[ M.call_function ~(| "Num2Bits", [ 253 ] |) ]] in - do~ M.substitute_var "snum2bits" [[ M.var (| "S" |) ]] in + do~ M.substitute_var "snum2bits" [] [[ M.call_function ~(| "Num2Bits", [ 253 ] |) ]] in + do~ M.substitute_var "snum2bits" [Access.Component "in"] [[ M.var (| "S" |) ]] in (* Component *) do~ M.declare_component "compConstant" in - do~ M.substitute_var "compConstant" [[ M.call_function ~(| "CompConstant", [ 2736030358979909402780800718157159386076813972158567259200215660948447373040 ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "compConstant" [] [[ M.call_function ~(| "CompConstant", [ 2736030358979909402780800718157159386076813972158567259200215660948447373040 ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 253 |) ]] ( - do~ M.substitute_var "compConstant" [[ M.var_access (| "snum2bits", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "compConstant" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "snum2bits", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "compConstant" [[ 0 ]] in + do~ M.substitute_var "compConstant" [Access.Component "in"; Access.Array (253)] [[ 0 ]] in do~ M.equality_constraint [[ M.var_access (| "compConstant", [Access.Component "out"] |) ]] [[ 0 ]] in (* Component *) do~ M.declare_component "hash" in - do~ M.substitute_var "hash" [[ M.call_function ~(| "MultiMiMC7", [ 5; 91 ] |) ]] in - do~ M.substitute_var "hash" [[ M.var (| "R8x" |) ]] in - do~ M.substitute_var "hash" [[ M.var (| "R8y" |) ]] in - do~ M.substitute_var "hash" [[ M.var (| "Ax" |) ]] in - do~ M.substitute_var "hash" [[ M.var (| "Ay" |) ]] in - do~ M.substitute_var "hash" [[ M.var (| "M" |) ]] in - do~ M.substitute_var "hash" [[ 0 ]] in + do~ M.substitute_var "hash" [] [[ M.call_function ~(| "MultiMiMC7", [ 5; 91 ] |) ]] in + do~ M.substitute_var "hash" [Access.Component "in"; Access.Array (0)] [[ M.var (| "R8x" |) ]] in + do~ M.substitute_var "hash" [Access.Component "in"; Access.Array (1)] [[ M.var (| "R8y" |) ]] in + do~ M.substitute_var "hash" [Access.Component "in"; Access.Array (2)] [[ M.var (| "Ax" |) ]] in + do~ M.substitute_var "hash" [Access.Component "in"; Access.Array (3)] [[ M.var (| "Ay" |) ]] in + do~ M.substitute_var "hash" [Access.Component "in"; Access.Array (4)] [[ M.var (| "M" |) ]] in + do~ M.substitute_var "hash" [Access.Component "k"] [[ 0 ]] in (* Component *) do~ M.declare_component "h2bits" in - do~ M.substitute_var "h2bits" [[ M.call_function ~(| "Num2Bits_strict", ([] : list F.t) |) ]] in - do~ M.substitute_var "h2bits" [[ M.var_access (| "hash", [Access.Component "out"] |) ]] in + do~ M.substitute_var "h2bits" [] [[ M.call_function ~(| "Num2Bits_strict", ([] : list F.t) |) ]] in + do~ M.substitute_var "h2bits" [Access.Component "in"] [[ M.var_access (| "hash", [Access.Component "out"] |) ]] in (* Component *) do~ M.declare_component "dbl1" in - do~ M.substitute_var "dbl1" [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in - do~ M.substitute_var "dbl1" [[ M.var (| "Ax" |) ]] in - do~ M.substitute_var "dbl1" [[ M.var (| "Ay" |) ]] in + do~ M.substitute_var "dbl1" [] [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in + do~ M.substitute_var "dbl1" [Access.Component "x"] [[ M.var (| "Ax" |) ]] in + do~ M.substitute_var "dbl1" [Access.Component "y"] [[ M.var (| "Ay" |) ]] in (* Component *) do~ M.declare_component "dbl2" in - do~ M.substitute_var "dbl2" [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in - do~ M.substitute_var "dbl2" [[ M.var_access (| "dbl1", [Access.Component "xout"] |) ]] in - do~ M.substitute_var "dbl2" [[ M.var_access (| "dbl1", [Access.Component "yout"] |) ]] in + do~ M.substitute_var "dbl2" [] [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in + do~ M.substitute_var "dbl2" [Access.Component "x"] [[ M.var_access (| "dbl1", [Access.Component "xout"] |) ]] in + do~ M.substitute_var "dbl2" [Access.Component "y"] [[ M.var_access (| "dbl1", [Access.Component "yout"] |) ]] in (* Component *) do~ M.declare_component "dbl3" in - do~ M.substitute_var "dbl3" [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in - do~ M.substitute_var "dbl3" [[ M.var_access (| "dbl2", [Access.Component "xout"] |) ]] in - do~ M.substitute_var "dbl3" [[ M.var_access (| "dbl2", [Access.Component "yout"] |) ]] in + do~ M.substitute_var "dbl3" [] [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in + do~ M.substitute_var "dbl3" [Access.Component "x"] [[ M.var_access (| "dbl2", [Access.Component "xout"] |) ]] in + do~ M.substitute_var "dbl3" [Access.Component "y"] [[ M.var_access (| "dbl2", [Access.Component "yout"] |) ]] in (* Component *) do~ M.declare_component "isZero" in - do~ M.substitute_var "isZero" [[ M.call_function ~(| "IsZero", ([] : list F.t) |) ]] in - do~ M.substitute_var "isZero" [[ M.var_access (| "dbl3", [Access.Component "x"] |) ]] in + do~ M.substitute_var "isZero" [] [[ M.call_function ~(| "IsZero", ([] : list F.t) |) ]] in + do~ M.substitute_var "isZero" [Access.Component "in"] [[ M.var_access (| "dbl3", [Access.Component "x"] |) ]] in do~ M.equality_constraint [[ M.var_access (| "isZero", [Access.Component "out"] |) ]] [[ 0 ]] in (* Component *) do~ M.declare_component "mulAny" in - do~ M.substitute_var "mulAny" [[ M.call_function ~(| "EscalarMulAny", [ 254 ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "mulAny" [] [[ M.call_function ~(| "EscalarMulAny", [ 254 ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 254 |) ]] ( - do~ M.substitute_var "mulAny" [[ M.var_access (| "h2bits", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mulAny" [Access.Component "e"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "h2bits", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "mulAny" [[ M.var_access (| "dbl3", [Access.Component "xout"] |) ]] in - do~ M.substitute_var "mulAny" [[ M.var_access (| "dbl3", [Access.Component "yout"] |) ]] in + do~ M.substitute_var "mulAny" [Access.Component "p"; Access.Array (0)] [[ M.var_access (| "dbl3", [Access.Component "xout"] |) ]] in + do~ M.substitute_var "mulAny" [Access.Component "p"; Access.Array (1)] [[ M.var_access (| "dbl3", [Access.Component "yout"] |) ]] in (* Component *) do~ M.declare_component "addRight" in - do~ M.substitute_var "addRight" [[ M.call_function ~(| "BabyAdd", ([] : list F.t) |) ]] in - do~ M.substitute_var "addRight" [[ M.var (| "R8x" |) ]] in - do~ M.substitute_var "addRight" [[ M.var (| "R8y" |) ]] in - do~ M.substitute_var "addRight" [[ M.var_access (| "mulAny", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "addRight" [[ M.var_access (| "mulAny", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "addRight" [] [[ M.call_function ~(| "BabyAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "addRight" [Access.Component "x1"] [[ M.var (| "R8x" |) ]] in + do~ M.substitute_var "addRight" [Access.Component "y1"] [[ M.var (| "R8y" |) ]] in + do~ M.substitute_var "addRight" [Access.Component "x2"] [[ M.var_access (| "mulAny", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "addRight" [Access.Component "y2"] [[ M.var_access (| "mulAny", [Access.Component "out"; Access.Array (1)] |) ]] in (* Var *) do~ M.declare_var "BASE8" [[ [ 2 ] ]] in - do~ M.substitute_var "BASE8" [[ array_with_repeat (0) (2) ]] in - do~ M.substitute_var "BASE8" [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in + do~ M.substitute_var "BASE8" [] [[ array_with_repeat (0) (2) ]] in + do~ M.substitute_var "BASE8" [] [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in (* Component *) do~ M.declare_component "mulFix" in - do~ M.substitute_var "mulFix" [[ M.call_function ~(| "EscalarMulFix", [ 253; M.var (| "BASE8" |) ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "mulFix" [] [[ M.call_function ~(| "EscalarMulFix", [ 253; M.var (| "BASE8" |) ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 253 |) ]] ( - do~ M.substitute_var "mulFix" [[ M.var_access (| "snum2bits", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mulFix" [Access.Component "e"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "snum2bits", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "eqCheckX" in - do~ M.substitute_var "eqCheckX" [[ M.call_function ~(| "ForceEqualIfEnabled", ([] : list F.t) |) ]] in - do~ M.substitute_var "eqCheckX" [[ M.var (| "enabled" |) ]] in - do~ M.substitute_var "eqCheckX" [[ M.var_access (| "mulFix", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "eqCheckX" [[ M.var_access (| "addRight", [Access.Component "xout"] |) ]] in + do~ M.substitute_var "eqCheckX" [] [[ M.call_function ~(| "ForceEqualIfEnabled", ([] : list F.t) |) ]] in + do~ M.substitute_var "eqCheckX" [Access.Component "enabled"] [[ M.var (| "enabled" |) ]] in + do~ M.substitute_var "eqCheckX" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "mulFix", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "eqCheckX" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "addRight", [Access.Component "xout"] |) ]] in (* Component *) do~ M.declare_component "eqCheckY" in - do~ M.substitute_var "eqCheckY" [[ M.call_function ~(| "ForceEqualIfEnabled", ([] : list F.t) |) ]] in - do~ M.substitute_var "eqCheckY" [[ M.var (| "enabled" |) ]] in - do~ M.substitute_var "eqCheckY" [[ M.var_access (| "mulFix", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "eqCheckY" [[ M.var_access (| "addRight", [Access.Component "yout"] |) ]] in + do~ M.substitute_var "eqCheckY" [] [[ M.call_function ~(| "ForceEqualIfEnabled", ([] : list F.t) |) ]] in + do~ M.substitute_var "eqCheckY" [Access.Component "enabled"] [[ M.var (| "enabled" |) ]] in + do~ M.substitute_var "eqCheckY" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "mulFix", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "eqCheckY" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "addRight", [Access.Component "yout"] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/eddsamimcsponge.v b/Garden/Circom/Circomlib/translation/circuits/eddsamimcsponge.v index 619646d..188ba11 100644 --- a/Garden/Circom/Circomlib/translation/circuits/eddsamimcsponge.v +++ b/Garden/Circom/Circomlib/translation/circuits/eddsamimcsponge.v @@ -19,125 +19,136 @@ Module EdDSAMiMCSpongeVerifierSignals. (* Input *) M : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | enabled : P _ enabled "enabled" + | Ax : P _ Ax "Ax" + | Ay : P _ Ay "Ay" + | S : P _ S "S" + | R8x : P _ R8x "R8x" + | R8y : P _ R8y "R8y" + | M : P _ M "M". + End IsNamed. End EdDSAMiMCSpongeVerifierSignals. (* Template body *) Definition EdDSAMiMCSpongeVerifier : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "enabled" [[ ([] : list F.t) ]] in + do~ M.declare_signal "enabled" in (* Signal Input *) - do~ M.declare_signal "Ax" [[ ([] : list F.t) ]] in + do~ M.declare_signal "Ax" in (* Signal Input *) - do~ M.declare_signal "Ay" [[ ([] : list F.t) ]] in + do~ M.declare_signal "Ay" in (* Signal Input *) - do~ M.declare_signal "S" [[ ([] : list F.t) ]] in + do~ M.declare_signal "S" in (* Signal Input *) - do~ M.declare_signal "R8x" [[ ([] : list F.t) ]] in + do~ M.declare_signal "R8x" in (* Signal Input *) - do~ M.declare_signal "R8y" [[ ([] : list F.t) ]] in + do~ M.declare_signal "R8y" in (* Signal Input *) - do~ M.declare_signal "M" [[ ([] : list F.t) ]] in + do~ M.declare_signal "M" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Component *) do~ M.declare_component "snum2bits" in - do~ M.substitute_var "snum2bits" [[ M.call_function ~(| "Num2Bits", [ 253 ] |) ]] in - do~ M.substitute_var "snum2bits" [[ M.var (| "S" |) ]] in + do~ M.substitute_var "snum2bits" [] [[ M.call_function ~(| "Num2Bits", [ 253 ] |) ]] in + do~ M.substitute_var "snum2bits" [Access.Component "in"] [[ M.var (| "S" |) ]] in (* Component *) do~ M.declare_component "compConstant" in - do~ M.substitute_var "compConstant" [[ M.call_function ~(| "CompConstant", [ 2736030358979909402780800718157159386076813972158567259200215660948447373040 ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "compConstant" [] [[ M.call_function ~(| "CompConstant", [ 2736030358979909402780800718157159386076813972158567259200215660948447373040 ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 253 |) ]] ( - do~ M.substitute_var "compConstant" [[ M.var_access (| "snum2bits", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "compConstant" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "snum2bits", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "compConstant" [[ 0 ]] in + do~ M.substitute_var "compConstant" [Access.Component "in"; Access.Array (253)] [[ 0 ]] in do~ M.equality_constraint [[ M.var_access (| "compConstant", [Access.Component "out"] |) ]] [[ 0 ]] in (* Component *) do~ M.declare_component "hash" in - do~ M.substitute_var "hash" [[ M.call_function ~(| "MiMCSponge", [ 5; 220; 1 ] |) ]] in - do~ M.substitute_var "hash" [[ M.var (| "R8x" |) ]] in - do~ M.substitute_var "hash" [[ M.var (| "R8y" |) ]] in - do~ M.substitute_var "hash" [[ M.var (| "Ax" |) ]] in - do~ M.substitute_var "hash" [[ M.var (| "Ay" |) ]] in - do~ M.substitute_var "hash" [[ M.var (| "M" |) ]] in - do~ M.substitute_var "hash" [[ 0 ]] in + do~ M.substitute_var "hash" [] [[ M.call_function ~(| "MiMCSponge", [ 5; 220; 1 ] |) ]] in + do~ M.substitute_var "hash" [Access.Component "ins"; Access.Array (0)] [[ M.var (| "R8x" |) ]] in + do~ M.substitute_var "hash" [Access.Component "ins"; Access.Array (1)] [[ M.var (| "R8y" |) ]] in + do~ M.substitute_var "hash" [Access.Component "ins"; Access.Array (2)] [[ M.var (| "Ax" |) ]] in + do~ M.substitute_var "hash" [Access.Component "ins"; Access.Array (3)] [[ M.var (| "Ay" |) ]] in + do~ M.substitute_var "hash" [Access.Component "ins"; Access.Array (4)] [[ M.var (| "M" |) ]] in + do~ M.substitute_var "hash" [Access.Component "k"] [[ 0 ]] in (* Component *) do~ M.declare_component "h2bits" in - do~ M.substitute_var "h2bits" [[ M.call_function ~(| "Num2Bits_strict", ([] : list F.t) |) ]] in - do~ M.substitute_var "h2bits" [[ M.var_access (| "hash", [Access.Component "outs"; Access.Array (0)] |) ]] in + do~ M.substitute_var "h2bits" [] [[ M.call_function ~(| "Num2Bits_strict", ([] : list F.t) |) ]] in + do~ M.substitute_var "h2bits" [Access.Component "in"] [[ M.var_access (| "hash", [Access.Component "outs"; Access.Array (0)] |) ]] in (* Component *) do~ M.declare_component "dbl1" in - do~ M.substitute_var "dbl1" [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in - do~ M.substitute_var "dbl1" [[ M.var (| "Ax" |) ]] in - do~ M.substitute_var "dbl1" [[ M.var (| "Ay" |) ]] in + do~ M.substitute_var "dbl1" [] [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in + do~ M.substitute_var "dbl1" [Access.Component "x"] [[ M.var (| "Ax" |) ]] in + do~ M.substitute_var "dbl1" [Access.Component "y"] [[ M.var (| "Ay" |) ]] in (* Component *) do~ M.declare_component "dbl2" in - do~ M.substitute_var "dbl2" [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in - do~ M.substitute_var "dbl2" [[ M.var_access (| "dbl1", [Access.Component "xout"] |) ]] in - do~ M.substitute_var "dbl2" [[ M.var_access (| "dbl1", [Access.Component "yout"] |) ]] in + do~ M.substitute_var "dbl2" [] [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in + do~ M.substitute_var "dbl2" [Access.Component "x"] [[ M.var_access (| "dbl1", [Access.Component "xout"] |) ]] in + do~ M.substitute_var "dbl2" [Access.Component "y"] [[ M.var_access (| "dbl1", [Access.Component "yout"] |) ]] in (* Component *) do~ M.declare_component "dbl3" in - do~ M.substitute_var "dbl3" [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in - do~ M.substitute_var "dbl3" [[ M.var_access (| "dbl2", [Access.Component "xout"] |) ]] in - do~ M.substitute_var "dbl3" [[ M.var_access (| "dbl2", [Access.Component "yout"] |) ]] in + do~ M.substitute_var "dbl3" [] [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in + do~ M.substitute_var "dbl3" [Access.Component "x"] [[ M.var_access (| "dbl2", [Access.Component "xout"] |) ]] in + do~ M.substitute_var "dbl3" [Access.Component "y"] [[ M.var_access (| "dbl2", [Access.Component "yout"] |) ]] in (* Component *) do~ M.declare_component "isZero" in - do~ M.substitute_var "isZero" [[ M.call_function ~(| "IsZero", ([] : list F.t) |) ]] in - do~ M.substitute_var "isZero" [[ M.var_access (| "dbl3", [Access.Component "x"] |) ]] in + do~ M.substitute_var "isZero" [] [[ M.call_function ~(| "IsZero", ([] : list F.t) |) ]] in + do~ M.substitute_var "isZero" [Access.Component "in"] [[ M.var_access (| "dbl3", [Access.Component "x"] |) ]] in do~ M.equality_constraint [[ M.var_access (| "isZero", [Access.Component "out"] |) ]] [[ 0 ]] in (* Component *) do~ M.declare_component "mulAny" in - do~ M.substitute_var "mulAny" [[ M.call_function ~(| "EscalarMulAny", [ 254 ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "mulAny" [] [[ M.call_function ~(| "EscalarMulAny", [ 254 ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 254 |) ]] ( - do~ M.substitute_var "mulAny" [[ M.var_access (| "h2bits", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mulAny" [Access.Component "e"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "h2bits", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "mulAny" [[ M.var_access (| "dbl3", [Access.Component "xout"] |) ]] in - do~ M.substitute_var "mulAny" [[ M.var_access (| "dbl3", [Access.Component "yout"] |) ]] in + do~ M.substitute_var "mulAny" [Access.Component "p"; Access.Array (0)] [[ M.var_access (| "dbl3", [Access.Component "xout"] |) ]] in + do~ M.substitute_var "mulAny" [Access.Component "p"; Access.Array (1)] [[ M.var_access (| "dbl3", [Access.Component "yout"] |) ]] in (* Component *) do~ M.declare_component "addRight" in - do~ M.substitute_var "addRight" [[ M.call_function ~(| "BabyAdd", ([] : list F.t) |) ]] in - do~ M.substitute_var "addRight" [[ M.var (| "R8x" |) ]] in - do~ M.substitute_var "addRight" [[ M.var (| "R8y" |) ]] in - do~ M.substitute_var "addRight" [[ M.var_access (| "mulAny", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "addRight" [[ M.var_access (| "mulAny", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "addRight" [] [[ M.call_function ~(| "BabyAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "addRight" [Access.Component "x1"] [[ M.var (| "R8x" |) ]] in + do~ M.substitute_var "addRight" [Access.Component "y1"] [[ M.var (| "R8y" |) ]] in + do~ M.substitute_var "addRight" [Access.Component "x2"] [[ M.var_access (| "mulAny", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "addRight" [Access.Component "y2"] [[ M.var_access (| "mulAny", [Access.Component "out"; Access.Array (1)] |) ]] in (* Var *) do~ M.declare_var "BASE8" [[ [ 2 ] ]] in - do~ M.substitute_var "BASE8" [[ array_with_repeat (0) (2) ]] in - do~ M.substitute_var "BASE8" [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in + do~ M.substitute_var "BASE8" [] [[ array_with_repeat (0) (2) ]] in + do~ M.substitute_var "BASE8" [] [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in (* Component *) do~ M.declare_component "mulFix" in - do~ M.substitute_var "mulFix" [[ M.call_function ~(| "EscalarMulFix", [ 253; M.var (| "BASE8" |) ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "mulFix" [] [[ M.call_function ~(| "EscalarMulFix", [ 253; M.var (| "BASE8" |) ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 253 |) ]] ( - do~ M.substitute_var "mulFix" [[ M.var_access (| "snum2bits", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mulFix" [Access.Component "e"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "snum2bits", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "eqCheckX" in - do~ M.substitute_var "eqCheckX" [[ M.call_function ~(| "ForceEqualIfEnabled", ([] : list F.t) |) ]] in - do~ M.substitute_var "eqCheckX" [[ M.var (| "enabled" |) ]] in - do~ M.substitute_var "eqCheckX" [[ M.var_access (| "mulFix", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "eqCheckX" [[ M.var_access (| "addRight", [Access.Component "xout"] |) ]] in + do~ M.substitute_var "eqCheckX" [] [[ M.call_function ~(| "ForceEqualIfEnabled", ([] : list F.t) |) ]] in + do~ M.substitute_var "eqCheckX" [Access.Component "enabled"] [[ M.var (| "enabled" |) ]] in + do~ M.substitute_var "eqCheckX" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "mulFix", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "eqCheckX" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "addRight", [Access.Component "xout"] |) ]] in (* Component *) do~ M.declare_component "eqCheckY" in - do~ M.substitute_var "eqCheckY" [[ M.call_function ~(| "ForceEqualIfEnabled", ([] : list F.t) |) ]] in - do~ M.substitute_var "eqCheckY" [[ M.var (| "enabled" |) ]] in - do~ M.substitute_var "eqCheckY" [[ M.var_access (| "mulFix", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "eqCheckY" [[ M.var_access (| "addRight", [Access.Component "yout"] |) ]] in + do~ M.substitute_var "eqCheckY" [] [[ M.call_function ~(| "ForceEqualIfEnabled", ([] : list F.t) |) ]] in + do~ M.substitute_var "eqCheckY" [Access.Component "enabled"] [[ M.var (| "enabled" |) ]] in + do~ M.substitute_var "eqCheckY" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "mulFix", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "eqCheckY" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "addRight", [Access.Component "yout"] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/eddsaposeidon.v b/Garden/Circom/Circomlib/translation/circuits/eddsaposeidon.v index f5195fe..3bad18d 100644 --- a/Garden/Circom/Circomlib/translation/circuits/eddsaposeidon.v +++ b/Garden/Circom/Circomlib/translation/circuits/eddsaposeidon.v @@ -19,124 +19,135 @@ Module EdDSAPoseidonVerifierSignals. (* Input *) M : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | enabled : P _ enabled "enabled" + | Ax : P _ Ax "Ax" + | Ay : P _ Ay "Ay" + | S : P _ S "S" + | R8x : P _ R8x "R8x" + | R8y : P _ R8y "R8y" + | M : P _ M "M". + End IsNamed. End EdDSAPoseidonVerifierSignals. (* Template body *) Definition EdDSAPoseidonVerifier : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "enabled" [[ ([] : list F.t) ]] in + do~ M.declare_signal "enabled" in (* Signal Input *) - do~ M.declare_signal "Ax" [[ ([] : list F.t) ]] in + do~ M.declare_signal "Ax" in (* Signal Input *) - do~ M.declare_signal "Ay" [[ ([] : list F.t) ]] in + do~ M.declare_signal "Ay" in (* Signal Input *) - do~ M.declare_signal "S" [[ ([] : list F.t) ]] in + do~ M.declare_signal "S" in (* Signal Input *) - do~ M.declare_signal "R8x" [[ ([] : list F.t) ]] in + do~ M.declare_signal "R8x" in (* Signal Input *) - do~ M.declare_signal "R8y" [[ ([] : list F.t) ]] in + do~ M.declare_signal "R8y" in (* Signal Input *) - do~ M.declare_signal "M" [[ ([] : list F.t) ]] in + do~ M.declare_signal "M" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Component *) do~ M.declare_component "snum2bits" in - do~ M.substitute_var "snum2bits" [[ M.call_function ~(| "Num2Bits", [ 253 ] |) ]] in - do~ M.substitute_var "snum2bits" [[ M.var (| "S" |) ]] in + do~ M.substitute_var "snum2bits" [] [[ M.call_function ~(| "Num2Bits", [ 253 ] |) ]] in + do~ M.substitute_var "snum2bits" [Access.Component "in"] [[ M.var (| "S" |) ]] in (* Component *) do~ M.declare_component "compConstant" in - do~ M.substitute_var "compConstant" [[ M.call_function ~(| "CompConstant", [ 2736030358979909402780800718157159386076813972158567259200215660948447373040 ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "compConstant" [] [[ M.call_function ~(| "CompConstant", [ 2736030358979909402780800718157159386076813972158567259200215660948447373040 ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 253 |) ]] ( - do~ M.substitute_var "compConstant" [[ M.var_access (| "snum2bits", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "compConstant" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "snum2bits", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "compConstant" [[ 0 ]] in + do~ M.substitute_var "compConstant" [Access.Component "in"; Access.Array (253)] [[ 0 ]] in do~ M.equality_constraint [[ InfixOp.mul ~(| M.var_access (| "compConstant", [Access.Component "out"] |), M.var (| "enabled" |) |) ]] [[ 0 ]] in (* Component *) do~ M.declare_component "hash" in - do~ M.substitute_var "hash" [[ M.call_function ~(| "Poseidon", [ 5 ] |) ]] in - do~ M.substitute_var "hash" [[ M.var (| "R8x" |) ]] in - do~ M.substitute_var "hash" [[ M.var (| "R8y" |) ]] in - do~ M.substitute_var "hash" [[ M.var (| "Ax" |) ]] in - do~ M.substitute_var "hash" [[ M.var (| "Ay" |) ]] in - do~ M.substitute_var "hash" [[ M.var (| "M" |) ]] in + do~ M.substitute_var "hash" [] [[ M.call_function ~(| "Poseidon", [ 5 ] |) ]] in + do~ M.substitute_var "hash" [Access.Component "inputs"; Access.Array (0)] [[ M.var (| "R8x" |) ]] in + do~ M.substitute_var "hash" [Access.Component "inputs"; Access.Array (1)] [[ M.var (| "R8y" |) ]] in + do~ M.substitute_var "hash" [Access.Component "inputs"; Access.Array (2)] [[ M.var (| "Ax" |) ]] in + do~ M.substitute_var "hash" [Access.Component "inputs"; Access.Array (3)] [[ M.var (| "Ay" |) ]] in + do~ M.substitute_var "hash" [Access.Component "inputs"; Access.Array (4)] [[ M.var (| "M" |) ]] in (* Component *) do~ M.declare_component "h2bits" in - do~ M.substitute_var "h2bits" [[ M.call_function ~(| "Num2Bits_strict", ([] : list F.t) |) ]] in - do~ M.substitute_var "h2bits" [[ M.var_access (| "hash", [Access.Component "out"] |) ]] in + do~ M.substitute_var "h2bits" [] [[ M.call_function ~(| "Num2Bits_strict", ([] : list F.t) |) ]] in + do~ M.substitute_var "h2bits" [Access.Component "in"] [[ M.var_access (| "hash", [Access.Component "out"] |) ]] in (* Component *) do~ M.declare_component "dbl1" in - do~ M.substitute_var "dbl1" [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in - do~ M.substitute_var "dbl1" [[ M.var (| "Ax" |) ]] in - do~ M.substitute_var "dbl1" [[ M.var (| "Ay" |) ]] in + do~ M.substitute_var "dbl1" [] [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in + do~ M.substitute_var "dbl1" [Access.Component "x"] [[ M.var (| "Ax" |) ]] in + do~ M.substitute_var "dbl1" [Access.Component "y"] [[ M.var (| "Ay" |) ]] in (* Component *) do~ M.declare_component "dbl2" in - do~ M.substitute_var "dbl2" [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in - do~ M.substitute_var "dbl2" [[ M.var_access (| "dbl1", [Access.Component "xout"] |) ]] in - do~ M.substitute_var "dbl2" [[ M.var_access (| "dbl1", [Access.Component "yout"] |) ]] in + do~ M.substitute_var "dbl2" [] [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in + do~ M.substitute_var "dbl2" [Access.Component "x"] [[ M.var_access (| "dbl1", [Access.Component "xout"] |) ]] in + do~ M.substitute_var "dbl2" [Access.Component "y"] [[ M.var_access (| "dbl1", [Access.Component "yout"] |) ]] in (* Component *) do~ M.declare_component "dbl3" in - do~ M.substitute_var "dbl3" [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in - do~ M.substitute_var "dbl3" [[ M.var_access (| "dbl2", [Access.Component "xout"] |) ]] in - do~ M.substitute_var "dbl3" [[ M.var_access (| "dbl2", [Access.Component "yout"] |) ]] in + do~ M.substitute_var "dbl3" [] [[ M.call_function ~(| "BabyDbl", ([] : list F.t) |) ]] in + do~ M.substitute_var "dbl3" [Access.Component "x"] [[ M.var_access (| "dbl2", [Access.Component "xout"] |) ]] in + do~ M.substitute_var "dbl3" [Access.Component "y"] [[ M.var_access (| "dbl2", [Access.Component "yout"] |) ]] in (* Component *) do~ M.declare_component "isZero" in - do~ M.substitute_var "isZero" [[ M.call_function ~(| "IsZero", ([] : list F.t) |) ]] in - do~ M.substitute_var "isZero" [[ M.var_access (| "dbl3", [Access.Component "x"] |) ]] in + do~ M.substitute_var "isZero" [] [[ M.call_function ~(| "IsZero", ([] : list F.t) |) ]] in + do~ M.substitute_var "isZero" [Access.Component "in"] [[ M.var_access (| "dbl3", [Access.Component "x"] |) ]] in do~ M.equality_constraint [[ InfixOp.mul ~(| M.var_access (| "isZero", [Access.Component "out"] |), M.var (| "enabled" |) |) ]] [[ 0 ]] in (* Component *) do~ M.declare_component "mulAny" in - do~ M.substitute_var "mulAny" [[ M.call_function ~(| "EscalarMulAny", [ 254 ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "mulAny" [] [[ M.call_function ~(| "EscalarMulAny", [ 254 ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 254 |) ]] ( - do~ M.substitute_var "mulAny" [[ M.var_access (| "h2bits", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mulAny" [Access.Component "e"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "h2bits", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "mulAny" [[ M.var_access (| "dbl3", [Access.Component "xout"] |) ]] in - do~ M.substitute_var "mulAny" [[ M.var_access (| "dbl3", [Access.Component "yout"] |) ]] in + do~ M.substitute_var "mulAny" [Access.Component "p"; Access.Array (0)] [[ M.var_access (| "dbl3", [Access.Component "xout"] |) ]] in + do~ M.substitute_var "mulAny" [Access.Component "p"; Access.Array (1)] [[ M.var_access (| "dbl3", [Access.Component "yout"] |) ]] in (* Component *) do~ M.declare_component "addRight" in - do~ M.substitute_var "addRight" [[ M.call_function ~(| "BabyAdd", ([] : list F.t) |) ]] in - do~ M.substitute_var "addRight" [[ M.var (| "R8x" |) ]] in - do~ M.substitute_var "addRight" [[ M.var (| "R8y" |) ]] in - do~ M.substitute_var "addRight" [[ M.var_access (| "mulAny", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "addRight" [[ M.var_access (| "mulAny", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "addRight" [] [[ M.call_function ~(| "BabyAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "addRight" [Access.Component "x1"] [[ M.var (| "R8x" |) ]] in + do~ M.substitute_var "addRight" [Access.Component "y1"] [[ M.var (| "R8y" |) ]] in + do~ M.substitute_var "addRight" [Access.Component "x2"] [[ M.var_access (| "mulAny", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "addRight" [Access.Component "y2"] [[ M.var_access (| "mulAny", [Access.Component "out"; Access.Array (1)] |) ]] in (* Var *) do~ M.declare_var "BASE8" [[ [ 2 ] ]] in - do~ M.substitute_var "BASE8" [[ array_with_repeat (0) (2) ]] in - do~ M.substitute_var "BASE8" [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in + do~ M.substitute_var "BASE8" [] [[ array_with_repeat (0) (2) ]] in + do~ M.substitute_var "BASE8" [] [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in (* Component *) do~ M.declare_component "mulFix" in - do~ M.substitute_var "mulFix" [[ M.call_function ~(| "EscalarMulFix", [ 253; M.var (| "BASE8" |) ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "mulFix" [] [[ M.call_function ~(| "EscalarMulFix", [ 253; M.var (| "BASE8" |) ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 253 |) ]] ( - do~ M.substitute_var "mulFix" [[ M.var_access (| "snum2bits", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mulFix" [Access.Component "e"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "snum2bits", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "eqCheckX" in - do~ M.substitute_var "eqCheckX" [[ M.call_function ~(| "ForceEqualIfEnabled", ([] : list F.t) |) ]] in - do~ M.substitute_var "eqCheckX" [[ M.var (| "enabled" |) ]] in - do~ M.substitute_var "eqCheckX" [[ M.var_access (| "mulFix", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "eqCheckX" [[ M.var_access (| "addRight", [Access.Component "xout"] |) ]] in + do~ M.substitute_var "eqCheckX" [] [[ M.call_function ~(| "ForceEqualIfEnabled", ([] : list F.t) |) ]] in + do~ M.substitute_var "eqCheckX" [Access.Component "enabled"] [[ M.var (| "enabled" |) ]] in + do~ M.substitute_var "eqCheckX" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "mulFix", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "eqCheckX" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "addRight", [Access.Component "xout"] |) ]] in (* Component *) do~ M.declare_component "eqCheckY" in - do~ M.substitute_var "eqCheckY" [[ M.call_function ~(| "ForceEqualIfEnabled", ([] : list F.t) |) ]] in - do~ M.substitute_var "eqCheckY" [[ M.var (| "enabled" |) ]] in - do~ M.substitute_var "eqCheckY" [[ M.var_access (| "mulFix", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "eqCheckY" [[ M.var_access (| "addRight", [Access.Component "yout"] |) ]] in + do~ M.substitute_var "eqCheckY" [] [[ M.call_function ~(| "ForceEqualIfEnabled", ([] : list F.t) |) ]] in + do~ M.substitute_var "eqCheckY" [Access.Component "enabled"] [[ M.var (| "enabled" |) ]] in + do~ M.substitute_var "eqCheckY" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "mulFix", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "eqCheckY" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "addRight", [Access.Component "yout"] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/escalarmul.v b/Garden/Circom/Circomlib/translation/circuits/escalarmul.v index b8f375c..f332ccb 100644 --- a/Garden/Circom/Circomlib/translation/circuits/escalarmul.v +++ b/Garden/Circom/Circomlib/translation/circuits/escalarmul.v @@ -11,49 +11,56 @@ Module EscalarMulWindowSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | sel : P _ sel "sel" + | out : P _ out "out". + End IsNamed. End EscalarMulWindowSignals. (* Template body *) Definition EscalarMulWindow (base k : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("base", base); ("k", k)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 2 ] ]] in + do~ M.declare_signal "in" in (* Signal Input *) - do~ M.declare_signal "sel" [[ [ 4 ] ]] in + do~ M.declare_signal "sel" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "table" [[ [ 16; 2 ] ]] in - do~ M.substitute_var "table" [[ array_with_repeat (array_with_repeat (0) (2)) (16) ]] in + do~ M.substitute_var "table" [] [[ array_with_repeat (array_with_repeat (0) (2)) (16) ]] in (* Component *) do~ M.declare_component "mux" in (* Component *) do~ M.declare_component "adder" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in - do~ M.substitute_var "table" [[ M.call_function ~(| "EscalarMulW4Table", [ M.var (| "base" |); M.var (| "k" |) ] |) ]] in - do~ M.substitute_var "mux" [[ M.call_function ~(| "MultiMux4", [ 2 ] |) ]] in - do~ M.substitute_var "adder" [[ M.call_function ~(| "BabyAdd", ([] : list F.t) |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in + do~ M.substitute_var "table" [] [[ M.call_function ~(| "EscalarMulW4Table", [ M.var (| "base" |); M.var (| "k" |) ] |) ]] in + do~ M.substitute_var "mux" [] [[ M.call_function ~(| "MultiMux4", [ 2 ] |) ]] in + do~ M.substitute_var "adder" [] [[ M.call_function ~(| "BabyAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 4 |) ]] ( - do~ M.substitute_var "mux" [[ M.var_access (| "sel", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mux" [Access.Component "s"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "sel", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 16 |) ]] ( - do~ M.substitute_var "mux" [[ M.var_access (| "table", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "table", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (0); Access.Array (M.var (| "i" |))] [[ M.var_access (| "table", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (1); Access.Array (M.var (| "i" |))] [[ M.var_access (| "table", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "adder" [[ M.var_access (| "in", [Access.Array (0)] |) ]] in - do~ M.substitute_var "adder" [[ M.var_access (| "in", [Access.Array (1)] |) ]] in - do~ M.substitute_var "adder" [[ M.var_access (| "mux", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adder" [[ M.var_access (| "mux", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "adder", [Access.Component "xout"] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "adder", [Access.Component "yout"] |) ]] in + do~ M.substitute_var "adder" [Access.Component "x1"] [[ M.var_access (| "in", [Access.Array (0)] |) ]] in + do~ M.substitute_var "adder" [Access.Component "y1"] [[ M.var_access (| "in", [Access.Array (1)] |) ]] in + do~ M.substitute_var "adder" [Access.Component "x2"] [[ M.var_access (| "mux", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adder" [Access.Component "y2"] [[ M.var_access (| "mux", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ M.var_access (| "adder", [Access.Component "xout"] |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ M.var_access (| "adder", [Access.Component "yout"] |) ]] in M.pure BlockUnit.Tt ). @@ -73,62 +80,69 @@ Module EscalarMulSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | inp : P _ inp "inp" + | out : P _ out "out". + End IsNamed. End EscalarMulSignals. (* Template body *) Definition EscalarMul (n base : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n); ("base", base)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "in" in (* Signal Input *) - do~ M.declare_signal "inp" [[ [ 2 ] ]] in + do~ M.declare_signal "inp" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "nBlocks" [[ ([] : list F.t) ]] in - do~ M.substitute_var "nBlocks" [[ InfixOp.add ~(| InfixOp.shiftR ~(| InfixOp.sub ~(| M.var (| "n" |), 1 |), 2 |), 1 |) ]] in + do~ M.substitute_var "nBlocks" [] [[ InfixOp.add ~(| InfixOp.shiftR ~(| InfixOp.sub ~(| M.var (| "n" |), 1 |), 2 |), 1 |) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in (* Component *) do~ M.declare_component "windows" in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "nBlocks" |) |) ]] ( - do~ M.substitute_var "windows" [[ M.call_function ~(| "EscalarMulWindow", [ M.var (| "base" |); M.var (| "i" |) ] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "windows" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "EscalarMulWindow", [ M.var (| "base" |); M.var (| "i" |) ] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "nBlocks" |) |) ]] ( - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), 4 |) ]] ( do~ M.if_ [[ InfixOp.greaterEq ~(| InfixOp.add ~(| InfixOp.mul ~(| M.var (| "i" |), 4 |), M.var (| "j" |) |), M.var (| "n" |) |) ]] (* then *) ( - do~ M.substitute_var "windows" [[ 0 ]] in + do~ M.substitute_var "windows" [Access.Array (M.var (| "i" |)); Access.Component "sel"; Access.Array (M.var (| "j" |))] [[ 0 ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "windows" [[ M.var_access (| "in", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| M.var (| "i" |), 4 |), M.var (| "j" |) |))] |) ]] in + do~ M.substitute_var "windows" [Access.Array (M.var (| "i" |)); Access.Component "sel"; Access.Array (M.var (| "j" |))] [[ M.var_access (| "in", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| M.var (| "i" |), 4 |), M.var (| "j" |) |))] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "windows" [[ M.var_access (| "inp", [Access.Array (0)] |) ]] in - do~ M.substitute_var "windows" [[ M.var_access (| "inp", [Access.Array (1)] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "windows" [Access.Array (0); Access.Component "in"; Access.Array (0)] [[ M.var_access (| "inp", [Access.Array (0)] |) ]] in + do~ M.substitute_var "windows" [Access.Array (0); Access.Component "in"; Access.Array (1)] [[ M.var_access (| "inp", [Access.Array (1)] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), InfixOp.sub ~(| M.var (| "nBlocks" |), 1 |) |) ]] ( - do~ M.substitute_var "windows" [[ M.var_access (| "windows", [Access.Array (M.var (| "i" |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "windows" [[ M.var_access (| "windows", [Access.Array (M.var (| "i" |)); Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "windows" [Access.Array (InfixOp.add ~(| M.var (| "i" |), 1 |)); Access.Component "in"; Access.Array (0)] [[ M.var_access (| "windows", [Access.Array (M.var (| "i" |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "windows" [Access.Array (InfixOp.add ~(| M.var (| "i" |), 1 |)); Access.Component "in"; Access.Array (1)] [[ M.var_access (| "windows", [Access.Array (M.var (| "i" |)); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "windows", [Access.Array (InfixOp.sub ~(| M.var (| "nBlocks" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "windows", [Access.Array (InfixOp.sub ~(| M.var (| "nBlocks" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ M.var_access (| "windows", [Access.Array (InfixOp.sub ~(| M.var (| "nBlocks" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ M.var_access (| "windows", [Access.Array (InfixOp.sub ~(| M.var (| "nBlocks" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/escalarmulany.v b/Garden/Circom/Circomlib/translation/circuits/escalarmulany.v index fcaa471..4321b25 100644 --- a/Garden/Circom/Circomlib/translation/circuits/escalarmulany.v +++ b/Garden/Circom/Circomlib/translation/circuits/escalarmulany.v @@ -11,19 +11,26 @@ Module Multiplexor2Signals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | sel : P _ sel "sel" + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End Multiplexor2Signals. (* Template body *) Definition Multiplexor2 : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "sel" [[ ([] : list F.t) ]] in + do~ M.declare_signal "sel" in (* Signal Input *) - do~ M.declare_signal "in" [[ [ 2; 2 ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in - do~ M.substitute_var "out" [[ InfixOp.add ~(| InfixOp.mul ~(| InfixOp.sub ~(| M.var_access (| "in", [Access.Array (1); Access.Array (0)] |), M.var_access (| "in", [Access.Array (0); Access.Array (0)] |) |), M.var (| "sel" |) |), M.var_access (| "in", [Access.Array (0); Access.Array (0)] |) |) ]] in - do~ M.substitute_var "out" [[ InfixOp.add ~(| InfixOp.mul ~(| InfixOp.sub ~(| M.var_access (| "in", [Access.Array (1); Access.Array (1)] |), M.var_access (| "in", [Access.Array (0); Access.Array (1)] |) |), M.var (| "sel" |) |), M.var_access (| "in", [Access.Array (0); Access.Array (1)] |) |) ]] in + do~ M.declare_signal "out" in + do~ M.substitute_var "out" [Access.Array (0)] [[ InfixOp.add ~(| InfixOp.mul ~(| InfixOp.sub ~(| M.var_access (| "in", [Access.Array (1); Access.Array (0)] |), M.var_access (| "in", [Access.Array (0); Access.Array (0)] |) |), M.var (| "sel" |) |), M.var_access (| "in", [Access.Array (0); Access.Array (0)] |) |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ InfixOp.add ~(| InfixOp.mul ~(| InfixOp.sub ~(| M.var_access (| "in", [Access.Array (1); Access.Array (1)] |), M.var_access (| "in", [Access.Array (0); Access.Array (1)] |) |), M.var (| "sel" |) |), M.var_access (| "in", [Access.Array (0); Access.Array (1)] |) |) ]] in M.pure BlockUnit.Tt ). @@ -47,45 +54,54 @@ Module BitElementMulAnySignals. (* Output *) addOut : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | sel : P _ sel "sel" + | dblIn : P _ dblIn "dblIn" + | addIn : P _ addIn "addIn" + | dblOut : P _ dblOut "dblOut" + | addOut : P _ addOut "addOut". + End IsNamed. End BitElementMulAnySignals. (* Template body *) Definition BitElementMulAny : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "sel" [[ ([] : list F.t) ]] in + do~ M.declare_signal "sel" in (* Signal Input *) - do~ M.declare_signal "dblIn" [[ [ 2 ] ]] in + do~ M.declare_signal "dblIn" in (* Signal Input *) - do~ M.declare_signal "addIn" [[ [ 2 ] ]] in + do~ M.declare_signal "addIn" in (* Signal Output *) - do~ M.declare_signal "dblOut" [[ [ 2 ] ]] in + do~ M.declare_signal "dblOut" in (* Signal Output *) - do~ M.declare_signal "addOut" [[ [ 2 ] ]] in + do~ M.declare_signal "addOut" in (* Component *) do~ M.declare_component "doubler" in - do~ M.substitute_var "doubler" [[ M.call_function ~(| "MontgomeryDouble", ([] : list F.t) |) ]] in + do~ M.substitute_var "doubler" [] [[ M.call_function ~(| "MontgomeryDouble", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "adder" in - do~ M.substitute_var "adder" [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "adder" [] [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "selector" in - do~ M.substitute_var "selector" [[ M.call_function ~(| "Multiplexor2", ([] : list F.t) |) ]] in - do~ M.substitute_var "selector" [[ M.var (| "sel" |) ]] in - do~ M.substitute_var "doubler" [[ M.var_access (| "dblIn", [Access.Array (0)] |) ]] in - do~ M.substitute_var "doubler" [[ M.var_access (| "dblIn", [Access.Array (1)] |) ]] in - do~ M.substitute_var "adder" [[ M.var_access (| "doubler", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adder" [[ M.var_access (| "doubler", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "adder" [[ M.var_access (| "addIn", [Access.Array (0)] |) ]] in - do~ M.substitute_var "adder" [[ M.var_access (| "addIn", [Access.Array (1)] |) ]] in - do~ M.substitute_var "selector" [[ M.var_access (| "addIn", [Access.Array (0)] |) ]] in - do~ M.substitute_var "selector" [[ M.var_access (| "addIn", [Access.Array (1)] |) ]] in - do~ M.substitute_var "selector" [[ M.var_access (| "adder", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "selector" [[ M.var_access (| "adder", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "dblOut" [[ M.var_access (| "doubler", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "dblOut" [[ M.var_access (| "doubler", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "addOut" [[ M.var_access (| "selector", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "addOut" [[ M.var_access (| "selector", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "selector" [] [[ M.call_function ~(| "Multiplexor2", ([] : list F.t) |) ]] in + do~ M.substitute_var "selector" [Access.Component "sel"] [[ M.var (| "sel" |) ]] in + do~ M.substitute_var "doubler" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "dblIn", [Access.Array (0)] |) ]] in + do~ M.substitute_var "doubler" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "dblIn", [Access.Array (1)] |) ]] in + do~ M.substitute_var "adder" [Access.Component "in1"; Access.Array (0)] [[ M.var_access (| "doubler", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adder" [Access.Component "in1"; Access.Array (1)] [[ M.var_access (| "doubler", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adder" [Access.Component "in2"; Access.Array (0)] [[ M.var_access (| "addIn", [Access.Array (0)] |) ]] in + do~ M.substitute_var "adder" [Access.Component "in2"; Access.Array (1)] [[ M.var_access (| "addIn", [Access.Array (1)] |) ]] in + do~ M.substitute_var "selector" [Access.Component "in"; Access.Array (0); Access.Array (0)] [[ M.var_access (| "addIn", [Access.Array (0)] |) ]] in + do~ M.substitute_var "selector" [Access.Component "in"; Access.Array (0); Access.Array (1)] [[ M.var_access (| "addIn", [Access.Array (1)] |) ]] in + do~ M.substitute_var "selector" [Access.Component "in"; Access.Array (1); Access.Array (0)] [[ M.var_access (| "adder", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "selector" [Access.Component "in"; Access.Array (1); Access.Array (1)] [[ M.var_access (| "adder", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "dblOut" [Access.Array (0)] [[ M.var_access (| "doubler", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "dblOut" [Access.Array (1)] [[ M.var_access (| "doubler", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "addOut" [Access.Array (0)] [[ M.var_access (| "selector", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "addOut" [Access.Array (1)] [[ M.var_access (| "selector", [Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ). @@ -107,70 +123,78 @@ Module SegmentMulAnySignals. (* Output *) dbl : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | e : P _ e "e" + | p : P _ p "p" + | out : P _ out "out" + | dbl : P _ dbl "dbl". + End IsNamed. End SegmentMulAnySignals. (* Template body *) Definition SegmentMulAny (n : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n)] ( (* Signal Input *) - do~ M.declare_signal "e" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "e" in (* Signal Input *) - do~ M.declare_signal "p" [[ [ 2 ] ]] in + do~ M.declare_signal "p" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in + do~ M.declare_signal "out" in (* Signal Output *) - do~ M.declare_signal "dbl" [[ [ 2 ] ]] in + do~ M.declare_signal "dbl" in (* Component *) do~ M.declare_component "bits" in (* Component *) do~ M.declare_component "e2m" in - do~ M.substitute_var "e2m" [[ M.call_function ~(| "Edwards2Montgomery", ([] : list F.t) |) ]] in - do~ M.substitute_var "e2m" [[ M.var_access (| "p", [Access.Array (0)] |) ]] in - do~ M.substitute_var "e2m" [[ M.var_access (| "p", [Access.Array (1)] |) ]] in + do~ M.substitute_var "e2m" [] [[ M.call_function ~(| "Edwards2Montgomery", ([] : list F.t) |) ]] in + do~ M.substitute_var "e2m" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "p", [Access.Array (0)] |) ]] in + do~ M.substitute_var "e2m" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "p", [Access.Array (1)] |) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in - do~ M.substitute_var "bits" [[ M.call_function ~(| "BitElementMulAny", ([] : list F.t) |) ]] in - do~ M.substitute_var "bits" [[ M.var_access (| "e2m", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "bits" [[ M.var_access (| "e2m", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "bits" [[ M.var_access (| "e2m", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "bits" [[ M.var_access (| "e2m", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "bits" [[ M.var_access (| "e", [Access.Array (1)] |) ]] in - do~ M.substitute_var "i" [[ 1 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in + do~ M.substitute_var "bits" [Access.Array (0)] [[ M.call_function ~(| "BitElementMulAny", ([] : list F.t) |) ]] in + do~ M.substitute_var "bits" [Access.Array (0); Access.Component "dblIn"; Access.Array (0)] [[ M.var_access (| "e2m", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "bits" [Access.Array (0); Access.Component "dblIn"; Access.Array (1)] [[ M.var_access (| "e2m", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "bits" [Access.Array (0); Access.Component "addIn"; Access.Array (0)] [[ M.var_access (| "e2m", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "bits" [Access.Array (0); Access.Component "addIn"; Access.Array (1)] [[ M.var_access (| "e2m", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "bits" [Access.Array (0); Access.Component "sel"] [[ M.var_access (| "e", [Access.Array (1)] |) ]] in + do~ M.substitute_var "i" [] [[ 1 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), InfixOp.sub ~(| M.var (| "n" |), 1 |) |) ]] ( - do~ M.substitute_var "bits" [[ M.call_function ~(| "BitElementMulAny", ([] : list F.t) |) ]] in - do~ M.substitute_var "bits" [[ M.var_access (| "bits", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "dblOut"; Access.Array (0)] |) ]] in - do~ M.substitute_var "bits" [[ M.var_access (| "bits", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "dblOut"; Access.Array (1)] |) ]] in - do~ M.substitute_var "bits" [[ M.var_access (| "bits", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "addOut"; Access.Array (0)] |) ]] in - do~ M.substitute_var "bits" [[ M.var_access (| "bits", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "addOut"; Access.Array (1)] |) ]] in - do~ M.substitute_var "bits" [[ M.var_access (| "e", [Access.Array (InfixOp.add ~(| M.var (| "i" |), 1 |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "bits" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "BitElementMulAny", ([] : list F.t) |) ]] in + do~ M.substitute_var "bits" [Access.Array (M.var (| "i" |)); Access.Component "dblIn"; Access.Array (0)] [[ M.var_access (| "bits", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "dblOut"; Access.Array (0)] |) ]] in + do~ M.substitute_var "bits" [Access.Array (M.var (| "i" |)); Access.Component "dblIn"; Access.Array (1)] [[ M.var_access (| "bits", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "dblOut"; Access.Array (1)] |) ]] in + do~ M.substitute_var "bits" [Access.Array (M.var (| "i" |)); Access.Component "addIn"; Access.Array (0)] [[ M.var_access (| "bits", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "addOut"; Access.Array (0)] |) ]] in + do~ M.substitute_var "bits" [Access.Array (M.var (| "i" |)); Access.Component "addIn"; Access.Array (1)] [[ M.var_access (| "bits", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "addOut"; Access.Array (1)] |) ]] in + do~ M.substitute_var "bits" [Access.Array (M.var (| "i" |)); Access.Component "sel"] [[ M.var_access (| "e", [Access.Array (InfixOp.add ~(| M.var (| "i" |), 1 |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "dbl" [[ M.var_access (| "bits", [Access.Array (InfixOp.sub ~(| M.var (| "n" |), 2 |)); Access.Component "dblOut"; Access.Array (0)] |) ]] in - do~ M.substitute_var "dbl" [[ M.var_access (| "bits", [Access.Array (InfixOp.sub ~(| M.var (| "n" |), 2 |)); Access.Component "dblOut"; Access.Array (1)] |) ]] in + do~ M.substitute_var "dbl" [Access.Array (0)] [[ M.var_access (| "bits", [Access.Array (InfixOp.sub ~(| M.var (| "n" |), 2 |)); Access.Component "dblOut"; Access.Array (0)] |) ]] in + do~ M.substitute_var "dbl" [Access.Array (1)] [[ M.var_access (| "bits", [Access.Array (InfixOp.sub ~(| M.var (| "n" |), 2 |)); Access.Component "dblOut"; Access.Array (1)] |) ]] in (* Component *) do~ M.declare_component "m2e" in - do~ M.substitute_var "m2e" [[ M.call_function ~(| "Montgomery2Edwards", ([] : list F.t) |) ]] in - do~ M.substitute_var "m2e" [[ M.var_access (| "bits", [Access.Array (InfixOp.sub ~(| M.var (| "n" |), 2 |)); Access.Component "addOut"; Access.Array (0)] |) ]] in - do~ M.substitute_var "m2e" [[ M.var_access (| "bits", [Access.Array (InfixOp.sub ~(| M.var (| "n" |), 2 |)); Access.Component "addOut"; Access.Array (1)] |) ]] in + do~ M.substitute_var "m2e" [] [[ M.call_function ~(| "Montgomery2Edwards", ([] : list F.t) |) ]] in + do~ M.substitute_var "m2e" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "bits", [Access.Array (InfixOp.sub ~(| M.var (| "n" |), 2 |)); Access.Component "addOut"; Access.Array (0)] |) ]] in + do~ M.substitute_var "m2e" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "bits", [Access.Array (InfixOp.sub ~(| M.var (| "n" |), 2 |)); Access.Component "addOut"; Access.Array (1)] |) ]] in (* Component *) do~ M.declare_component "eadder" in - do~ M.substitute_var "eadder" [[ M.call_function ~(| "BabyAdd", ([] : list F.t) |) ]] in - do~ M.substitute_var "eadder" [[ M.var_access (| "m2e", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "eadder" [[ M.var_access (| "m2e", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "eadder" [[ PrefixOp.sub ~(| M.var_access (| "p", [Access.Array (0)] |) |) ]] in - do~ M.substitute_var "eadder" [[ M.var_access (| "p", [Access.Array (1)] |) ]] in + do~ M.substitute_var "eadder" [] [[ M.call_function ~(| "BabyAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "eadder" [Access.Component "x1"] [[ M.var_access (| "m2e", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "eadder" [Access.Component "y1"] [[ M.var_access (| "m2e", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "eadder" [Access.Component "x2"] [[ PrefixOp.sub ~(| M.var_access (| "p", [Access.Array (0)] |) |) ]] in + do~ M.substitute_var "eadder" [Access.Component "y2"] [[ M.var_access (| "p", [Access.Array (1)] |) ]] in (* Component *) do~ M.declare_component "lastSel" in - do~ M.substitute_var "lastSel" [[ M.call_function ~(| "Multiplexor2", ([] : list F.t) |) ]] in - do~ M.substitute_var "lastSel" [[ M.var_access (| "e", [Access.Array (0)] |) ]] in - do~ M.substitute_var "lastSel" [[ M.var_access (| "eadder", [Access.Component "xout"] |) ]] in - do~ M.substitute_var "lastSel" [[ M.var_access (| "eadder", [Access.Component "yout"] |) ]] in - do~ M.substitute_var "lastSel" [[ M.var_access (| "m2e", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "lastSel" [[ M.var_access (| "m2e", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "lastSel", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "lastSel", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "lastSel" [] [[ M.call_function ~(| "Multiplexor2", ([] : list F.t) |) ]] in + do~ M.substitute_var "lastSel" [Access.Component "sel"] [[ M.var_access (| "e", [Access.Array (0)] |) ]] in + do~ M.substitute_var "lastSel" [Access.Component "in"; Access.Array (0); Access.Array (0)] [[ M.var_access (| "eadder", [Access.Component "xout"] |) ]] in + do~ M.substitute_var "lastSel" [Access.Component "in"; Access.Array (0); Access.Array (1)] [[ M.var_access (| "eadder", [Access.Component "yout"] |) ]] in + do~ M.substitute_var "lastSel" [Access.Component "in"; Access.Array (1); Access.Array (0)] [[ M.var_access (| "m2e", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "lastSel" [Access.Component "in"; Access.Array (1); Access.Array (1)] [[ M.var_access (| "m2e", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ M.var_access (| "lastSel", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ M.var_access (| "lastSel", [Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ). @@ -190,23 +214,30 @@ Module EscalarMulAnySignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | e : P _ e "e" + | p : P _ p "p" + | out : P _ out "out". + End IsNamed. End EscalarMulAnySignals. (* Template body *) Definition EscalarMulAny (n : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n)] ( (* Signal Input *) - do~ M.declare_signal "e" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "e" in (* Signal Input *) - do~ M.declare_signal "p" [[ [ 2 ] ]] in + do~ M.declare_signal "p" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "nsegments" [[ ([] : list F.t) ]] in - do~ M.substitute_var "nsegments" [[ InfixOp.add ~(| InfixOp.intDiv ~(| InfixOp.sub ~(| M.var (| "n" |), 1 |), 148 |), 1 |) ]] in + do~ M.substitute_var "nsegments" [] [[ InfixOp.add ~(| InfixOp.intDiv ~(| InfixOp.sub ~(| M.var (| "n" |), 1 |), 148 |), 1 |) ]] in (* Var *) do~ M.declare_var "nlastsegment" [[ ([] : list F.t) ]] in - do~ M.substitute_var "nlastsegment" [[ InfixOp.sub ~(| M.var (| "n" |), InfixOp.mul ~(| InfixOp.sub ~(| M.var (| "nsegments" |), 1 |), 148 |) |) ]] in + do~ M.substitute_var "nlastsegment" [] [[ InfixOp.sub ~(| M.var (| "n" |), InfixOp.mul ~(| InfixOp.sub ~(| M.var (| "nsegments" |), 1 |), 148 |) |) ]] in (* Component *) do~ M.declare_component "segments" in (* Component *) @@ -217,64 +248,64 @@ Definition EscalarMulAny (n : F.t) : M.t (BlockUnit.t Empty_set) := do~ M.declare_component "adders" in (* Component *) do~ M.declare_component "zeropoint" in - do~ M.substitute_var "zeropoint" [[ M.call_function ~(| "IsZero", ([] : list F.t) |) ]] in - do~ M.substitute_var "zeropoint" [[ M.var_access (| "p", [Access.Array (0)] |) ]] in + do~ M.substitute_var "zeropoint" [] [[ M.call_function ~(| "IsZero", ([] : list F.t) |) ]] in + do~ M.substitute_var "zeropoint" [Access.Component "in"] [[ M.var_access (| "p", [Access.Array (0)] |) ]] in (* Var *) do~ M.declare_var "s" [[ ([] : list F.t) ]] in - do~ M.substitute_var "s" [[ 0 ]] in + do~ M.substitute_var "s" [] [[ 0 ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Var *) do~ M.declare_var "nseg" [[ ([] : list F.t) ]] in - do~ M.substitute_var "nseg" [[ 0 ]] in - do~ M.substitute_var "s" [[ 0 ]] in + do~ M.substitute_var "nseg" [] [[ 0 ]] in + do~ M.substitute_var "s" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "s" |), M.var (| "nsegments" |) |) ]] ( - do~ M.substitute_var "nseg" [[ ternary_expression (InfixOp.lesser ~(| M.var (| "s" |), InfixOp.sub ~(| M.var (| "nsegments" |), 1 |) |)) (148) (M.var (| "nlastsegment" |)) ]] in - do~ M.substitute_var "segments" [[ M.call_function ~(| "SegmentMulAny", [ M.var (| "nseg" |) ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "nseg" [] [[ ternary_expression (InfixOp.lesser ~(| M.var (| "s" |), InfixOp.sub ~(| M.var (| "nsegments" |), 1 |) |)) (148) (M.var (| "nlastsegment" |)) ]] in + do~ M.substitute_var "segments" [Access.Array (M.var (| "s" |))] [[ M.call_function ~(| "SegmentMulAny", [ M.var (| "nseg" |) ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "nseg" |) |) ]] ( - do~ M.substitute_var "segments" [[ M.var_access (| "e", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| M.var (| "s" |), 148 |), M.var (| "i" |) |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "segments" [Access.Array (M.var (| "s" |)); Access.Component "e"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "e", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| M.var (| "s" |), 148 |), M.var (| "i" |) |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.if_ [[ InfixOp.eq ~(| M.var (| "s" |), 0 |) ]] (* then *) ( - do~ M.substitute_var "segments" [[ InfixOp.add ~(| M.var_access (| "p", [Access.Array (0)] |), InfixOp.mul ~(| InfixOp.sub ~(| 5299619240641551281634865583518297030282874472190772894086521144482721001553, M.var_access (| "p", [Access.Array (0)] |) |), M.var_access (| "zeropoint", [Access.Component "out"] |) |) |) ]] in - do~ M.substitute_var "segments" [[ InfixOp.add ~(| M.var_access (| "p", [Access.Array (1)] |), InfixOp.mul ~(| InfixOp.sub ~(| 16950150798460657717958625567821834550301663161624707787222815936182638968203, M.var_access (| "p", [Access.Array (1)] |) |), M.var_access (| "zeropoint", [Access.Component "out"] |) |) |) ]] in + do~ M.substitute_var "segments" [Access.Array (M.var (| "s" |)); Access.Component "p"; Access.Array (0)] [[ InfixOp.add ~(| M.var_access (| "p", [Access.Array (0)] |), InfixOp.mul ~(| InfixOp.sub ~(| 5299619240641551281634865583518297030282874472190772894086521144482721001553, M.var_access (| "p", [Access.Array (0)] |) |), M.var_access (| "zeropoint", [Access.Component "out"] |) |) |) ]] in + do~ M.substitute_var "segments" [Access.Array (M.var (| "s" |)); Access.Component "p"; Access.Array (1)] [[ InfixOp.add ~(| M.var_access (| "p", [Access.Array (1)] |), InfixOp.mul ~(| InfixOp.sub ~(| 16950150798460657717958625567821834550301663161624707787222815936182638968203, M.var_access (| "p", [Access.Array (1)] |) |), M.var_access (| "zeropoint", [Access.Component "out"] |) |) |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "doublers" [[ M.call_function ~(| "MontgomeryDouble", ([] : list F.t) |) ]] in - do~ M.substitute_var "m2e" [[ M.call_function ~(| "Montgomery2Edwards", ([] : list F.t) |) ]] in - do~ M.substitute_var "adders" [[ M.call_function ~(| "BabyAdd", ([] : list F.t) |) ]] in - do~ M.substitute_var "doublers" [[ M.var_access (| "segments", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "dbl"; Access.Array (0)] |) ]] in - do~ M.substitute_var "doublers" [[ M.var_access (| "segments", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "dbl"; Access.Array (1)] |) ]] in - do~ M.substitute_var "m2e" [[ M.var_access (| "doublers", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "m2e" [[ M.var_access (| "doublers", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "segments" [[ M.var_access (| "m2e", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "segments" [[ M.var_access (| "m2e", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "doublers" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |))] [[ M.call_function ~(| "MontgomeryDouble", ([] : list F.t) |) ]] in + do~ M.substitute_var "m2e" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |))] [[ M.call_function ~(| "Montgomery2Edwards", ([] : list F.t) |) ]] in + do~ M.substitute_var "adders" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |))] [[ M.call_function ~(| "BabyAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "doublers" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "in"; Access.Array (0)] [[ M.var_access (| "segments", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "dbl"; Access.Array (0)] |) ]] in + do~ M.substitute_var "doublers" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "in"; Access.Array (1)] [[ M.var_access (| "segments", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "dbl"; Access.Array (1)] |) ]] in + do~ M.substitute_var "m2e" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "in"; Access.Array (0)] [[ M.var_access (| "doublers", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "m2e" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "in"; Access.Array (1)] [[ M.var_access (| "doublers", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "segments" [Access.Array (M.var (| "s" |)); Access.Component "p"; Access.Array (0)] [[ M.var_access (| "m2e", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "segments" [Access.Array (M.var (| "s" |)); Access.Component "p"; Access.Array (1)] [[ M.var_access (| "m2e", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in do~ M.if_ [[ InfixOp.eq ~(| M.var (| "s" |), 1 |) ]] (* then *) ( - do~ M.substitute_var "adders" [[ M.var_access (| "segments", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adders" [[ M.var_access (| "segments", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "x1"] [[ M.var_access (| "segments", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "y1"] [[ M.var_access (| "segments", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "adders" [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 2 |)); Access.Component "xout"] |) ]] in - do~ M.substitute_var "adders" [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 2 |)); Access.Component "yout"] |) ]] in + do~ M.substitute_var "adders" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "x1"] [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 2 |)); Access.Component "xout"] |) ]] in + do~ M.substitute_var "adders" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "y1"] [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 2 |)); Access.Component "yout"] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "adders" [[ M.var_access (| "segments", [Access.Array (M.var (| "s" |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adders" [[ M.var_access (| "segments", [Access.Array (M.var (| "s" |)); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "x2"] [[ M.var_access (| "segments", [Access.Array (M.var (| "s" |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "y2"] [[ M.var_access (| "segments", [Access.Array (M.var (| "s" |)); Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "s" [[ InfixOp.add ~(| M.var (| "s" |), 1 |) ]] in + do~ M.substitute_var "s" [] [[ InfixOp.add ~(| M.var (| "s" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.if_ [[ InfixOp.eq ~(| M.var (| "nsegments" |), 1 |) ]] (* then *) ( - do~ M.substitute_var "out" [[ InfixOp.mul ~(| M.var_access (| "segments", [Access.Array (0); Access.Component "out"; Access.Array (0)] |), InfixOp.sub ~(| 1, M.var_access (| "zeropoint", [Access.Component "out"] |) |) |) ]] in - do~ M.substitute_var "out" [[ InfixOp.add ~(| M.var_access (| "segments", [Access.Array (0); Access.Component "out"; Access.Array (1)] |), InfixOp.mul ~(| InfixOp.sub ~(| 1, M.var_access (| "segments", [Access.Array (0); Access.Component "out"; Access.Array (1)] |) |), M.var_access (| "zeropoint", [Access.Component "out"] |) |) |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ InfixOp.mul ~(| M.var_access (| "segments", [Access.Array (0); Access.Component "out"; Access.Array (0)] |), InfixOp.sub ~(| 1, M.var_access (| "zeropoint", [Access.Component "out"] |) |) |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ InfixOp.add ~(| M.var_access (| "segments", [Access.Array (0); Access.Component "out"; Access.Array (1)] |), InfixOp.mul ~(| InfixOp.sub ~(| 1, M.var_access (| "segments", [Access.Array (0); Access.Component "out"; Access.Array (1)] |) |), M.var_access (| "zeropoint", [Access.Component "out"] |) |) |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "out" [[ InfixOp.mul ~(| M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "nsegments" |), 2 |)); Access.Component "xout"] |), InfixOp.sub ~(| 1, M.var_access (| "zeropoint", [Access.Component "out"] |) |) |) ]] in - do~ M.substitute_var "out" [[ InfixOp.add ~(| M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "nsegments" |), 2 |)); Access.Component "yout"] |), InfixOp.mul ~(| InfixOp.sub ~(| 1, M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "nsegments" |), 2 |)); Access.Component "yout"] |) |), M.var_access (| "zeropoint", [Access.Component "out"] |) |) |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ InfixOp.mul ~(| M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "nsegments" |), 2 |)); Access.Component "xout"] |), InfixOp.sub ~(| 1, M.var_access (| "zeropoint", [Access.Component "out"] |) |) |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ InfixOp.add ~(| M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "nsegments" |), 2 |)); Access.Component "yout"] |), InfixOp.mul ~(| InfixOp.sub ~(| 1, M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "nsegments" |), 2 |)); Access.Component "yout"] |) |), M.var_access (| "zeropoint", [Access.Component "out"] |) |) |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt diff --git a/Garden/Circom/Circomlib/translation/circuits/escalarmulfix.v b/Garden/Circom/Circomlib/translation/circuits/escalarmulfix.v index b9dc417..69deee0 100644 --- a/Garden/Circom/Circomlib/translation/circuits/escalarmulfix.v +++ b/Garden/Circom/Circomlib/translation/circuits/escalarmulfix.v @@ -13,92 +13,100 @@ Module WindowMulFixSignals. (* Output *) out8 : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | base : P _ base "base" + | out : P _ out "out" + | out8 : P _ out8 "out8". + End IsNamed. End WindowMulFixSignals. (* Template body *) Definition WindowMulFix : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 3 ] ]] in + do~ M.declare_signal "in" in (* Signal Input *) - do~ M.declare_signal "base" [[ [ 2 ] ]] in + do~ M.declare_signal "base" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in + do~ M.declare_signal "out" in (* Signal Output *) - do~ M.declare_signal "out8" [[ [ 2 ] ]] in + do~ M.declare_signal "out8" in (* Component *) do~ M.declare_component "mux" in - do~ M.substitute_var "mux" [[ M.call_function ~(| "MultiMux3", [ 2 ] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "in", [Access.Array (0)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "in", [Access.Array (1)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "in", [Access.Array (2)] |) ]] in + do~ M.substitute_var "mux" [] [[ M.call_function ~(| "MultiMux3", [ 2 ] |) ]] in + do~ M.substitute_var "mux" [Access.Component "s"; Access.Array (0)] [[ M.var_access (| "in", [Access.Array (0)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "s"; Access.Array (1)] [[ M.var_access (| "in", [Access.Array (1)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "s"; Access.Array (2)] [[ M.var_access (| "in", [Access.Array (2)] |) ]] in (* Component *) do~ M.declare_component "dbl2" in - do~ M.substitute_var "dbl2" [[ M.call_function ~(| "MontgomeryDouble", ([] : list F.t) |) ]] in + do~ M.substitute_var "dbl2" [] [[ M.call_function ~(| "MontgomeryDouble", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "adr3" in - do~ M.substitute_var "adr3" [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "adr3" [] [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "adr4" in - do~ M.substitute_var "adr4" [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "adr4" [] [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "adr5" in - do~ M.substitute_var "adr5" [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "adr5" [] [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "adr6" in - do~ M.substitute_var "adr6" [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "adr6" [] [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "adr7" in - do~ M.substitute_var "adr7" [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "adr7" [] [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "adr8" in - do~ M.substitute_var "adr8" [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "base", [Access.Array (0)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "base", [Access.Array (1)] |) ]] in - do~ M.substitute_var "dbl2" [[ M.var_access (| "base", [Access.Array (0)] |) ]] in - do~ M.substitute_var "dbl2" [[ M.var_access (| "base", [Access.Array (1)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "dbl2", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "dbl2", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "adr3" [[ M.var_access (| "base", [Access.Array (0)] |) ]] in - do~ M.substitute_var "adr3" [[ M.var_access (| "base", [Access.Array (1)] |) ]] in - do~ M.substitute_var "adr3" [[ M.var_access (| "dbl2", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adr3" [[ M.var_access (| "dbl2", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr3", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr3", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "adr4" [[ M.var_access (| "base", [Access.Array (0)] |) ]] in - do~ M.substitute_var "adr4" [[ M.var_access (| "base", [Access.Array (1)] |) ]] in - do~ M.substitute_var "adr4" [[ M.var_access (| "adr3", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adr4" [[ M.var_access (| "adr3", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr4", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr4", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "adr5" [[ M.var_access (| "base", [Access.Array (0)] |) ]] in - do~ M.substitute_var "adr5" [[ M.var_access (| "base", [Access.Array (1)] |) ]] in - do~ M.substitute_var "adr5" [[ M.var_access (| "adr4", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adr5" [[ M.var_access (| "adr4", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr5", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr5", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "adr6" [[ M.var_access (| "base", [Access.Array (0)] |) ]] in - do~ M.substitute_var "adr6" [[ M.var_access (| "base", [Access.Array (1)] |) ]] in - do~ M.substitute_var "adr6" [[ M.var_access (| "adr5", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adr6" [[ M.var_access (| "adr5", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr6", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr6", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "adr7" [[ M.var_access (| "base", [Access.Array (0)] |) ]] in - do~ M.substitute_var "adr7" [[ M.var_access (| "base", [Access.Array (1)] |) ]] in - do~ M.substitute_var "adr7" [[ M.var_access (| "adr6", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adr7" [[ M.var_access (| "adr6", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr7", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr7", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "adr8" [[ M.var_access (| "base", [Access.Array (0)] |) ]] in - do~ M.substitute_var "adr8" [[ M.var_access (| "base", [Access.Array (1)] |) ]] in - do~ M.substitute_var "adr8" [[ M.var_access (| "adr7", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adr8" [[ M.var_access (| "adr7", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr8", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr8", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "out8" [[ M.var_access (| "adr8", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "out8" [[ M.var_access (| "adr8", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "mux", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "mux", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adr8" [] [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (0); Access.Array (0)] [[ M.var_access (| "base", [Access.Array (0)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (1); Access.Array (0)] [[ M.var_access (| "base", [Access.Array (1)] |) ]] in + do~ M.substitute_var "dbl2" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "base", [Access.Array (0)] |) ]] in + do~ M.substitute_var "dbl2" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "base", [Access.Array (1)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (0); Access.Array (1)] [[ M.var_access (| "dbl2", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (1); Access.Array (1)] [[ M.var_access (| "dbl2", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adr3" [Access.Component "in1"; Access.Array (0)] [[ M.var_access (| "base", [Access.Array (0)] |) ]] in + do~ M.substitute_var "adr3" [Access.Component "in1"; Access.Array (1)] [[ M.var_access (| "base", [Access.Array (1)] |) ]] in + do~ M.substitute_var "adr3" [Access.Component "in2"; Access.Array (0)] [[ M.var_access (| "dbl2", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adr3" [Access.Component "in2"; Access.Array (1)] [[ M.var_access (| "dbl2", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (0); Access.Array (2)] [[ M.var_access (| "adr3", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (1); Access.Array (2)] [[ M.var_access (| "adr3", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adr4" [Access.Component "in1"; Access.Array (0)] [[ M.var_access (| "base", [Access.Array (0)] |) ]] in + do~ M.substitute_var "adr4" [Access.Component "in1"; Access.Array (1)] [[ M.var_access (| "base", [Access.Array (1)] |) ]] in + do~ M.substitute_var "adr4" [Access.Component "in2"; Access.Array (0)] [[ M.var_access (| "adr3", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adr4" [Access.Component "in2"; Access.Array (1)] [[ M.var_access (| "adr3", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (0); Access.Array (3)] [[ M.var_access (| "adr4", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (1); Access.Array (3)] [[ M.var_access (| "adr4", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adr5" [Access.Component "in1"; Access.Array (0)] [[ M.var_access (| "base", [Access.Array (0)] |) ]] in + do~ M.substitute_var "adr5" [Access.Component "in1"; Access.Array (1)] [[ M.var_access (| "base", [Access.Array (1)] |) ]] in + do~ M.substitute_var "adr5" [Access.Component "in2"; Access.Array (0)] [[ M.var_access (| "adr4", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adr5" [Access.Component "in2"; Access.Array (1)] [[ M.var_access (| "adr4", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (0); Access.Array (4)] [[ M.var_access (| "adr5", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (1); Access.Array (4)] [[ M.var_access (| "adr5", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adr6" [Access.Component "in1"; Access.Array (0)] [[ M.var_access (| "base", [Access.Array (0)] |) ]] in + do~ M.substitute_var "adr6" [Access.Component "in1"; Access.Array (1)] [[ M.var_access (| "base", [Access.Array (1)] |) ]] in + do~ M.substitute_var "adr6" [Access.Component "in2"; Access.Array (0)] [[ M.var_access (| "adr5", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adr6" [Access.Component "in2"; Access.Array (1)] [[ M.var_access (| "adr5", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (0); Access.Array (5)] [[ M.var_access (| "adr6", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (1); Access.Array (5)] [[ M.var_access (| "adr6", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adr7" [Access.Component "in1"; Access.Array (0)] [[ M.var_access (| "base", [Access.Array (0)] |) ]] in + do~ M.substitute_var "adr7" [Access.Component "in1"; Access.Array (1)] [[ M.var_access (| "base", [Access.Array (1)] |) ]] in + do~ M.substitute_var "adr7" [Access.Component "in2"; Access.Array (0)] [[ M.var_access (| "adr6", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adr7" [Access.Component "in2"; Access.Array (1)] [[ M.var_access (| "adr6", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (0); Access.Array (6)] [[ M.var_access (| "adr7", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (1); Access.Array (6)] [[ M.var_access (| "adr7", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adr8" [Access.Component "in1"; Access.Array (0)] [[ M.var_access (| "base", [Access.Array (0)] |) ]] in + do~ M.substitute_var "adr8" [Access.Component "in1"; Access.Array (1)] [[ M.var_access (| "base", [Access.Array (1)] |) ]] in + do~ M.substitute_var "adr8" [Access.Component "in2"; Access.Array (0)] [[ M.var_access (| "adr7", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adr8" [Access.Component "in2"; Access.Array (1)] [[ M.var_access (| "adr7", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (0); Access.Array (7)] [[ M.var_access (| "adr8", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (1); Access.Array (7)] [[ M.var_access (| "adr8", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "out8" [Access.Array (0)] [[ M.var_access (| "adr8", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "out8" [Access.Array (1)] [[ M.var_access (| "adr8", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ M.var_access (| "mux", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ M.var_access (| "mux", [Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ). @@ -120,30 +128,38 @@ Module SegmentMulFixSignals. (* Output *) dbl : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | e : P _ e "e" + | base : P _ base "base" + | out : P _ out "out" + | dbl : P _ dbl "dbl". + End IsNamed. End SegmentMulFixSignals. (* Template body *) Definition SegmentMulFix (nWindows : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("nWindows", nWindows)] ( (* Signal Input *) - do~ M.declare_signal "e" [[ [ InfixOp.mul ~(| M.var (| "nWindows" |), 3 |) ] ]] in + do~ M.declare_signal "e" in (* Signal Input *) - do~ M.declare_signal "base" [[ [ 2 ] ]] in + do~ M.declare_signal "base" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in + do~ M.declare_signal "out" in (* Signal Output *) - do~ M.declare_signal "dbl" [[ [ 2 ] ]] in + do~ M.declare_signal "dbl" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in (* Component *) do~ M.declare_component "e2m" in - do~ M.substitute_var "e2m" [[ M.call_function ~(| "Edwards2Montgomery", ([] : list F.t) |) ]] in - do~ M.substitute_var "e2m" [[ M.var_access (| "base", [Access.Array (0)] |) ]] in - do~ M.substitute_var "e2m" [[ M.var_access (| "base", [Access.Array (1)] |) ]] in + do~ M.substitute_var "e2m" [] [[ M.call_function ~(| "Edwards2Montgomery", ([] : list F.t) |) ]] in + do~ M.substitute_var "e2m" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "base", [Access.Array (0)] |) ]] in + do~ M.substitute_var "e2m" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "base", [Access.Array (1)] |) ]] in (* Component *) do~ M.declare_component "windows" in (* Component *) @@ -152,82 +168,82 @@ Definition SegmentMulFix (nWindows : F.t) : M.t (BlockUnit.t Empty_set) := do~ M.declare_component "cadders" in (* Component *) do~ M.declare_component "dblLast" in - do~ M.substitute_var "dblLast" [[ M.call_function ~(| "MontgomeryDouble", ([] : list F.t) |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "dblLast" [] [[ M.call_function ~(| "MontgomeryDouble", ([] : list F.t) |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "nWindows" |) |) ]] ( - do~ M.substitute_var "windows" [[ M.call_function ~(| "WindowMulFix", ([] : list F.t) |) ]] in - do~ M.substitute_var "cadders" [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "windows" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "WindowMulFix", ([] : list F.t) |) ]] in + do~ M.substitute_var "cadders" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in do~ M.if_ [[ InfixOp.eq ~(| M.var (| "i" |), 0 |) ]] (* then *) ( - do~ M.substitute_var "windows" [[ M.var_access (| "e2m", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "windows" [[ M.var_access (| "e2m", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "cadders" [[ M.var_access (| "e2m", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "cadders" [[ M.var_access (| "e2m", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "windows" [Access.Array (M.var (| "i" |)); Access.Component "base"; Access.Array (0)] [[ M.var_access (| "e2m", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "windows" [Access.Array (M.var (| "i" |)); Access.Component "base"; Access.Array (1)] [[ M.var_access (| "e2m", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "cadders" [Access.Array (M.var (| "i" |)); Access.Component "in1"; Access.Array (0)] [[ M.var_access (| "e2m", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "cadders" [Access.Array (M.var (| "i" |)); Access.Component "in1"; Access.Array (1)] [[ M.var_access (| "e2m", [Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "windows" [[ M.var_access (| "windows", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out8"; Access.Array (0)] |) ]] in - do~ M.substitute_var "windows" [[ M.var_access (| "windows", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out8"; Access.Array (1)] |) ]] in - do~ M.substitute_var "cadders" [[ M.var_access (| "cadders", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "cadders" [[ M.var_access (| "cadders", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "windows" [Access.Array (M.var (| "i" |)); Access.Component "base"; Access.Array (0)] [[ M.var_access (| "windows", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out8"; Access.Array (0)] |) ]] in + do~ M.substitute_var "windows" [Access.Array (M.var (| "i" |)); Access.Component "base"; Access.Array (1)] [[ M.var_access (| "windows", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out8"; Access.Array (1)] |) ]] in + do~ M.substitute_var "cadders" [Access.Array (M.var (| "i" |)); Access.Component "in1"; Access.Array (0)] [[ M.var_access (| "cadders", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "cadders" [Access.Array (M.var (| "i" |)); Access.Component "in1"; Access.Array (1)] [[ M.var_access (| "cadders", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), 3 |) ]] ( - do~ M.substitute_var "windows" [[ M.var_access (| "e", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 3, M.var (| "i" |) |), M.var (| "j" |) |))] |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "windows" [Access.Array (M.var (| "i" |)); Access.Component "in"; Access.Array (M.var (| "j" |))] [[ M.var_access (| "e", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 3, M.var (| "i" |) |), M.var (| "j" |) |))] |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.if_ [[ InfixOp.lesser ~(| M.var (| "i" |), InfixOp.sub ~(| M.var (| "nWindows" |), 1 |) |) ]] (* then *) ( - do~ M.substitute_var "cadders" [[ M.var_access (| "windows", [Access.Array (M.var (| "i" |)); Access.Component "out8"; Access.Array (0)] |) ]] in - do~ M.substitute_var "cadders" [[ M.var_access (| "windows", [Access.Array (M.var (| "i" |)); Access.Component "out8"; Access.Array (1)] |) ]] in + do~ M.substitute_var "cadders" [Access.Array (M.var (| "i" |)); Access.Component "in2"; Access.Array (0)] [[ M.var_access (| "windows", [Access.Array (M.var (| "i" |)); Access.Component "out8"; Access.Array (0)] |) ]] in + do~ M.substitute_var "cadders" [Access.Array (M.var (| "i" |)); Access.Component "in2"; Access.Array (1)] [[ M.var_access (| "windows", [Access.Array (M.var (| "i" |)); Access.Component "out8"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "dblLast" [[ M.var_access (| "windows", [Access.Array (M.var (| "i" |)); Access.Component "out8"; Access.Array (0)] |) ]] in - do~ M.substitute_var "dblLast" [[ M.var_access (| "windows", [Access.Array (M.var (| "i" |)); Access.Component "out8"; Access.Array (1)] |) ]] in - do~ M.substitute_var "cadders" [[ M.var_access (| "dblLast", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "cadders" [[ M.var_access (| "dblLast", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "dblLast" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "windows", [Access.Array (M.var (| "i" |)); Access.Component "out8"; Access.Array (0)] |) ]] in + do~ M.substitute_var "dblLast" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "windows", [Access.Array (M.var (| "i" |)); Access.Component "out8"; Access.Array (1)] |) ]] in + do~ M.substitute_var "cadders" [Access.Array (M.var (| "i" |)); Access.Component "in2"; Access.Array (0)] [[ M.var_access (| "dblLast", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "cadders" [Access.Array (M.var (| "i" |)); Access.Component "in2"; Access.Array (1)] [[ M.var_access (| "dblLast", [Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "nWindows" |) |) ]] ( - do~ M.substitute_var "adders" [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "adders" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in do~ M.if_ [[ InfixOp.eq ~(| M.var (| "i" |), 0 |) ]] (* then *) ( - do~ M.substitute_var "adders" [[ M.var_access (| "dblLast", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adders" [[ M.var_access (| "dblLast", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (M.var (| "i" |)); Access.Component "in1"; Access.Array (0)] [[ M.var_access (| "dblLast", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (M.var (| "i" |)); Access.Component "in1"; Access.Array (1)] [[ M.var_access (| "dblLast", [Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "adders" [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adders" [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (M.var (| "i" |)); Access.Component "in1"; Access.Array (0)] [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (M.var (| "i" |)); Access.Component "in1"; Access.Array (1)] [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "adders" [[ M.var_access (| "windows", [Access.Array (M.var (| "i" |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adders" [[ M.var_access (| "windows", [Access.Array (M.var (| "i" |)); Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "adders" [Access.Array (M.var (| "i" |)); Access.Component "in2"; Access.Array (0)] [[ M.var_access (| "windows", [Access.Array (M.var (| "i" |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (M.var (| "i" |)); Access.Component "in2"; Access.Array (1)] [[ M.var_access (| "windows", [Access.Array (M.var (| "i" |)); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "m2e" in - do~ M.substitute_var "m2e" [[ M.call_function ~(| "Montgomery2Edwards", ([] : list F.t) |) ]] in + do~ M.substitute_var "m2e" [] [[ M.call_function ~(| "Montgomery2Edwards", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "cm2e" in - do~ M.substitute_var "cm2e" [[ M.call_function ~(| "Montgomery2Edwards", ([] : list F.t) |) ]] in - do~ M.substitute_var "m2e" [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "nWindows" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "m2e" [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "nWindows" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "cm2e" [[ M.var_access (| "cadders", [Access.Array (InfixOp.sub ~(| M.var (| "nWindows" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "cm2e" [[ M.var_access (| "cadders", [Access.Array (InfixOp.sub ~(| M.var (| "nWindows" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "cm2e" [] [[ M.call_function ~(| "Montgomery2Edwards", ([] : list F.t) |) ]] in + do~ M.substitute_var "m2e" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "nWindows" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "m2e" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "nWindows" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "cm2e" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "cadders", [Access.Array (InfixOp.sub ~(| M.var (| "nWindows" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "cm2e" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "cadders", [Access.Array (InfixOp.sub ~(| M.var (| "nWindows" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in (* Component *) do~ M.declare_component "cAdd" in - do~ M.substitute_var "cAdd" [[ M.call_function ~(| "BabyAdd", ([] : list F.t) |) ]] in - do~ M.substitute_var "cAdd" [[ M.var_access (| "m2e", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "cAdd" [[ M.var_access (| "m2e", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "cAdd" [[ PrefixOp.sub ~(| M.var_access (| "cm2e", [Access.Component "out"; Access.Array (0)] |) |) ]] in - do~ M.substitute_var "cAdd" [[ M.var_access (| "cm2e", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "cAdd", [Access.Component "xout"] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "cAdd", [Access.Component "yout"] |) ]] in - do~ M.substitute_var "dbl" [[ M.var_access (| "windows", [Access.Array (InfixOp.sub ~(| M.var (| "nWindows" |), 1 |)); Access.Component "out8"; Access.Array (0)] |) ]] in - do~ M.substitute_var "dbl" [[ M.var_access (| "windows", [Access.Array (InfixOp.sub ~(| M.var (| "nWindows" |), 1 |)); Access.Component "out8"; Access.Array (1)] |) ]] in + do~ M.substitute_var "cAdd" [] [[ M.call_function ~(| "BabyAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "cAdd" [Access.Component "x1"] [[ M.var_access (| "m2e", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "cAdd" [Access.Component "y1"] [[ M.var_access (| "m2e", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "cAdd" [Access.Component "x2"] [[ PrefixOp.sub ~(| M.var_access (| "cm2e", [Access.Component "out"; Access.Array (0)] |) |) ]] in + do~ M.substitute_var "cAdd" [Access.Component "y2"] [[ M.var_access (| "cm2e", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ M.var_access (| "cAdd", [Access.Component "xout"] |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ M.var_access (| "cAdd", [Access.Component "yout"] |) ]] in + do~ M.substitute_var "dbl" [Access.Array (0)] [[ M.var_access (| "windows", [Access.Array (InfixOp.sub ~(| M.var (| "nWindows" |), 1 |)); Access.Component "out8"; Access.Array (0)] |) ]] in + do~ M.substitute_var "dbl" [Access.Array (1)] [[ M.var_access (| "windows", [Access.Array (InfixOp.sub ~(| M.var (| "nWindows" |), 1 |)); Access.Component "out8"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ). @@ -245,21 +261,27 @@ Module EscalarMulFixSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | e : P _ e "e" + | out : P _ out "out". + End IsNamed. End EscalarMulFixSignals. (* Template body *) Definition EscalarMulFix (n BASE : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n); ("BASE", BASE)] ( (* Signal Input *) - do~ M.declare_signal "e" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "e" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "nsegments" [[ ([] : list F.t) ]] in - do~ M.substitute_var "nsegments" [[ InfixOp.add ~(| InfixOp.intDiv ~(| InfixOp.sub ~(| M.var (| "n" |), 1 |), 246 |), 1 |) ]] in + do~ M.substitute_var "nsegments" [] [[ InfixOp.add ~(| InfixOp.intDiv ~(| InfixOp.sub ~(| M.var (| "n" |), 1 |), 246 |), 1 |) ]] in (* Var *) do~ M.declare_var "nlastsegment" [[ ([] : list F.t) ]] in - do~ M.substitute_var "nlastsegment" [[ InfixOp.sub ~(| M.var (| "n" |), InfixOp.mul ~(| InfixOp.sub ~(| M.var (| "nsegments" |), 1 |), 249 |) |) ]] in + do~ M.substitute_var "nlastsegment" [] [[ InfixOp.sub ~(| M.var (| "n" |), InfixOp.mul ~(| InfixOp.sub ~(| M.var (| "nsegments" |), 1 |), 249 |) |) ]] in (* Component *) do~ M.declare_component "segments" in (* Component *) @@ -268,67 +290,67 @@ Definition EscalarMulFix (n BASE : F.t) : M.t (BlockUnit.t Empty_set) := do~ M.declare_component "adders" in (* Var *) do~ M.declare_var "s" [[ ([] : list F.t) ]] in - do~ M.substitute_var "s" [[ 0 ]] in + do~ M.substitute_var "s" [] [[ 0 ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Var *) do~ M.declare_var "nseg" [[ ([] : list F.t) ]] in - do~ M.substitute_var "nseg" [[ 0 ]] in + do~ M.substitute_var "nseg" [] [[ 0 ]] in (* Var *) do~ M.declare_var "nWindows" [[ ([] : list F.t) ]] in - do~ M.substitute_var "nWindows" [[ 0 ]] in - do~ M.substitute_var "s" [[ 0 ]] in + do~ M.substitute_var "nWindows" [] [[ 0 ]] in + do~ M.substitute_var "s" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "s" |), M.var (| "nsegments" |) |) ]] ( - do~ M.substitute_var "nseg" [[ ternary_expression (InfixOp.lesser ~(| M.var (| "s" |), InfixOp.sub ~(| M.var (| "nsegments" |), 1 |) |)) (249) (M.var (| "nlastsegment" |)) ]] in - do~ M.substitute_var "nWindows" [[ InfixOp.add ~(| InfixOp.intDiv ~(| InfixOp.sub ~(| M.var (| "nseg" |), 1 |), 3 |), 1 |) ]] in - do~ M.substitute_var "segments" [[ M.call_function ~(| "SegmentMulFix", [ M.var (| "nWindows" |) ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "nseg" [] [[ ternary_expression (InfixOp.lesser ~(| M.var (| "s" |), InfixOp.sub ~(| M.var (| "nsegments" |), 1 |) |)) (249) (M.var (| "nlastsegment" |)) ]] in + do~ M.substitute_var "nWindows" [] [[ InfixOp.add ~(| InfixOp.intDiv ~(| InfixOp.sub ~(| M.var (| "nseg" |), 1 |), 3 |), 1 |) ]] in + do~ M.substitute_var "segments" [Access.Array (M.var (| "s" |))] [[ M.call_function ~(| "SegmentMulFix", [ M.var (| "nWindows" |) ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "nseg" |) |) ]] ( - do~ M.substitute_var "segments" [[ M.var_access (| "e", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| M.var (| "s" |), 249 |), M.var (| "i" |) |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "segments" [Access.Array (M.var (| "s" |)); Access.Component "e"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "e", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| M.var (| "s" |), 249 |), M.var (| "i" |) |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ M.var (| "nseg" |) ]] in + do~ M.substitute_var "i" [] [[ M.var (| "nseg" |) ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), InfixOp.mul ~(| M.var (| "nWindows" |), 3 |) |) ]] ( - do~ M.substitute_var "segments" [[ 0 ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "segments" [Access.Array (M.var (| "s" |)); Access.Component "e"; Access.Array (M.var (| "i" |))] [[ 0 ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.if_ [[ InfixOp.eq ~(| M.var (| "s" |), 0 |) ]] (* then *) ( - do~ M.substitute_var "segments" [[ M.var_access (| "BASE", [Access.Array (0)] |) ]] in - do~ M.substitute_var "segments" [[ M.var_access (| "BASE", [Access.Array (1)] |) ]] in + do~ M.substitute_var "segments" [Access.Array (M.var (| "s" |)); Access.Component "base"; Access.Array (0)] [[ M.var_access (| "BASE", [Access.Array (0)] |) ]] in + do~ M.substitute_var "segments" [Access.Array (M.var (| "s" |)); Access.Component "base"; Access.Array (1)] [[ M.var_access (| "BASE", [Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "m2e" [[ M.call_function ~(| "Montgomery2Edwards", ([] : list F.t) |) ]] in - do~ M.substitute_var "adders" [[ M.call_function ~(| "BabyAdd", ([] : list F.t) |) ]] in - do~ M.substitute_var "m2e" [[ M.var_access (| "segments", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "dbl"; Access.Array (0)] |) ]] in - do~ M.substitute_var "m2e" [[ M.var_access (| "segments", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "dbl"; Access.Array (1)] |) ]] in - do~ M.substitute_var "segments" [[ M.var_access (| "m2e", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "segments" [[ M.var_access (| "m2e", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "m2e" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |))] [[ M.call_function ~(| "Montgomery2Edwards", ([] : list F.t) |) ]] in + do~ M.substitute_var "adders" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |))] [[ M.call_function ~(| "BabyAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "m2e" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "in"; Access.Array (0)] [[ M.var_access (| "segments", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "dbl"; Access.Array (0)] |) ]] in + do~ M.substitute_var "m2e" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "in"; Access.Array (1)] [[ M.var_access (| "segments", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "dbl"; Access.Array (1)] |) ]] in + do~ M.substitute_var "segments" [Access.Array (M.var (| "s" |)); Access.Component "base"; Access.Array (0)] [[ M.var_access (| "m2e", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "segments" [Access.Array (M.var (| "s" |)); Access.Component "base"; Access.Array (1)] [[ M.var_access (| "m2e", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in do~ M.if_ [[ InfixOp.eq ~(| M.var (| "s" |), 1 |) ]] (* then *) ( - do~ M.substitute_var "adders" [[ M.var_access (| "segments", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adders" [[ M.var_access (| "segments", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "x1"] [[ M.var_access (| "segments", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "y1"] [[ M.var_access (| "segments", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "adders" [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 2 |)); Access.Component "xout"] |) ]] in - do~ M.substitute_var "adders" [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 2 |)); Access.Component "yout"] |) ]] in + do~ M.substitute_var "adders" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "x1"] [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 2 |)); Access.Component "xout"] |) ]] in + do~ M.substitute_var "adders" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "y1"] [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 2 |)); Access.Component "yout"] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "adders" [[ M.var_access (| "segments", [Access.Array (M.var (| "s" |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adders" [[ M.var_access (| "segments", [Access.Array (M.var (| "s" |)); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "x2"] [[ M.var_access (| "segments", [Access.Array (M.var (| "s" |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (InfixOp.sub ~(| M.var (| "s" |), 1 |)); Access.Component "y2"] [[ M.var_access (| "segments", [Access.Array (M.var (| "s" |)); Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "s" [[ InfixOp.add ~(| M.var (| "s" |), 1 |) ]] in + do~ M.substitute_var "s" [] [[ InfixOp.add ~(| M.var (| "s" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.if_ [[ InfixOp.eq ~(| M.var (| "nsegments" |), 1 |) ]] (* then *) ( - do~ M.substitute_var "out" [[ M.var_access (| "segments", [Access.Array (0); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "segments", [Access.Array (0); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ M.var_access (| "segments", [Access.Array (0); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ M.var_access (| "segments", [Access.Array (0); Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "out" [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "nsegments" |), 2 |)); Access.Component "xout"] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "nsegments" |), 2 |)); Access.Component "yout"] |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "nsegments" |), 2 |)); Access.Component "xout"] |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "nsegments" |), 2 |)); Access.Component "yout"] |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt diff --git a/Garden/Circom/Circomlib/translation/circuits/escalarmulw4table.v b/Garden/Circom/Circomlib/translation/circuits/escalarmulw4table.v index eee7db3..01caa21 100644 --- a/Garden/Circom/Circomlib/translation/circuits/escalarmulw4table.v +++ b/Garden/Circom/Circomlib/translation/circuits/escalarmulw4table.v @@ -6,15 +6,15 @@ Definition pointAdd (x1 y1 x2 y2 : F.t) : M.t F.t := M.function_body [("x1", x1); ("y1", y1); ("x2", x2); ("y2", y2)] ( (* Var *) do~ M.declare_var "a" [[ ([] : list F.t) ]] in - do~ M.substitute_var "a" [[ 168700 ]] in + do~ M.substitute_var "a" [] [[ 168700 ]] in (* Var *) do~ M.declare_var "d" [[ ([] : list F.t) ]] in - do~ M.substitute_var "d" [[ 168696 ]] in + do~ M.substitute_var "d" [] [[ 168696 ]] in (* Var *) do~ M.declare_var "res" [[ [ 2 ] ]] in - do~ M.substitute_var "res" [[ array_with_repeat (0) (2) ]] in - do~ M.substitute_var "res" [[ InfixOp.div ~(| InfixOp.add ~(| InfixOp.mul ~(| M.var (| "x1" |), M.var (| "y2" |) |), InfixOp.mul ~(| M.var (| "y1" |), M.var (| "x2" |) |) |), InfixOp.add ~(| 1, InfixOp.mul ~(| InfixOp.mul ~(| InfixOp.mul ~(| InfixOp.mul ~(| M.var (| "d" |), M.var (| "x1" |) |), M.var (| "x2" |) |), M.var (| "y1" |) |), M.var (| "y2" |) |) |) |) ]] in - do~ M.substitute_var "res" [[ InfixOp.div ~(| InfixOp.sub ~(| InfixOp.mul ~(| M.var (| "y1" |), M.var (| "y2" |) |), InfixOp.mul ~(| InfixOp.mul ~(| M.var (| "a" |), M.var (| "x1" |) |), M.var (| "x2" |) |) |), InfixOp.sub ~(| 1, InfixOp.mul ~(| InfixOp.mul ~(| InfixOp.mul ~(| InfixOp.mul ~(| M.var (| "d" |), M.var (| "x1" |) |), M.var (| "x2" |) |), M.var (| "y1" |) |), M.var (| "y2" |) |) |) |) ]] in + do~ M.substitute_var "res" [] [[ array_with_repeat (0) (2) ]] in + do~ M.substitute_var "res" [Access.Array (0)] [[ InfixOp.div ~(| InfixOp.add ~(| InfixOp.mul ~(| M.var (| "x1" |), M.var (| "y2" |) |), InfixOp.mul ~(| M.var (| "y1" |), M.var (| "x2" |) |) |), InfixOp.add ~(| 1, InfixOp.mul ~(| InfixOp.mul ~(| InfixOp.mul ~(| InfixOp.mul ~(| M.var (| "d" |), M.var (| "x1" |) |), M.var (| "x2" |) |), M.var (| "y1" |) |), M.var (| "y2" |) |) |) |) ]] in + do~ M.substitute_var "res" [Access.Array (1)] [[ InfixOp.div ~(| InfixOp.sub ~(| InfixOp.mul ~(| M.var (| "y1" |), M.var (| "y2" |) |), InfixOp.mul ~(| InfixOp.mul ~(| M.var (| "a" |), M.var (| "x1" |) |), M.var (| "x2" |) |) |), InfixOp.sub ~(| 1, InfixOp.mul ~(| InfixOp.mul ~(| InfixOp.mul ~(| InfixOp.mul ~(| M.var (| "d" |), M.var (| "x1" |) |), M.var (| "x2" |) |), M.var (| "y1" |) |), M.var (| "y2" |) |) |) |) ]] in do~ M.return_ [[ M.var (| "res" |) ]] in M.pure BlockUnit.Tt ). @@ -24,31 +24,31 @@ Definition EscalarMulW4Table (base k : F.t) : M.t F.t := M.function_body [("base", base); ("k", k)] ( (* Var *) do~ M.declare_var "out" [[ [ 16; 2 ] ]] in - do~ M.substitute_var "out" [[ array_with_repeat (array_with_repeat (0) (2)) (16) ]] in + do~ M.substitute_var "out" [] [[ array_with_repeat (array_with_repeat (0) (2)) (16) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Var *) do~ M.declare_var "p" [[ [ 2 ] ]] in - do~ M.substitute_var "p" [[ array_with_repeat (0) (2) ]] in + do~ M.substitute_var "p" [] [[ array_with_repeat (0) (2) ]] in (* Var *) do~ M.declare_var "dbl" [[ [ 2 ] ]] in - do~ M.substitute_var "dbl" [[ array_with_repeat (0) (2) ]] in - do~ M.substitute_var "dbl" [[ M.var (| "base" |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "dbl" [] [[ array_with_repeat (0) (2) ]] in + do~ M.substitute_var "dbl" [] [[ M.var (| "base" |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), InfixOp.mul ~(| M.var (| "k" |), 4 |) |) ]] ( - do~ M.substitute_var "dbl" [[ M.call_function ~(| "pointAdd", [ M.var_access (| "dbl", [Access.Array (0)] |); M.var_access (| "dbl", [Access.Array (1)] |); M.var_access (| "dbl", [Access.Array (0)] |); M.var_access (| "dbl", [Access.Array (1)] |) ] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "dbl" [] [[ M.call_function ~(| "pointAdd", [ M.var_access (| "dbl", [Access.Array (0)] |); M.var_access (| "dbl", [Access.Array (1)] |); M.var_access (| "dbl", [Access.Array (0)] |); M.var_access (| "dbl", [Access.Array (1)] |) ] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ 0 ]] in - do~ M.substitute_var "out" [[ 1 ]] in - do~ M.substitute_var "i" [[ 1 ]] in + do~ M.substitute_var "out" [Access.Array (0); Access.Array (0)] [[ 0 ]] in + do~ M.substitute_var "out" [Access.Array (0); Access.Array (1)] [[ 1 ]] in + do~ M.substitute_var "i" [] [[ 1 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 16 |) ]] ( - do~ M.substitute_var "p" [[ M.call_function ~(| "pointAdd", [ M.var_access (| "out", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Array (0)] |); M.var_access (| "out", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Array (1)] |); M.var_access (| "dbl", [Access.Array (0)] |); M.var_access (| "dbl", [Access.Array (1)] |) ] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "p", [Access.Array (0)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "p", [Access.Array (1)] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "p" [] [[ M.call_function ~(| "pointAdd", [ M.var_access (| "out", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Array (0)] |); M.var_access (| "out", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Array (1)] |); M.var_access (| "dbl", [Access.Array (0)] |); M.var_access (| "dbl", [Access.Array (1)] |) ] |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |)); Access.Array (0)] [[ M.var_access (| "p", [Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |)); Access.Array (1)] [[ M.var_access (| "p", [Access.Array (1)] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.return_ [[ M.var (| "out" |) ]] in diff --git a/Garden/Circom/Circomlib/translation/circuits/gates.v b/Garden/Circom/Circomlib/translation/circuits/gates.v index 1d68b78..3d192a3 100644 --- a/Garden/Circom/Circomlib/translation/circuits/gates.v +++ b/Garden/Circom/Circomlib/translation/circuits/gates.v @@ -11,18 +11,25 @@ Module XORSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | a : P _ a "a" + | b : P _ b "b" + | out : P _ out "out". + End IsNamed. End XORSignals. (* Template body *) Definition XOR : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "a" [[ ([] : list F.t) ]] in + do~ M.declare_signal "a" in (* Signal Input *) - do~ M.declare_signal "b" [[ ([] : list F.t) ]] in + do~ M.declare_signal "b" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in - do~ M.substitute_var "out" [[ InfixOp.sub ~(| InfixOp.add ~(| M.var (| "a" |), M.var (| "b" |) |), InfixOp.mul ~(| InfixOp.mul ~(| 2, M.var (| "a" |) |), M.var (| "b" |) |) |) ]] in + do~ M.declare_signal "out" in + do~ M.substitute_var "out" [] [[ InfixOp.sub ~(| InfixOp.add ~(| M.var (| "a" |), M.var (| "b" |) |), InfixOp.mul ~(| InfixOp.mul ~(| 2, M.var (| "a" |) |), M.var (| "b" |) |) |) ]] in M.pure BlockUnit.Tt ). @@ -42,18 +49,25 @@ Module ANDSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | a : P _ a "a" + | b : P _ b "b" + | out : P _ out "out". + End IsNamed. End ANDSignals. (* Template body *) Definition AND : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "a" [[ ([] : list F.t) ]] in + do~ M.declare_signal "a" in (* Signal Input *) - do~ M.declare_signal "b" [[ ([] : list F.t) ]] in + do~ M.declare_signal "b" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in - do~ M.substitute_var "out" [[ InfixOp.mul ~(| M.var (| "a" |), M.var (| "b" |) |) ]] in + do~ M.declare_signal "out" in + do~ M.substitute_var "out" [] [[ InfixOp.mul ~(| M.var (| "a" |), M.var (| "b" |) |) ]] in M.pure BlockUnit.Tt ). @@ -73,18 +87,25 @@ Module ORSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | a : P _ a "a" + | b : P _ b "b" + | out : P _ out "out". + End IsNamed. End ORSignals. (* Template body *) Definition OR : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "a" [[ ([] : list F.t) ]] in + do~ M.declare_signal "a" in (* Signal Input *) - do~ M.declare_signal "b" [[ ([] : list F.t) ]] in + do~ M.declare_signal "b" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in - do~ M.substitute_var "out" [[ InfixOp.sub ~(| InfixOp.add ~(| M.var (| "a" |), M.var (| "b" |) |), InfixOp.mul ~(| M.var (| "a" |), M.var (| "b" |) |) |) ]] in + do~ M.declare_signal "out" in + do~ M.substitute_var "out" [] [[ InfixOp.sub ~(| InfixOp.add ~(| M.var (| "a" |), M.var (| "b" |) |), InfixOp.mul ~(| M.var (| "a" |), M.var (| "b" |) |) |) ]] in M.pure BlockUnit.Tt ). @@ -102,16 +123,22 @@ Module NOTSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End NOTSignals. (* Template body *) Definition NOT : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ ([] : list F.t) ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in - do~ M.substitute_var "out" [[ InfixOp.sub ~(| InfixOp.add ~(| 1, M.var (| "in" |) |), InfixOp.mul ~(| 2, M.var (| "in" |) |) |) ]] in + do~ M.declare_signal "out" in + do~ M.substitute_var "out" [] [[ InfixOp.sub ~(| InfixOp.add ~(| 1, M.var (| "in" |) |), InfixOp.mul ~(| 2, M.var (| "in" |) |) |) ]] in M.pure BlockUnit.Tt ). @@ -131,18 +158,25 @@ Module NANDSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | a : P _ a "a" + | b : P _ b "b" + | out : P _ out "out". + End IsNamed. End NANDSignals. (* Template body *) Definition NAND : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "a" [[ ([] : list F.t) ]] in + do~ M.declare_signal "a" in (* Signal Input *) - do~ M.declare_signal "b" [[ ([] : list F.t) ]] in + do~ M.declare_signal "b" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in - do~ M.substitute_var "out" [[ InfixOp.sub ~(| 1, InfixOp.mul ~(| M.var (| "a" |), M.var (| "b" |) |) |) ]] in + do~ M.declare_signal "out" in + do~ M.substitute_var "out" [] [[ InfixOp.sub ~(| 1, InfixOp.mul ~(| M.var (| "a" |), M.var (| "b" |) |) |) ]] in M.pure BlockUnit.Tt ). @@ -162,18 +196,25 @@ Module NORSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | a : P _ a "a" + | b : P _ b "b" + | out : P _ out "out". + End IsNamed. End NORSignals. (* Template body *) Definition NOR : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "a" [[ ([] : list F.t) ]] in + do~ M.declare_signal "a" in (* Signal Input *) - do~ M.declare_signal "b" [[ ([] : list F.t) ]] in + do~ M.declare_signal "b" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in - do~ M.substitute_var "out" [[ InfixOp.sub ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| M.var (| "a" |), M.var (| "b" |) |), 1 |), M.var (| "a" |) |), M.var (| "b" |) |) ]] in + do~ M.declare_signal "out" in + do~ M.substitute_var "out" [] [[ InfixOp.sub ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| M.var (| "a" |), M.var (| "b" |) |), 1 |), M.var (| "a" |) |), M.var (| "b" |) |) ]] in M.pure BlockUnit.Tt ). @@ -191,15 +232,21 @@ Module MultiANDSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End MultiANDSignals. (* Template body *) Definition MultiAND (n : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "and1" in (* Component *) @@ -207,43 +254,43 @@ Definition MultiAND (n : F.t) : M.t (BlockUnit.t Empty_set) := (* Component *) do~ M.declare_component "ands" in do~ M.if_ [[ InfixOp.eq ~(| M.var (| "n" |), 1 |) ]] (* then *) ( - do~ M.substitute_var "out" [[ M.var_access (| "in", [Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "in", [Access.Array (0)] |) ]] in M.pure BlockUnit.Tt ) (* else *) ( do~ M.if_ [[ InfixOp.eq ~(| M.var (| "n" |), 2 |) ]] (* then *) ( - do~ M.substitute_var "and1" [[ M.call_function ~(| "AND", ([] : list F.t) |) ]] in - do~ M.substitute_var "and1" [[ M.var_access (| "in", [Access.Array (0)] |) ]] in - do~ M.substitute_var "and1" [[ M.var_access (| "in", [Access.Array (1)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "and1", [Access.Component "out"] |) ]] in + do~ M.substitute_var "and1" [] [[ M.call_function ~(| "AND", ([] : list F.t) |) ]] in + do~ M.substitute_var "and1" [Access.Component "a"] [[ M.var_access (| "in", [Access.Array (0)] |) ]] in + do~ M.substitute_var "and1" [Access.Component "b"] [[ M.var_access (| "in", [Access.Array (1)] |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "and1", [Access.Component "out"] |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "and2" [[ M.call_function ~(| "AND", ([] : list F.t) |) ]] in + do~ M.substitute_var "and2" [] [[ M.call_function ~(| "AND", ([] : list F.t) |) ]] in (* Var *) do~ M.declare_var "n1" [[ ([] : list F.t) ]] in - do~ M.substitute_var "n1" [[ InfixOp.intDiv ~(| M.var (| "n" |), 2 |) ]] in + do~ M.substitute_var "n1" [] [[ InfixOp.intDiv ~(| M.var (| "n" |), 2 |) ]] in (* Var *) do~ M.declare_var "n2" [[ ([] : list F.t) ]] in - do~ M.substitute_var "n2" [[ InfixOp.sub ~(| M.var (| "n" |), InfixOp.intDiv ~(| M.var (| "n" |), 2 |) |) ]] in - do~ M.substitute_var "ands" [[ M.call_function ~(| "MultiAND", [ M.var (| "n1" |) ] |) ]] in - do~ M.substitute_var "ands" [[ M.call_function ~(| "MultiAND", [ M.var (| "n2" |) ] |) ]] in + do~ M.substitute_var "n2" [] [[ InfixOp.sub ~(| M.var (| "n" |), InfixOp.intDiv ~(| M.var (| "n" |), 2 |) |) ]] in + do~ M.substitute_var "ands" [Access.Array (0)] [[ M.call_function ~(| "MultiAND", [ M.var (| "n1" |) ] |) ]] in + do~ M.substitute_var "ands" [Access.Array (1)] [[ M.call_function ~(| "MultiAND", [ M.var (| "n2" |) ] |) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "n1" |) |) ]] ( - do~ M.substitute_var "ands" [[ M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "ands" [Access.Array (0); Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "n2" |) |) ]] ( - do~ M.substitute_var "ands" [[ M.var_access (| "in", [Access.Array (InfixOp.add ~(| M.var (| "n1" |), M.var (| "i" |) |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "ands" [Access.Array (1); Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "in", [Access.Array (InfixOp.add ~(| M.var (| "n1" |), M.var (| "i" |) |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "and2" [[ M.var_access (| "ands", [Access.Array (0); Access.Component "out"] |) ]] in - do~ M.substitute_var "and2" [[ M.var_access (| "ands", [Access.Array (1); Access.Component "out"] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "and2", [Access.Component "out"] |) ]] in + do~ M.substitute_var "and2" [Access.Component "a"] [[ M.var_access (| "ands", [Access.Array (0); Access.Component "out"] |) ]] in + do~ M.substitute_var "and2" [Access.Component "b"] [[ M.var_access (| "ands", [Access.Array (1); Access.Component "out"] |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "and2", [Access.Component "out"] |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt diff --git a/Garden/Circom/Circomlib/translation/circuits/mimc.v b/Garden/Circom/Circomlib/translation/circuits/mimc.v index 37337a1..6c86423 100644 --- a/Garden/Circom/Circomlib/translation/circuits/mimc.v +++ b/Garden/Circom/Circomlib/translation/circuits/mimc.v @@ -19,48 +19,59 @@ Module MiMC7Signals. (* Intermediate *) t7 : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | x_in : P _ x_in "x_in" + | k : P _ k "k" + | out : P _ out "out" + | t2 : P _ t2 "t2" + | t4 : P _ t4 "t4" + | t6 : P _ t6 "t6" + | t7 : P _ t7 "t7". + End IsNamed. End MiMC7Signals. (* Template body *) Definition MiMC7 (nrounds : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("nrounds", nrounds)] ( (* Signal Input *) - do~ M.declare_signal "x_in" [[ ([] : list F.t) ]] in + do~ M.declare_signal "x_in" in (* Signal Input *) - do~ M.declare_signal "k" [[ ([] : list F.t) ]] in + do~ M.declare_signal "k" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "c" [[ [ 91 ] ]] in - do~ M.substitute_var "c" [[ array_with_repeat (0) (91) ]] in - do~ M.substitute_var "c" [[ [ 0; 20888961410941983456478427210666206549300505294776164667214940546594746570981; 15265126113435022738560151911929040668591755459209400716467504685752745317193; 8334177627492981984476504167502758309043212251641796197711684499645635709656; 1374324219480165500871639364801692115397519265181803854177629327624133579404; 11442588683664344394633565859260176446561886575962616332903193988751292992472; 2558901189096558760448896669327086721003508630712968559048179091037845349145; 11189978595292752354820141775598510151189959177917284797737745690127318076389; 3262966573163560839685415914157855077211340576201936620532175028036746741754; 17029914891543225301403832095880481731551830725367286980611178737703889171730; 4614037031668406927330683909387957156531244689520944789503628527855167665518; 19647356996769918391113967168615123299113119185942498194367262335168397100658; 5040699236106090655289931820723926657076483236860546282406111821875672148900; 2632385916954580941368956176626336146806721642583847728103570779270161510514; 17691411851977575435597871505860208507285462834710151833948561098560743654671; 11482807709115676646560379017491661435505951727793345550942389701970904563183; 8360838254132998143349158726141014535383109403565779450210746881879715734773; 12663821244032248511491386323242575231591777785787269938928497649288048289525; 3067001377342968891237590775929219083706800062321980129409398033259904188058; 8536471869378957766675292398190944925664113548202769136103887479787957959589; 19825444354178182240559170937204690272111734703605805530888940813160705385792; 16703465144013840124940690347975638755097486902749048533167980887413919317592; 13061236261277650370863439564453267964462486225679643020432589226741411380501; 10864774797625152707517901967943775867717907803542223029967000416969007792571; 10035653564014594269791753415727486340557376923045841607746250017541686319774; 3446968588058668564420958894889124905706353937375068998436129414772610003289; 4653317306466493184743870159523234588955994456998076243468148492375236846006; 8486711143589723036499933521576871883500223198263343024003617825616410932026; 250710584458582618659378487568129931785810765264752039738223488321597070280; 2104159799604932521291371026105311735948154964200596636974609406977292675173; 16313562605837709339799839901240652934758303521543693857533755376563489378839; 6032365105133504724925793806318578936233045029919447519826248813478479197288; 14025118133847866722315446277964222215118620050302054655768867040006542798474; 7400123822125662712777833064081316757896757785777291653271747396958201309118; 1744432620323851751204287974553233986555641872755053103823939564833813704825; 8316378125659383262515151597439205374263247719876250938893842106722210729522; 6739722627047123650704294650168547689199576889424317598327664349670094847386; 21211457866117465531949733809706514799713333930924902519246949506964470524162; 13718112532745211817410303291774369209520657938741992779396229864894885156527; 5264534817993325015357427094323255342713527811596856940387954546330728068658; 18884137497114307927425084003812022333609937761793387700010402412840002189451; 5148596049900083984813839872929010525572543381981952060869301611018636120248; 19799686398774806587970184652860783461860993790013219899147141137827718662674; 19240878651604412704364448729659032944342952609050243268894572835672205984837; 10546185249390392695582524554167530669949955276893453512788278945742408153192; 5507959600969845538113649209272736011390582494851145043668969080335346810411; 18177751737739153338153217698774510185696788019377850245260475034576050820091; 19603444733183990109492724100282114612026332366576932662794133334264283907557; 10548274686824425401349248282213580046351514091431715597441736281987273193140; 1823201861560942974198127384034483127920205835821334101215923769688644479957; 11867589662193422187545516240823411225342068709600734253659804646934346124945; 18718569356736340558616379408444812528964066420519677106145092918482774343613; 10530777752259630125564678480897857853807637120039176813174150229243735996839; 20486583726592018813337145844457018474256372770211860618687961310422228379031; 12690713110714036569415168795200156516217175005650145422920562694422306200486; 17386427286863519095301372413760745749282643730629659997153085139065756667205; 2216432659854733047132347621569505613620980842043977268828076165669557467682; 6309765381643925252238633914530877025934201680691496500372265330505506717193; 20806323192073945401862788605803131761175139076694468214027227878952047793390; 4037040458505567977365391535756875199663510397600316887746139396052445718861; 19948974083684238245321361840704327952464170097132407924861169241740046562673; 845322671528508199439318170916419179535949348988022948153107378280175750024; 16222384601744433420585982239113457177459602187868460608565289920306145389382; 10232118865851112229330353999139005145127746617219324244541194256766741433339; 6699067738555349409504843460654299019000594109597429103342076743347235369120; 6220784880752427143725783746407285094967584864656399181815603544365010379208; 6129250029437675212264306655559561251995722990149771051304736001195288083309; 10773245783118750721454994239248013870822765715268323522295722350908043393604; 4490242021765793917495398271905043433053432245571325177153467194570741607167; 19596995117319480189066041930051006586888908165330319666010398892494684778526; 837850695495734270707668553360118467905109360511302468085569220634750561083; 11803922811376367215191737026157445294481406304781326649717082177394185903907; 10201298324909697255105265958780781450978049256931478989759448189112393506592; 13564695482314888817576351063608519127702411536552857463682060761575100923924; 9262808208636973454201420823766139682381973240743541030659775288508921362724; 173271062536305557219323722062711383294158572562695717740068656098441040230; 18120430890549410286417591505529104700901943324772175772035648111937818237369; 20484495168135072493552514219686101965206843697794133766912991150184337935627; 19155651295705203459475805213866664350848604323501251939850063308319753686505; 11971299749478202793661982361798418342615500543489781306376058267926437157297; 18285310723116790056148596536349375622245669010373674803854111592441823052978; 7069216248902547653615508023941692395371990416048967468982099270925308100727; 6465151453746412132599596984628739550147379072443683076388208843341824127379; 16143532858389170960690347742477978826830511669766530042104134302796355145785; 19362583304414853660976404410208489566967618125972377176980367224623492419647; 1702213613534733786921602839210290505213503664731919006932367875629005980493; 10781825404476535814285389902565833897646945212027592373510689209734812292327; 4212716923652881254737947578600828255798948993302968210248673545442808456151; 7594017890037021425366623750593200398174488805473151513558919864633711506220; 18979889247746272055963929241596362599320706910852082477600815822482192194401; 13602139229813231349386885113156901793661719180900395818909719758150455500533 ] ]] in + do~ M.substitute_var "c" [] [[ array_with_repeat (0) (91) ]] in + do~ M.substitute_var "c" [] [[ [ 0; 20888961410941983456478427210666206549300505294776164667214940546594746570981; 15265126113435022738560151911929040668591755459209400716467504685752745317193; 8334177627492981984476504167502758309043212251641796197711684499645635709656; 1374324219480165500871639364801692115397519265181803854177629327624133579404; 11442588683664344394633565859260176446561886575962616332903193988751292992472; 2558901189096558760448896669327086721003508630712968559048179091037845349145; 11189978595292752354820141775598510151189959177917284797737745690127318076389; 3262966573163560839685415914157855077211340576201936620532175028036746741754; 17029914891543225301403832095880481731551830725367286980611178737703889171730; 4614037031668406927330683909387957156531244689520944789503628527855167665518; 19647356996769918391113967168615123299113119185942498194367262335168397100658; 5040699236106090655289931820723926657076483236860546282406111821875672148900; 2632385916954580941368956176626336146806721642583847728103570779270161510514; 17691411851977575435597871505860208507285462834710151833948561098560743654671; 11482807709115676646560379017491661435505951727793345550942389701970904563183; 8360838254132998143349158726141014535383109403565779450210746881879715734773; 12663821244032248511491386323242575231591777785787269938928497649288048289525; 3067001377342968891237590775929219083706800062321980129409398033259904188058; 8536471869378957766675292398190944925664113548202769136103887479787957959589; 19825444354178182240559170937204690272111734703605805530888940813160705385792; 16703465144013840124940690347975638755097486902749048533167980887413919317592; 13061236261277650370863439564453267964462486225679643020432589226741411380501; 10864774797625152707517901967943775867717907803542223029967000416969007792571; 10035653564014594269791753415727486340557376923045841607746250017541686319774; 3446968588058668564420958894889124905706353937375068998436129414772610003289; 4653317306466493184743870159523234588955994456998076243468148492375236846006; 8486711143589723036499933521576871883500223198263343024003617825616410932026; 250710584458582618659378487568129931785810765264752039738223488321597070280; 2104159799604932521291371026105311735948154964200596636974609406977292675173; 16313562605837709339799839901240652934758303521543693857533755376563489378839; 6032365105133504724925793806318578936233045029919447519826248813478479197288; 14025118133847866722315446277964222215118620050302054655768867040006542798474; 7400123822125662712777833064081316757896757785777291653271747396958201309118; 1744432620323851751204287974553233986555641872755053103823939564833813704825; 8316378125659383262515151597439205374263247719876250938893842106722210729522; 6739722627047123650704294650168547689199576889424317598327664349670094847386; 21211457866117465531949733809706514799713333930924902519246949506964470524162; 13718112532745211817410303291774369209520657938741992779396229864894885156527; 5264534817993325015357427094323255342713527811596856940387954546330728068658; 18884137497114307927425084003812022333609937761793387700010402412840002189451; 5148596049900083984813839872929010525572543381981952060869301611018636120248; 19799686398774806587970184652860783461860993790013219899147141137827718662674; 19240878651604412704364448729659032944342952609050243268894572835672205984837; 10546185249390392695582524554167530669949955276893453512788278945742408153192; 5507959600969845538113649209272736011390582494851145043668969080335346810411; 18177751737739153338153217698774510185696788019377850245260475034576050820091; 19603444733183990109492724100282114612026332366576932662794133334264283907557; 10548274686824425401349248282213580046351514091431715597441736281987273193140; 1823201861560942974198127384034483127920205835821334101215923769688644479957; 11867589662193422187545516240823411225342068709600734253659804646934346124945; 18718569356736340558616379408444812528964066420519677106145092918482774343613; 10530777752259630125564678480897857853807637120039176813174150229243735996839; 20486583726592018813337145844457018474256372770211860618687961310422228379031; 12690713110714036569415168795200156516217175005650145422920562694422306200486; 17386427286863519095301372413760745749282643730629659997153085139065756667205; 2216432659854733047132347621569505613620980842043977268828076165669557467682; 6309765381643925252238633914530877025934201680691496500372265330505506717193; 20806323192073945401862788605803131761175139076694468214027227878952047793390; 4037040458505567977365391535756875199663510397600316887746139396052445718861; 19948974083684238245321361840704327952464170097132407924861169241740046562673; 845322671528508199439318170916419179535949348988022948153107378280175750024; 16222384601744433420585982239113457177459602187868460608565289920306145389382; 10232118865851112229330353999139005145127746617219324244541194256766741433339; 6699067738555349409504843460654299019000594109597429103342076743347235369120; 6220784880752427143725783746407285094967584864656399181815603544365010379208; 6129250029437675212264306655559561251995722990149771051304736001195288083309; 10773245783118750721454994239248013870822765715268323522295722350908043393604; 4490242021765793917495398271905043433053432245571325177153467194570741607167; 19596995117319480189066041930051006586888908165330319666010398892494684778526; 837850695495734270707668553360118467905109360511302468085569220634750561083; 11803922811376367215191737026157445294481406304781326649717082177394185903907; 10201298324909697255105265958780781450978049256931478989759448189112393506592; 13564695482314888817576351063608519127702411536552857463682060761575100923924; 9262808208636973454201420823766139682381973240743541030659775288508921362724; 173271062536305557219323722062711383294158572562695717740068656098441040230; 18120430890549410286417591505529104700901943324772175772035648111937818237369; 20484495168135072493552514219686101965206843697794133766912991150184337935627; 19155651295705203459475805213866664350848604323501251939850063308319753686505; 11971299749478202793661982361798418342615500543489781306376058267926437157297; 18285310723116790056148596536349375622245669010373674803854111592441823052978; 7069216248902547653615508023941692395371990416048967468982099270925308100727; 6465151453746412132599596984628739550147379072443683076388208843341824127379; 16143532858389170960690347742477978826830511669766530042104134302796355145785; 19362583304414853660976404410208489566967618125972377176980367224623492419647; 1702213613534733786921602839210290505213503664731919006932367875629005980493; 10781825404476535814285389902565833897646945212027592373510689209734812292327; 4212716923652881254737947578600828255798948993302968210248673545442808456151; 7594017890037021425366623750593200398174488805473151513558919864633711506220; 18979889247746272055963929241596362599320706910852082477600815822482192194401; 13602139229813231349386885113156901793661719180900395818909719758150455500533 ] ]] in (* Var *) do~ M.declare_var "t" [[ ([] : list F.t) ]] in - do~ M.substitute_var "t" [[ 0 ]] in + do~ M.substitute_var "t" [] [[ 0 ]] in (* Signal Intermediate *) - do~ M.declare_signal "t2" [[ [ M.var (| "nrounds" |) ] ]] in + do~ M.declare_signal "t2" in (* Signal Intermediate *) - do~ M.declare_signal "t4" [[ [ M.var (| "nrounds" |) ] ]] in + do~ M.declare_signal "t4" in (* Signal Intermediate *) - do~ M.declare_signal "t6" [[ [ M.var (| "nrounds" |) ] ]] in + do~ M.declare_signal "t6" in (* Signal Intermediate *) - do~ M.declare_signal "t7" [[ [ InfixOp.sub ~(| M.var (| "nrounds" |), 1 |) ] ]] in + do~ M.declare_signal "t7" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "nrounds" |) |) ]] ( - do~ M.substitute_var "t" [[ ternary_expression (InfixOp.eq ~(| M.var (| "i" |), 0 |)) (InfixOp.add ~(| M.var (| "k" |), M.var (| "x_in" |) |)) (InfixOp.add ~(| InfixOp.add ~(| M.var (| "k" |), M.var_access (| "t7", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |))] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |))] |) |)) ]] in - do~ M.substitute_var "t2" [[ InfixOp.mul ~(| M.var (| "t" |), M.var (| "t" |) |) ]] in - do~ M.substitute_var "t4" [[ InfixOp.mul ~(| M.var_access (| "t2", [Access.Array (M.var (| "i" |))] |), M.var_access (| "t2", [Access.Array (M.var (| "i" |))] |) |) ]] in - do~ M.substitute_var "t6" [[ InfixOp.mul ~(| M.var_access (| "t4", [Access.Array (M.var (| "i" |))] |), M.var_access (| "t2", [Access.Array (M.var (| "i" |))] |) |) ]] in + do~ M.substitute_var "t" [] [[ ternary_expression (InfixOp.eq ~(| M.var (| "i" |), 0 |)) (InfixOp.add ~(| M.var (| "k" |), M.var (| "x_in" |) |)) (InfixOp.add ~(| InfixOp.add ~(| M.var (| "k" |), M.var_access (| "t7", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |))] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |))] |) |)) ]] in + do~ M.substitute_var "t2" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| M.var (| "t" |), M.var (| "t" |) |) ]] in + do~ M.substitute_var "t4" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| M.var_access (| "t2", [Access.Array (M.var (| "i" |))] |), M.var_access (| "t2", [Access.Array (M.var (| "i" |))] |) |) ]] in + do~ M.substitute_var "t6" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| M.var_access (| "t4", [Access.Array (M.var (| "i" |))] |), M.var_access (| "t2", [Access.Array (M.var (| "i" |))] |) |) ]] in do~ M.if_ [[ InfixOp.lesser ~(| M.var (| "i" |), InfixOp.sub ~(| M.var (| "nrounds" |), 1 |) |) ]] (* then *) ( - do~ M.substitute_var "t7" [[ InfixOp.mul ~(| M.var_access (| "t6", [Access.Array (M.var (| "i" |))] |), M.var (| "t" |) |) ]] in + do~ M.substitute_var "t7" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| M.var_access (| "t6", [Access.Array (M.var (| "i" |))] |), M.var (| "t" |) |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "out" [[ InfixOp.add ~(| InfixOp.mul ~(| M.var_access (| "t6", [Access.Array (M.var (| "i" |))] |), M.var (| "t" |) |), M.var (| "k" |) |) ]] in + do~ M.substitute_var "out" [] [[ InfixOp.add ~(| InfixOp.mul ~(| M.var_access (| "t6", [Access.Array (M.var (| "i" |))] |), M.var (| "t" |) |), M.var (| "k" |) |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt @@ -85,34 +96,42 @@ Module MultiMiMC7Signals. (* Intermediate *) r : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | k : P _ k "k" + | out : P _ out "out" + | r : P _ r "r". + End IsNamed. End MultiMiMC7Signals. (* Template body *) Definition MultiMiMC7 (nInputs nRounds : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("nInputs", nInputs); ("nRounds", nRounds)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ M.var (| "nInputs" |) ] ]] in + do~ M.declare_signal "in" in (* Signal Input *) - do~ M.declare_signal "k" [[ ([] : list F.t) ]] in + do~ M.declare_signal "k" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Signal Intermediate *) - do~ M.declare_signal "r" [[ [ InfixOp.add ~(| M.var (| "nInputs" |), 1 |) ] ]] in + do~ M.declare_signal "r" in (* Component *) do~ M.declare_component "mims" in - do~ M.substitute_var "r" [[ M.var (| "k" |) ]] in + do~ M.substitute_var "r" [Access.Array (0)] [[ M.var (| "k" |) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "nInputs" |) |) ]] ( - do~ M.substitute_var "mims" [[ M.call_function ~(| "MiMC7", [ M.var (| "nRounds" |) ] |) ]] in - do~ M.substitute_var "mims" [[ M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "mims" [[ M.var_access (| "r", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "r" [[ InfixOp.add ~(| InfixOp.add ~(| M.var_access (| "r", [Access.Array (M.var (| "i" |))] |), M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "mims", [Access.Array (M.var (| "i" |)); Access.Component "out"] |) |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mims" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "MiMC7", [ M.var (| "nRounds" |) ] |) ]] in + do~ M.substitute_var "mims" [Access.Array (M.var (| "i" |)); Access.Component "x_in"] [[ M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "mims" [Access.Array (M.var (| "i" |)); Access.Component "k"] [[ M.var_access (| "r", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "r" [Access.Array (InfixOp.add ~(| M.var (| "i" |), 1 |))] [[ InfixOp.add ~(| InfixOp.add ~(| M.var_access (| "r", [Access.Array (M.var (| "i" |))] |), M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "mims", [Access.Array (M.var (| "i" |)); Access.Component "out"] |) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "r", [Access.Array (M.var (| "nInputs" |))] |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "r", [Access.Array (M.var (| "nInputs" |))] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/mimcsponge.v b/Garden/Circom/Circomlib/translation/circuits/mimcsponge.v index f59c0dd..7eac6de 100644 --- a/Garden/Circom/Circomlib/translation/circuits/mimcsponge.v +++ b/Garden/Circom/Circomlib/translation/circuits/mimcsponge.v @@ -11,47 +11,54 @@ Module MiMCSpongeSignals. (* Output *) outs : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | ins : P _ ins "ins" + | k : P _ k "k" + | outs : P _ outs "outs". + End IsNamed. End MiMCSpongeSignals. (* Template body *) Definition MiMCSponge (nInputs nRounds nOutputs : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("nInputs", nInputs); ("nRounds", nRounds); ("nOutputs", nOutputs)] ( (* Signal Input *) - do~ M.declare_signal "ins" [[ [ M.var (| "nInputs" |) ] ]] in + do~ M.declare_signal "ins" in (* Signal Input *) - do~ M.declare_signal "k" [[ ([] : list F.t) ]] in + do~ M.declare_signal "k" in (* Signal Output *) - do~ M.declare_signal "outs" [[ [ M.var (| "nOutputs" |) ] ]] in + do~ M.declare_signal "outs" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Component *) do~ M.declare_component "S" in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "nInputs" |) |) ]] ( - do~ M.substitute_var "S" [[ M.call_function ~(| "MiMCFeistel", [ M.var (| "nRounds" |) ] |) ]] in - do~ M.substitute_var "S" [[ M.var (| "k" |) ]] in + do~ M.substitute_var "S" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "MiMCFeistel", [ M.var (| "nRounds" |) ] |) ]] in + do~ M.substitute_var "S" [Access.Array (M.var (| "i" |)); Access.Component "k"] [[ M.var (| "k" |) ]] in do~ M.if_ [[ InfixOp.eq ~(| M.var (| "i" |), 0 |) ]] (* then *) ( - do~ M.substitute_var "S" [[ M.var_access (| "ins", [Access.Array (0)] |) ]] in - do~ M.substitute_var "S" [[ 0 ]] in + do~ M.substitute_var "S" [Access.Array (M.var (| "i" |)); Access.Component "xL_in"] [[ M.var_access (| "ins", [Access.Array (0)] |) ]] in + do~ M.substitute_var "S" [Access.Array (M.var (| "i" |)); Access.Component "xR_in"] [[ 0 ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "S" [[ InfixOp.add ~(| M.var_access (| "S", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "xL_out"] |), M.var_access (| "ins", [Access.Array (M.var (| "i" |))] |) |) ]] in - do~ M.substitute_var "S" [[ M.var_access (| "S", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "xR_out"] |) ]] in + do~ M.substitute_var "S" [Access.Array (M.var (| "i" |)); Access.Component "xL_in"] [[ InfixOp.add ~(| M.var_access (| "S", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "xL_out"] |), M.var_access (| "ins", [Access.Array (M.var (| "i" |))] |) |) ]] in + do~ M.substitute_var "S" [Access.Array (M.var (| "i" |)); Access.Component "xR_in"] [[ M.var_access (| "S", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "xR_out"] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "outs" [[ M.var_access (| "S", [Access.Array (InfixOp.sub ~(| M.var (| "nInputs" |), 1 |)); Access.Component "xL_out"] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "outs" [Access.Array (0)] [[ M.var_access (| "S", [Access.Array (InfixOp.sub ~(| M.var (| "nInputs" |), 1 |)); Access.Component "xL_out"] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), InfixOp.sub ~(| M.var (| "nOutputs" |), 1 |) |) ]] ( - do~ M.substitute_var "S" [[ M.call_function ~(| "MiMCFeistel", [ M.var (| "nRounds" |) ] |) ]] in - do~ M.substitute_var "S" [[ M.var (| "k" |) ]] in - do~ M.substitute_var "S" [[ M.var_access (| "S", [Access.Array (InfixOp.sub ~(| InfixOp.add ~(| M.var (| "nInputs" |), M.var (| "i" |) |), 1 |)); Access.Component "xL_out"] |) ]] in - do~ M.substitute_var "S" [[ M.var_access (| "S", [Access.Array (InfixOp.sub ~(| InfixOp.add ~(| M.var (| "nInputs" |), M.var (| "i" |) |), 1 |)); Access.Component "xR_out"] |) ]] in - do~ M.substitute_var "outs" [[ M.var_access (| "S", [Access.Array (InfixOp.add ~(| M.var (| "nInputs" |), M.var (| "i" |) |)); Access.Component "xL_out"] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "S" [Access.Array (InfixOp.add ~(| M.var (| "nInputs" |), M.var (| "i" |) |))] [[ M.call_function ~(| "MiMCFeistel", [ M.var (| "nRounds" |) ] |) ]] in + do~ M.substitute_var "S" [Access.Array (InfixOp.add ~(| M.var (| "nInputs" |), M.var (| "i" |) |)); Access.Component "k"] [[ M.var (| "k" |) ]] in + do~ M.substitute_var "S" [Access.Array (InfixOp.add ~(| M.var (| "nInputs" |), M.var (| "i" |) |)); Access.Component "xL_in"] [[ M.var_access (| "S", [Access.Array (InfixOp.sub ~(| InfixOp.add ~(| M.var (| "nInputs" |), M.var (| "i" |) |), 1 |)); Access.Component "xL_out"] |) ]] in + do~ M.substitute_var "S" [Access.Array (InfixOp.add ~(| M.var (| "nInputs" |), M.var (| "i" |) |)); Access.Component "xR_in"] [[ M.var_access (| "S", [Access.Array (InfixOp.sub ~(| InfixOp.add ~(| M.var (| "nInputs" |), M.var (| "i" |) |), 1 |)); Access.Component "xR_out"] |) ]] in + do~ M.substitute_var "outs" [Access.Array (InfixOp.add ~(| M.var (| "i" |), 1 |))] [[ M.var_access (| "S", [Access.Array (InfixOp.add ~(| M.var (| "nInputs" |), M.var (| "i" |) |)); Access.Component "xL_out"] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt @@ -85,66 +92,79 @@ Module MiMCFeistelSignals. (* Intermediate *) xR : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | xL_in : P _ xL_in "xL_in" + | xR_in : P _ xR_in "xR_in" + | k : P _ k "k" + | xL_out : P _ xL_out "xL_out" + | xR_out : P _ xR_out "xR_out" + | t2 : P _ t2 "t2" + | t4 : P _ t4 "t4" + | xL : P _ xL "xL" + | xR : P _ xR "xR". + End IsNamed. End MiMCFeistelSignals. (* Template body *) Definition MiMCFeistel (nrounds : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("nrounds", nrounds)] ( (* Signal Input *) - do~ M.declare_signal "xL_in" [[ ([] : list F.t) ]] in + do~ M.declare_signal "xL_in" in (* Signal Input *) - do~ M.declare_signal "xR_in" [[ ([] : list F.t) ]] in + do~ M.declare_signal "xR_in" in (* Signal Input *) - do~ M.declare_signal "k" [[ ([] : list F.t) ]] in + do~ M.declare_signal "k" in (* Signal Output *) - do~ M.declare_signal "xL_out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "xL_out" in (* Signal Output *) - do~ M.declare_signal "xR_out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "xR_out" in (* Var *) do~ M.declare_var "c_partial" [[ [ 218 ] ]] in - do~ M.substitute_var "c_partial" [[ array_with_repeat (0) (218) ]] in - do~ M.substitute_var "c_partial" [[ [ 7120861356467848435263064379192047478074060781135320967663101236819528304084; 5024705281721889198577876690145313457398658950011302225525409148828000436681; 17980351014018068290387269214713820287804403312720763401943303895585469787384; 19886576439381707240399940949310933992335779767309383709787331470398675714258; 1213715278223786725806155661738676903520350859678319590331207960381534602599; 18162138253399958831050545255414688239130588254891200470934232514682584734511; 7667462281466170157858259197976388676420847047604921256361474169980037581876; 7207551498477838452286210989212982851118089401128156132319807392460388436957; 9864183311657946807255900203841777810810224615118629957816193727554621093838; 4798196928559910300796064665904583125427459076060519468052008159779219347957; 17387238494588145257484818061490088963673275521250153686214197573695921400950; 10005334761930299057035055370088813230849810566234116771751925093634136574742; 11897542014760736209670863723231849628230383119798486487899539017466261308762; 16771780563523793011283273687253985566177232886900511371656074413362142152543; 749264854018824809464168489785113337925400687349357088413132714480582918506; 3683645737503705042628598550438395339383572464204988015434959428676652575331; 7556750851783822914673316211129907782679509728346361368978891584375551186255; 20391289379084797414557439284689954098721219201171527383291525676334308303023; 18146517657445423462330854383025300323335289319277199154920964274562014376193; 8080173465267536232534446836148661251987053305394647905212781979099916615292; 10796443006899450245502071131975731672911747129805343722228413358507805531141; 5404287610364961067658660283245291234008692303120470305032076412056764726509; 4623894483395123520243967718315330178025957095502546813929290333264120223168; 16845753148201777192406958674202574751725237939980634861948953189320362207797; 4622170486584704769521001011395820886029808520586507873417553166762370293671; 16688277490485052681847773549197928630624828392248424077804829676011512392564; 11878652861183667748838188993669912629573713271883125458838494308957689090959; 2436445725746972287496138382764643208791713986676129260589667864467010129482; 1888098689545151571063267806606510032698677328923740058080630641742325067877; 148924106504065664829055598316821983869409581623245780505601526786791681102; 18875020877782404439294079398043479420415331640996249745272087358069018086569; 15189693413320228845990326214136820307649565437237093707846682797649429515840; 19669450123472657781282985229369348220906547335081730205028099210442632534079; 5521922218264623411380547905210139511350706092570900075727555783240701821773; 4144769320246558352780591737261172907511489963810975650573703217887429086546; 10097732913112662248360143041019433907849917041759137293018029019134392559350; 1720059427972723034107765345743336447947522473310069975142483982753181038321; 6302388219880227251325608388535181451187131054211388356563634768253301290116; 6745410632962119604799318394592010194450845483518862700079921360015766217097; 10858157235265583624235850660462324469799552996870780238992046963007491306222; 20241898894740093733047052816576694435372877719072347814065227797906130857593; 10165780782761211520836029617746977303303335603838343292431760011576528327409; 2832093654883670345969792724123161241696170611611744759675180839473215203706; 153011722355526826233082383360057587249818749719433916258246100068258954737; 20196970640587451358539129330170636295243141659030208529338914906436009086943; 3180973917010545328313139835982464870638521890385603025657430208141494469656; 17198004293191777441573635123110935015228014028618868252989374962722329283022; 7642160509228669138628515458941659189680509753651629476399516332224325757132; 19346204940546791021518535594447257347218878114049998691060016493806845179755; 11501810868606870391127866188394535330696206817602260610801897042898616817272; 3113973447392053821824427670386252797811804954746053461397972968381571297505; 6545064306297957002139416752334741502722251869537551068239642131448768236585; 5203908808704813498389265425172875593837960384349653691918590736979872578408; 2246692432011290582160062129070762007374502637007107318105405626910313810224; 11760570435432189127645691249600821064883781677693087773459065574359292849137; 5543749482491340532547407723464609328207990784853381797689466144924198391839; 8837549193990558762776520822018694066937602576881497343584903902880277769302; 12855514863299373699594410385788943772765811961581749194183533625311486462501; 5363660674689121676875069134269386492382220935599781121306637800261912519729; 13162342403579303950549728848130828093497701266240457479693991108217307949435; 916941639326869583414469202910306428966657806899788970948781207501251816730; 15618589556584434434009868216186115416835494805174158488636000580759692174228; 8959562060028569701043973060670353733575345393653685776974948916988033453971; 16390754464333401712265575949874369157699293840516802426621216808905079127650; 168282396747788514908709091757591226095443902501365500003618183905496160435; 8327443473179334761744301768309008451162322941906921742120510244986704677004; 17213012626801210615058753489149961717422101711567228037597150941152495100640; 10394369641533736715250242399198097296122982486516256408681925424076248952280; 17784386835392322654196171115293700800825771210400152504776806618892170162248; 16533189939837087893364000390641148516479148564190420358849587959161226782982; 18725396114211370207078434315900726338547621160475533496863298091023511945076; 7132325028834551397904855671244375895110341505383911719294705267624034122405; 148317947440800089795933930720822493695520852448386394775371401743494965187; 19001050671757720352890779127693793630251266879994702723636759889378387053056; 18824274411769830274877839365728651108434404855803844568234862945613766611460; 12771414330193951156383998390424063470766226667986423961689712557338777174205; 11332046574800279729678603488745295198038913503395629790213378101166488244657; 9607550223176946388146938069307456967842408600269548190739947540821716354749; 8756385288462344550200229174435953103162307705310807828651304665320046782583; 176061952957067086877570020242717222844908281373122372938833890096257042779; 12200212977482648306758992405065921724409841940671166017620928947866825250857; 10868453624107875516866146499877130701929063632959660262366632833504750028858; 2016095394399807253596787752134573207202567875457560571095586743878953450738; 21815578223768330433802113452339488275704145896544481092014911825656390567514; 4923772847693564777744725640710197015181591950368494148029046443433103381621; 1813584943682214789802230765734821149202472893379265320098816901270224589984; 10810123816265612772922113403831964815724109728287572256602010709288980656498; 1153669123397255702524721206511185557982017410156956216465120456256288427021; 5007518659266430200134478928344522649876467369278722765097865662497773767152; 2511432546938591792036639990606464315121646668029252285288323664350666551637; 32883284540320451295484135704808083452381176816565850047310272290579727564; 10484856914279112612610993418405543310546746652738541161791501150994088679557; 2026733759645519472558796412979210009170379159866522399881566309631434814953; 14731806221235869882801331463708736361296174006732553130708107037190460654379; 14740327483193277147065845135561988641238516852487657117813536909482068950652; 18787428285295558781869865751953016580493190547148386433580291216673009884554; 3804047064713122820157099453648459188816376755739202017447862327783289895072; 16709604795697901641948603019242067672006293290826991671766611326262532802914; 11061717085931490100602849654034280576915102867237101935487893025907907250695; 2821730726367472966906149684046356272806484545281639696873240305052362149654; 17467794879902895769410571945152708684493991588672014763135370927880883292655; 1571520786233540988201616650622796363168031165456869481368085474420849243232; 10041051776251223165849354194892664881051125330236567356945669006147134614302; 3981753758468103976812813304477670033098707002886030847251581853700311567551; 4365864398105436789177703571412645548020537580493599380018290523813331678900; 2391801327305361293476178683853802679507598622000359948432171562543560193350; 214219368547551689972421167733597094823289857206402800635962137077096090722; 18192064100315141084242006659317257023098826945893371479835220462302399655674; 15487549757142039139328911515400805508248576685795694919457041092150651939253; 10142447197759703415402259672441315777933858467700579946665223821199077641122; 11246573086260753259993971254725613211193686683988426513880826148090811891866; 6574066859860991369704567902211886840188702386542112593710271426704432301235; 11311085442652291634822798307831431035776248927202286895207125867542470350078; 20977948360215259915441258687649465618185769343138135384346964466965010873779; 792781492853909872425531014397300057232399608769451037135936617996830018501; 5027602491523497423798779154966735896562099398367163998686335127580757861872; 14595204575654316237672764823862241845410365278802914304953002937313300553572; 13973538843621261113924259058427434053808430378163734641175100160836376897004; 16395063164993626722686882727042150241125309409717445381854913964674649318585; 8465768840047024550750516678171433288207841931251654898809033371655109266663; 21345603324471810861925019445720576814602636473739003852898308205213912255830; 21171984405852590343970239018692870799717057961108910523876770029017785940991; 10761027113757988230637066281488532903174559953630210849190212601991063767647; 6678298831065390834922566306988418588227382406175769592902974103663687992230; 4993662582188632374202316265508850988596880036291765531885657575099537176757; 18364168158495573675698600238443218434246806358811328083953887470513967121206; 3506345610354615013737144848471391553141006285964325596214723571988011984829; 248732676202643792226973868626360612151424823368345645514532870586234380100; 10090204501612803176317709245679152331057882187411777688746797044706063410969; 21297149835078365363970699581821844234354988617890041296044775371855432973500; 16729368143229828574342820060716366330476985824952922184463387490091156065099; 4467191506765339364971058668792642195242197133011672559453028147641428433293; 8677548159358013363291014307402600830078662555833653517843708051504582990832; 1022951765127126818581466247360193856197472064872288389992480993218645055345; 1888195070251580606973417065636430294417895423429240431595054184472931224452; 4221265384902749246920810956363310125115516771964522748896154428740238579824; 2825393571154632139467378429077438870179957021959813965940638905853993971879; 19171031072692942278056619599721228021635671304612437350119663236604712493093; 10780807212297131186617505517708903709488273075252405602261683478333331220733; 18230936781133176044598070768084230333433368654744509969087239465125979720995; 16901065971871379877929280081392692752968612240624985552337779093292740763381; 146494141603558321291767829522948454429758543710648402457451799015963102253; 2492729278659146790410698334997955258248120870028541691998279257260289595548; 2204224910006646535594933495262085193210692406133533679934843341237521233504; 16062117410185840274616925297332331018523844434907012275592638570193234893570; 5894928453677122829055071981254202951712129328678534592916926069506935491729; 4947482739415078212217504789923078546034438919537985740403824517728200332286; 16143265650645676880461646123844627780378251900510645261875867423498913438066; 397690828254561723549349897112473766901585444153303054845160673059519614409; 11272653598912269895509621181205395118899451234151664604248382803490621227687; 15566927854306879444693061574322104423426072650522411176731130806720753591030; 14222898219492484180162096141564251903058269177856173968147960855133048449557; 16690275395485630428127725067513114066329712673106153451801968992299636791385; 3667030990325966886479548860429670833692690972701471494757671819017808678584; 21280039024501430842616328642522421302481259067470872421086939673482530783142; 15895485136902450169492923978042129726601461603404514670348703312850236146328; 7733050956302327984762132317027414325566202380840692458138724610131603812560; 438123800976401478772659663183448617575635636575786782566035096946820525816; 814913922521637742587885320797606426167962526342166512693085292151314976633; 12368712287081330853637674140264759478736012797026621876924395982504369598764; 2494806857395134874309386694756263421445039103814920780777601708371037591569; 16101132301514338989512946061786320637179843435886825102406248183507106312877; 6252650284989960032925831409804233477770646333900692286731621844532438095656; 9277135875276787021836189566799935097400042171346561246305113339462708861695; 10493603554686607050979497281838644324893776154179810893893660722522945589063; 8673089750662709235894359384294076697329948991010184356091130382437645649279; 9558393272910366944245875920138649617479779893610128634419086981339060613250; 19012287860122586147374214541764572282814469237161122489573881644994964647218; 9783723818270121678386992630754842961728702994964214799008457449989291229500; 15550788416669474113213749561488122552422887538676036667630838378023479382689; 15016165746156232864069722572047169071786333815661109750860165034341572904221; 6506225705710197163670556961299945987488979904603689017479840649664564978574; 10796631184889302076168355684722130903785890709107732067446714470783437829037; 19871836214837460419845806980869387567383718044439891735114283113359312279540; 20871081766843466343749609089986071784031203517506781251203251608363835140622; 5100105771517691442278432864090229416166996183792075307747582375962855820797; 8777887112076272395250620301071581171386440850451972412060638225741125310886; 5300440870136391278944213332144327695659161151625757537632832724102670898756; 1205448543652932944633962232545707633928124666868453915721030884663332604536; 5542499997310181530432302492142574333860449305424174466698068685590909336771; 11028094245762332275225364962905938096659249161369092798505554939952525894293; 19187314764836593118404597958543112407224947638377479622725713735224279297009; 17047263688548829001253658727764731047114098556534482052135734487985276987385; 19914849528178967155534624144358541535306360577227460456855821557421213606310; 2929658084700714257515872921366736697080475676508114973627124569375444665664; 15092262360719700162343163278648422751610766427236295023221516498310468956361; 21578580340755653236050830649990190843552802306886938815497471545814130084980; 1258781501221760320019859066036073675029057285507345332959539295621677296991; 3819598418157732134449049289585680301176983019643974929528867686268702720163; 8653175945487997845203439345797943132543211416447757110963967501177317426221; 6614652990340435611114076169697104582524566019034036680161902142028967568142; 19212515502973904821995111796203064175854996071497099383090983975618035391558; 18664315914479294273286016871365663486061896605232511201418576829062292269769; 11498264615058604317482574216318586415670903094838791165247179252175768794889; 10814026414212439999107945133852431304483604215416531759535467355316227331774; 17566185590731088197064706533119299946752127014428399631467913813769853431107; 14016139747289624978792446847000951708158212463304817001882956166752906714332; 8242601581342441750402731523736202888792436665415852106196418942315563860366; 9244680976345080074252591214216060854998619670381671198295645618515047080988; 12216779172735125538689875667307129262237123728082657485828359100719208190116; 10702811721859145441471328511968332847175733707711670171718794132331147396634; 6479667912792222539919362076122453947926362746906450079329453150607427372979; 15117544653571553820496948522381772148324367479772362833334593000535648316185; 6842203153996907264167856337497139692895299874139131328642472698663046726780; 12732823292801537626009139514048596316076834307941224506504666470961250728055; 6936272626871035740815028148058841877090860312517423346335878088297448888663; 17297554111853491139852678417579991271009602631577069694853813331124433680030; 16641596134749940573104316021365063031319260205559553673368334842484345864859; 7400481189785154329569470986896455371037813715804007747228648863919991399081; 2273205422216987330510475127669563545720586464429614439716564154166712854048; 15162538063742142685306302282127534305212832649282186184583465569986719234456; 5628039096440332922248578319648483863204530861778160259559031331287721255522; 16085392195894691829567913404182676871326863890140775376809129785155092531260; 14227467863135365427954093998621993651369686288941275436795622973781503444257; 18224457394066545825553407391290108485121649197258948320896164404518684305122; 274945154732293792784580363548970818611304339008964723447672490026510689427; 11050822248291117548220126630860474473945266276626263036056336623671308219529; 2119542016932434047340813757208803962484943912710204325088879681995922344971 ] ]] in + do~ M.substitute_var "c_partial" [] [[ array_with_repeat (0) (218) ]] in + do~ M.substitute_var "c_partial" [] [[ [ 7120861356467848435263064379192047478074060781135320967663101236819528304084; 5024705281721889198577876690145313457398658950011302225525409148828000436681; 17980351014018068290387269214713820287804403312720763401943303895585469787384; 19886576439381707240399940949310933992335779767309383709787331470398675714258; 1213715278223786725806155661738676903520350859678319590331207960381534602599; 18162138253399958831050545255414688239130588254891200470934232514682584734511; 7667462281466170157858259197976388676420847047604921256361474169980037581876; 7207551498477838452286210989212982851118089401128156132319807392460388436957; 9864183311657946807255900203841777810810224615118629957816193727554621093838; 4798196928559910300796064665904583125427459076060519468052008159779219347957; 17387238494588145257484818061490088963673275521250153686214197573695921400950; 10005334761930299057035055370088813230849810566234116771751925093634136574742; 11897542014760736209670863723231849628230383119798486487899539017466261308762; 16771780563523793011283273687253985566177232886900511371656074413362142152543; 749264854018824809464168489785113337925400687349357088413132714480582918506; 3683645737503705042628598550438395339383572464204988015434959428676652575331; 7556750851783822914673316211129907782679509728346361368978891584375551186255; 20391289379084797414557439284689954098721219201171527383291525676334308303023; 18146517657445423462330854383025300323335289319277199154920964274562014376193; 8080173465267536232534446836148661251987053305394647905212781979099916615292; 10796443006899450245502071131975731672911747129805343722228413358507805531141; 5404287610364961067658660283245291234008692303120470305032076412056764726509; 4623894483395123520243967718315330178025957095502546813929290333264120223168; 16845753148201777192406958674202574751725237939980634861948953189320362207797; 4622170486584704769521001011395820886029808520586507873417553166762370293671; 16688277490485052681847773549197928630624828392248424077804829676011512392564; 11878652861183667748838188993669912629573713271883125458838494308957689090959; 2436445725746972287496138382764643208791713986676129260589667864467010129482; 1888098689545151571063267806606510032698677328923740058080630641742325067877; 148924106504065664829055598316821983869409581623245780505601526786791681102; 18875020877782404439294079398043479420415331640996249745272087358069018086569; 15189693413320228845990326214136820307649565437237093707846682797649429515840; 19669450123472657781282985229369348220906547335081730205028099210442632534079; 5521922218264623411380547905210139511350706092570900075727555783240701821773; 4144769320246558352780591737261172907511489963810975650573703217887429086546; 10097732913112662248360143041019433907849917041759137293018029019134392559350; 1720059427972723034107765345743336447947522473310069975142483982753181038321; 6302388219880227251325608388535181451187131054211388356563634768253301290116; 6745410632962119604799318394592010194450845483518862700079921360015766217097; 10858157235265583624235850660462324469799552996870780238992046963007491306222; 20241898894740093733047052816576694435372877719072347814065227797906130857593; 10165780782761211520836029617746977303303335603838343292431760011576528327409; 2832093654883670345969792724123161241696170611611744759675180839473215203706; 153011722355526826233082383360057587249818749719433916258246100068258954737; 20196970640587451358539129330170636295243141659030208529338914906436009086943; 3180973917010545328313139835982464870638521890385603025657430208141494469656; 17198004293191777441573635123110935015228014028618868252989374962722329283022; 7642160509228669138628515458941659189680509753651629476399516332224325757132; 19346204940546791021518535594447257347218878114049998691060016493806845179755; 11501810868606870391127866188394535330696206817602260610801897042898616817272; 3113973447392053821824427670386252797811804954746053461397972968381571297505; 6545064306297957002139416752334741502722251869537551068239642131448768236585; 5203908808704813498389265425172875593837960384349653691918590736979872578408; 2246692432011290582160062129070762007374502637007107318105405626910313810224; 11760570435432189127645691249600821064883781677693087773459065574359292849137; 5543749482491340532547407723464609328207990784853381797689466144924198391839; 8837549193990558762776520822018694066937602576881497343584903902880277769302; 12855514863299373699594410385788943772765811961581749194183533625311486462501; 5363660674689121676875069134269386492382220935599781121306637800261912519729; 13162342403579303950549728848130828093497701266240457479693991108217307949435; 916941639326869583414469202910306428966657806899788970948781207501251816730; 15618589556584434434009868216186115416835494805174158488636000580759692174228; 8959562060028569701043973060670353733575345393653685776974948916988033453971; 16390754464333401712265575949874369157699293840516802426621216808905079127650; 168282396747788514908709091757591226095443902501365500003618183905496160435; 8327443473179334761744301768309008451162322941906921742120510244986704677004; 17213012626801210615058753489149961717422101711567228037597150941152495100640; 10394369641533736715250242399198097296122982486516256408681925424076248952280; 17784386835392322654196171115293700800825771210400152504776806618892170162248; 16533189939837087893364000390641148516479148564190420358849587959161226782982; 18725396114211370207078434315900726338547621160475533496863298091023511945076; 7132325028834551397904855671244375895110341505383911719294705267624034122405; 148317947440800089795933930720822493695520852448386394775371401743494965187; 19001050671757720352890779127693793630251266879994702723636759889378387053056; 18824274411769830274877839365728651108434404855803844568234862945613766611460; 12771414330193951156383998390424063470766226667986423961689712557338777174205; 11332046574800279729678603488745295198038913503395629790213378101166488244657; 9607550223176946388146938069307456967842408600269548190739947540821716354749; 8756385288462344550200229174435953103162307705310807828651304665320046782583; 176061952957067086877570020242717222844908281373122372938833890096257042779; 12200212977482648306758992405065921724409841940671166017620928947866825250857; 10868453624107875516866146499877130701929063632959660262366632833504750028858; 2016095394399807253596787752134573207202567875457560571095586743878953450738; 21815578223768330433802113452339488275704145896544481092014911825656390567514; 4923772847693564777744725640710197015181591950368494148029046443433103381621; 1813584943682214789802230765734821149202472893379265320098816901270224589984; 10810123816265612772922113403831964815724109728287572256602010709288980656498; 1153669123397255702524721206511185557982017410156956216465120456256288427021; 5007518659266430200134478928344522649876467369278722765097865662497773767152; 2511432546938591792036639990606464315121646668029252285288323664350666551637; 32883284540320451295484135704808083452381176816565850047310272290579727564; 10484856914279112612610993418405543310546746652738541161791501150994088679557; 2026733759645519472558796412979210009170379159866522399881566309631434814953; 14731806221235869882801331463708736361296174006732553130708107037190460654379; 14740327483193277147065845135561988641238516852487657117813536909482068950652; 18787428285295558781869865751953016580493190547148386433580291216673009884554; 3804047064713122820157099453648459188816376755739202017447862327783289895072; 16709604795697901641948603019242067672006293290826991671766611326262532802914; 11061717085931490100602849654034280576915102867237101935487893025907907250695; 2821730726367472966906149684046356272806484545281639696873240305052362149654; 17467794879902895769410571945152708684493991588672014763135370927880883292655; 1571520786233540988201616650622796363168031165456869481368085474420849243232; 10041051776251223165849354194892664881051125330236567356945669006147134614302; 3981753758468103976812813304477670033098707002886030847251581853700311567551; 4365864398105436789177703571412645548020537580493599380018290523813331678900; 2391801327305361293476178683853802679507598622000359948432171562543560193350; 214219368547551689972421167733597094823289857206402800635962137077096090722; 18192064100315141084242006659317257023098826945893371479835220462302399655674; 15487549757142039139328911515400805508248576685795694919457041092150651939253; 10142447197759703415402259672441315777933858467700579946665223821199077641122; 11246573086260753259993971254725613211193686683988426513880826148090811891866; 6574066859860991369704567902211886840188702386542112593710271426704432301235; 11311085442652291634822798307831431035776248927202286895207125867542470350078; 20977948360215259915441258687649465618185769343138135384346964466965010873779; 792781492853909872425531014397300057232399608769451037135936617996830018501; 5027602491523497423798779154966735896562099398367163998686335127580757861872; 14595204575654316237672764823862241845410365278802914304953002937313300553572; 13973538843621261113924259058427434053808430378163734641175100160836376897004; 16395063164993626722686882727042150241125309409717445381854913964674649318585; 8465768840047024550750516678171433288207841931251654898809033371655109266663; 21345603324471810861925019445720576814602636473739003852898308205213912255830; 21171984405852590343970239018692870799717057961108910523876770029017785940991; 10761027113757988230637066281488532903174559953630210849190212601991063767647; 6678298831065390834922566306988418588227382406175769592902974103663687992230; 4993662582188632374202316265508850988596880036291765531885657575099537176757; 18364168158495573675698600238443218434246806358811328083953887470513967121206; 3506345610354615013737144848471391553141006285964325596214723571988011984829; 248732676202643792226973868626360612151424823368345645514532870586234380100; 10090204501612803176317709245679152331057882187411777688746797044706063410969; 21297149835078365363970699581821844234354988617890041296044775371855432973500; 16729368143229828574342820060716366330476985824952922184463387490091156065099; 4467191506765339364971058668792642195242197133011672559453028147641428433293; 8677548159358013363291014307402600830078662555833653517843708051504582990832; 1022951765127126818581466247360193856197472064872288389992480993218645055345; 1888195070251580606973417065636430294417895423429240431595054184472931224452; 4221265384902749246920810956363310125115516771964522748896154428740238579824; 2825393571154632139467378429077438870179957021959813965940638905853993971879; 19171031072692942278056619599721228021635671304612437350119663236604712493093; 10780807212297131186617505517708903709488273075252405602261683478333331220733; 18230936781133176044598070768084230333433368654744509969087239465125979720995; 16901065971871379877929280081392692752968612240624985552337779093292740763381; 146494141603558321291767829522948454429758543710648402457451799015963102253; 2492729278659146790410698334997955258248120870028541691998279257260289595548; 2204224910006646535594933495262085193210692406133533679934843341237521233504; 16062117410185840274616925297332331018523844434907012275592638570193234893570; 5894928453677122829055071981254202951712129328678534592916926069506935491729; 4947482739415078212217504789923078546034438919537985740403824517728200332286; 16143265650645676880461646123844627780378251900510645261875867423498913438066; 397690828254561723549349897112473766901585444153303054845160673059519614409; 11272653598912269895509621181205395118899451234151664604248382803490621227687; 15566927854306879444693061574322104423426072650522411176731130806720753591030; 14222898219492484180162096141564251903058269177856173968147960855133048449557; 16690275395485630428127725067513114066329712673106153451801968992299636791385; 3667030990325966886479548860429670833692690972701471494757671819017808678584; 21280039024501430842616328642522421302481259067470872421086939673482530783142; 15895485136902450169492923978042129726601461603404514670348703312850236146328; 7733050956302327984762132317027414325566202380840692458138724610131603812560; 438123800976401478772659663183448617575635636575786782566035096946820525816; 814913922521637742587885320797606426167962526342166512693085292151314976633; 12368712287081330853637674140264759478736012797026621876924395982504369598764; 2494806857395134874309386694756263421445039103814920780777601708371037591569; 16101132301514338989512946061786320637179843435886825102406248183507106312877; 6252650284989960032925831409804233477770646333900692286731621844532438095656; 9277135875276787021836189566799935097400042171346561246305113339462708861695; 10493603554686607050979497281838644324893776154179810893893660722522945589063; 8673089750662709235894359384294076697329948991010184356091130382437645649279; 9558393272910366944245875920138649617479779893610128634419086981339060613250; 19012287860122586147374214541764572282814469237161122489573881644994964647218; 9783723818270121678386992630754842961728702994964214799008457449989291229500; 15550788416669474113213749561488122552422887538676036667630838378023479382689; 15016165746156232864069722572047169071786333815661109750860165034341572904221; 6506225705710197163670556961299945987488979904603689017479840649664564978574; 10796631184889302076168355684722130903785890709107732067446714470783437829037; 19871836214837460419845806980869387567383718044439891735114283113359312279540; 20871081766843466343749609089986071784031203517506781251203251608363835140622; 5100105771517691442278432864090229416166996183792075307747582375962855820797; 8777887112076272395250620301071581171386440850451972412060638225741125310886; 5300440870136391278944213332144327695659161151625757537632832724102670898756; 1205448543652932944633962232545707633928124666868453915721030884663332604536; 5542499997310181530432302492142574333860449305424174466698068685590909336771; 11028094245762332275225364962905938096659249161369092798505554939952525894293; 19187314764836593118404597958543112407224947638377479622725713735224279297009; 17047263688548829001253658727764731047114098556534482052135734487985276987385; 19914849528178967155534624144358541535306360577227460456855821557421213606310; 2929658084700714257515872921366736697080475676508114973627124569375444665664; 15092262360719700162343163278648422751610766427236295023221516498310468956361; 21578580340755653236050830649990190843552802306886938815497471545814130084980; 1258781501221760320019859066036073675029057285507345332959539295621677296991; 3819598418157732134449049289585680301176983019643974929528867686268702720163; 8653175945487997845203439345797943132543211416447757110963967501177317426221; 6614652990340435611114076169697104582524566019034036680161902142028967568142; 19212515502973904821995111796203064175854996071497099383090983975618035391558; 18664315914479294273286016871365663486061896605232511201418576829062292269769; 11498264615058604317482574216318586415670903094838791165247179252175768794889; 10814026414212439999107945133852431304483604215416531759535467355316227331774; 17566185590731088197064706533119299946752127014428399631467913813769853431107; 14016139747289624978792446847000951708158212463304817001882956166752906714332; 8242601581342441750402731523736202888792436665415852106196418942315563860366; 9244680976345080074252591214216060854998619670381671198295645618515047080988; 12216779172735125538689875667307129262237123728082657485828359100719208190116; 10702811721859145441471328511968332847175733707711670171718794132331147396634; 6479667912792222539919362076122453947926362746906450079329453150607427372979; 15117544653571553820496948522381772148324367479772362833334593000535648316185; 6842203153996907264167856337497139692895299874139131328642472698663046726780; 12732823292801537626009139514048596316076834307941224506504666470961250728055; 6936272626871035740815028148058841877090860312517423346335878088297448888663; 17297554111853491139852678417579991271009602631577069694853813331124433680030; 16641596134749940573104316021365063031319260205559553673368334842484345864859; 7400481189785154329569470986896455371037813715804007747228648863919991399081; 2273205422216987330510475127669563545720586464429614439716564154166712854048; 15162538063742142685306302282127534305212832649282186184583465569986719234456; 5628039096440332922248578319648483863204530861778160259559031331287721255522; 16085392195894691829567913404182676871326863890140775376809129785155092531260; 14227467863135365427954093998621993651369686288941275436795622973781503444257; 18224457394066545825553407391290108485121649197258948320896164404518684305122; 274945154732293792784580363548970818611304339008964723447672490026510689427; 11050822248291117548220126630860474473945266276626263036056336623671308219529; 2119542016932434047340813757208803962484943912710204325088879681995922344971 ] ]] in (* Var *) do~ M.declare_var "t" [[ ([] : list F.t) ]] in - do~ M.substitute_var "t" [[ 0 ]] in + do~ M.substitute_var "t" [] [[ 0 ]] in (* Signal Intermediate *) - do~ M.declare_signal "t2" [[ [ M.var (| "nrounds" |) ] ]] in + do~ M.declare_signal "t2" in (* Signal Intermediate *) - do~ M.declare_signal "t4" [[ [ M.var (| "nrounds" |) ] ]] in + do~ M.declare_signal "t4" in (* Signal Intermediate *) - do~ M.declare_signal "xL" [[ [ InfixOp.sub ~(| M.var (| "nrounds" |), 1 |) ] ]] in + do~ M.declare_signal "xL" in (* Signal Intermediate *) - do~ M.declare_signal "xR" [[ [ InfixOp.sub ~(| M.var (| "nrounds" |), 1 |) ] ]] in + do~ M.declare_signal "xR" in (* Var *) do~ M.declare_var "c" [[ ([] : list F.t) ]] in - do~ M.substitute_var "c" [[ 0 ]] in + do~ M.substitute_var "c" [] [[ 0 ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "nrounds" |) |) ]] ( do~ M.if_ [[ InfixOp.boolOr ~(| InfixOp.eq ~(| M.var (| "i" |), 0 |), InfixOp.eq ~(| M.var (| "i" |), InfixOp.sub ~(| M.var (| "nrounds" |), 1 |) |) |) ]] (* then *) ( - do~ M.substitute_var "c" [[ 0 ]] in + do~ M.substitute_var "c" [] [[ 0 ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "c" [[ M.var_access (| "c_partial", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |))] |) ]] in + do~ M.substitute_var "c" [] [[ M.var_access (| "c_partial", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |))] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "t" [[ ternary_expression (InfixOp.eq ~(| M.var (| "i" |), 0 |)) (InfixOp.add ~(| M.var (| "k" |), M.var (| "xL_in" |) |)) (InfixOp.add ~(| InfixOp.add ~(| M.var (| "k" |), M.var_access (| "xL", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |))] |) |), M.var (| "c" |) |)) ]] in - do~ M.substitute_var "t2" [[ InfixOp.mul ~(| M.var (| "t" |), M.var (| "t" |) |) ]] in - do~ M.substitute_var "t4" [[ InfixOp.mul ~(| M.var_access (| "t2", [Access.Array (M.var (| "i" |))] |), M.var_access (| "t2", [Access.Array (M.var (| "i" |))] |) |) ]] in + do~ M.substitute_var "t" [] [[ ternary_expression (InfixOp.eq ~(| M.var (| "i" |), 0 |)) (InfixOp.add ~(| M.var (| "k" |), M.var (| "xL_in" |) |)) (InfixOp.add ~(| InfixOp.add ~(| M.var (| "k" |), M.var_access (| "xL", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |))] |) |), M.var (| "c" |) |)) ]] in + do~ M.substitute_var "t2" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| M.var (| "t" |), M.var (| "t" |) |) ]] in + do~ M.substitute_var "t4" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| M.var_access (| "t2", [Access.Array (M.var (| "i" |))] |), M.var_access (| "t2", [Access.Array (M.var (| "i" |))] |) |) ]] in do~ M.if_ [[ InfixOp.lesser ~(| M.var (| "i" |), InfixOp.sub ~(| M.var (| "nrounds" |), 1 |) |) ]] (* then *) ( (* Var *) do~ M.declare_var "aux" [[ ([] : list F.t) ]] in - do~ M.substitute_var "aux" [[ ternary_expression (InfixOp.eq ~(| M.var (| "i" |), 0 |)) (M.var (| "xR_in" |)) (M.var_access (| "xR", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |))] |)) ]] in - do~ M.substitute_var "xL" [[ InfixOp.add ~(| M.var (| "aux" |), InfixOp.mul ~(| M.var_access (| "t4", [Access.Array (M.var (| "i" |))] |), M.var (| "t" |) |) |) ]] in - do~ M.substitute_var "xR" [[ ternary_expression (InfixOp.eq ~(| M.var (| "i" |), 0 |)) (M.var (| "xL_in" |)) (M.var_access (| "xL", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |))] |)) ]] in + do~ M.substitute_var "aux" [] [[ ternary_expression (InfixOp.eq ~(| M.var (| "i" |), 0 |)) (M.var (| "xR_in" |)) (M.var_access (| "xR", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |))] |)) ]] in + do~ M.substitute_var "xL" [Access.Array (M.var (| "i" |))] [[ InfixOp.add ~(| M.var (| "aux" |), InfixOp.mul ~(| M.var_access (| "t4", [Access.Array (M.var (| "i" |))] |), M.var (| "t" |) |) |) ]] in + do~ M.substitute_var "xR" [Access.Array (M.var (| "i" |))] [[ ternary_expression (InfixOp.eq ~(| M.var (| "i" |), 0 |)) (M.var (| "xL_in" |)) (M.var_access (| "xL", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |))] |)) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "xR_out" [[ InfixOp.add ~(| M.var_access (| "xR", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |))] |), InfixOp.mul ~(| M.var_access (| "t4", [Access.Array (M.var (| "i" |))] |), M.var (| "t" |) |) |) ]] in - do~ M.substitute_var "xL_out" [[ M.var_access (| "xL", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |))] |) ]] in + do~ M.substitute_var "xR_out" [] [[ InfixOp.add ~(| M.var_access (| "xR", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |))] |), InfixOp.mul ~(| M.var_access (| "t4", [Access.Array (M.var (| "i" |))] |), M.var (| "t" |) |) |) ]] in + do~ M.substitute_var "xL_out" [] [[ M.var_access (| "xL", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |))] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt diff --git a/Garden/Circom/Circomlib/translation/circuits/montgomery.v b/Garden/Circom/Circomlib/translation/circuits/montgomery.v index f582e11..a29dbca 100644 --- a/Garden/Circom/Circomlib/translation/circuits/montgomery.v +++ b/Garden/Circom/Circomlib/translation/circuits/montgomery.v @@ -9,17 +9,23 @@ Module Edwards2MontgomerySignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End Edwards2MontgomerySignals. (* Template body *) Definition Edwards2Montgomery : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 2 ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in - do~ M.substitute_var "out" [[ InfixOp.div ~(| InfixOp.add ~(| 1, M.var_access (| "in", [Access.Array (1)] |) |), InfixOp.sub ~(| 1, M.var_access (| "in", [Access.Array (1)] |) |) |) ]] in - do~ M.substitute_var "out" [[ InfixOp.div ~(| M.var_access (| "out", [Access.Array (0)] |), M.var_access (| "in", [Access.Array (0)] |) |) ]] in + do~ M.declare_signal "out" in + do~ M.substitute_var "out" [Access.Array (0)] [[ InfixOp.div ~(| InfixOp.add ~(| 1, M.var_access (| "in", [Access.Array (1)] |) |), InfixOp.sub ~(| 1, M.var_access (| "in", [Access.Array (1)] |) |) |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ InfixOp.div ~(| M.var_access (| "out", [Access.Array (0)] |), M.var_access (| "in", [Access.Array (0)] |) |) ]] in do~ M.equality_constraint [[ InfixOp.mul ~(| M.var_access (| "out", [Access.Array (0)] |), InfixOp.sub ~(| 1, M.var_access (| "in", [Access.Array (1)] |) |) |) ]] [[ InfixOp.add ~(| 1, M.var_access (| "in", [Access.Array (1)] |) |) ]] @@ -45,17 +51,23 @@ Module Montgomery2EdwardsSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End Montgomery2EdwardsSignals. (* Template body *) Definition Montgomery2Edwards : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 2 ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in - do~ M.substitute_var "out" [[ InfixOp.div ~(| M.var_access (| "in", [Access.Array (0)] |), M.var_access (| "in", [Access.Array (1)] |) |) ]] in - do~ M.substitute_var "out" [[ InfixOp.div ~(| InfixOp.sub ~(| M.var_access (| "in", [Access.Array (0)] |), 1 |), InfixOp.add ~(| M.var_access (| "in", [Access.Array (0)] |), 1 |) |) ]] in + do~ M.declare_signal "out" in + do~ M.substitute_var "out" [Access.Array (0)] [[ InfixOp.div ~(| M.var_access (| "in", [Access.Array (0)] |), M.var_access (| "in", [Access.Array (1)] |) |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ InfixOp.div ~(| InfixOp.sub ~(| M.var_access (| "in", [Access.Array (0)] |), 1 |), InfixOp.add ~(| M.var_access (| "in", [Access.Array (0)] |), 1 |) |) ]] in do~ M.equality_constraint [[ InfixOp.mul ~(| M.var_access (| "out", [Access.Array (0)] |), M.var_access (| "in", [Access.Array (1)] |) |) ]] [[ M.var_access (| "in", [Access.Array (0)] |) ]] @@ -85,38 +97,46 @@ Module MontgomeryAddSignals. (* Intermediate *) lamda : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in1 : P _ in1 "in1" + | in2 : P _ in2 "in2" + | out : P _ out "out" + | lamda : P _ lamda "lamda". + End IsNamed. End MontgomeryAddSignals. (* Template body *) Definition MontgomeryAdd : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in1" [[ [ 2 ] ]] in + do~ M.declare_signal "in1" in (* Signal Input *) - do~ M.declare_signal "in2" [[ [ 2 ] ]] in + do~ M.declare_signal "in2" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "a" [[ ([] : list F.t) ]] in - do~ M.substitute_var "a" [[ 168700 ]] in + do~ M.substitute_var "a" [] [[ 168700 ]] in (* Var *) do~ M.declare_var "d" [[ ([] : list F.t) ]] in - do~ M.substitute_var "d" [[ 168696 ]] in + do~ M.substitute_var "d" [] [[ 168696 ]] in (* Var *) do~ M.declare_var "A" [[ ([] : list F.t) ]] in - do~ M.substitute_var "A" [[ InfixOp.div ~(| InfixOp.mul ~(| 2, InfixOp.add ~(| M.var (| "a" |), M.var (| "d" |) |) |), InfixOp.sub ~(| M.var (| "a" |), M.var (| "d" |) |) |) ]] in + do~ M.substitute_var "A" [] [[ InfixOp.div ~(| InfixOp.mul ~(| 2, InfixOp.add ~(| M.var (| "a" |), M.var (| "d" |) |) |), InfixOp.sub ~(| M.var (| "a" |), M.var (| "d" |) |) |) ]] in (* Var *) do~ M.declare_var "B" [[ ([] : list F.t) ]] in - do~ M.substitute_var "B" [[ InfixOp.div ~(| 4, InfixOp.sub ~(| M.var (| "a" |), M.var (| "d" |) |) |) ]] in + do~ M.substitute_var "B" [] [[ InfixOp.div ~(| 4, InfixOp.sub ~(| M.var (| "a" |), M.var (| "d" |) |) |) ]] in (* Signal Intermediate *) - do~ M.declare_signal "lamda" [[ ([] : list F.t) ]] in - do~ M.substitute_var "lamda" [[ InfixOp.div ~(| InfixOp.sub ~(| M.var_access (| "in2", [Access.Array (1)] |), M.var_access (| "in1", [Access.Array (1)] |) |), InfixOp.sub ~(| M.var_access (| "in2", [Access.Array (0)] |), M.var_access (| "in1", [Access.Array (0)] |) |) |) ]] in + do~ M.declare_signal "lamda" in + do~ M.substitute_var "lamda" [] [[ InfixOp.div ~(| InfixOp.sub ~(| M.var_access (| "in2", [Access.Array (1)] |), M.var_access (| "in1", [Access.Array (1)] |) |), InfixOp.sub ~(| M.var_access (| "in2", [Access.Array (0)] |), M.var_access (| "in1", [Access.Array (0)] |) |) |) ]] in do~ M.equality_constraint [[ InfixOp.mul ~(| M.var (| "lamda" |), InfixOp.sub ~(| M.var_access (| "in2", [Access.Array (0)] |), M.var_access (| "in1", [Access.Array (0)] |) |) |) ]] [[ InfixOp.sub ~(| M.var_access (| "in2", [Access.Array (1)] |), M.var_access (| "in1", [Access.Array (1)] |) |) ]] in - do~ M.substitute_var "out" [[ InfixOp.sub ~(| InfixOp.sub ~(| InfixOp.sub ~(| InfixOp.mul ~(| InfixOp.mul ~(| M.var (| "B" |), M.var (| "lamda" |) |), M.var (| "lamda" |) |), M.var (| "A" |) |), M.var_access (| "in1", [Access.Array (0)] |) |), M.var_access (| "in2", [Access.Array (0)] |) |) ]] in - do~ M.substitute_var "out" [[ InfixOp.sub ~(| InfixOp.mul ~(| M.var (| "lamda" |), InfixOp.sub ~(| M.var_access (| "in1", [Access.Array (0)] |), M.var_access (| "out", [Access.Array (0)] |) |) |), M.var_access (| "in1", [Access.Array (1)] |) |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ InfixOp.sub ~(| InfixOp.sub ~(| InfixOp.sub ~(| InfixOp.mul ~(| InfixOp.mul ~(| M.var (| "B" |), M.var (| "lamda" |) |), M.var (| "lamda" |) |), M.var (| "A" |) |), M.var_access (| "in1", [Access.Array (0)] |) |), M.var_access (| "in2", [Access.Array (0)] |) |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ InfixOp.sub ~(| InfixOp.mul ~(| M.var (| "lamda" |), InfixOp.sub ~(| M.var_access (| "in1", [Access.Array (0)] |), M.var_access (| "out", [Access.Array (0)] |) |) |), M.var_access (| "in1", [Access.Array (1)] |) |) ]] in M.pure BlockUnit.Tt ). @@ -139,39 +159,47 @@ Module MontgomeryDoubleSignals. (* Intermediate *) x1_2 : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out" + | lamda : P _ lamda "lamda" + | x1_2 : P _ x1_2 "x1_2". + End IsNamed. End MontgomeryDoubleSignals. (* Template body *) Definition MontgomeryDouble : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 2 ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "a" [[ ([] : list F.t) ]] in - do~ M.substitute_var "a" [[ 168700 ]] in + do~ M.substitute_var "a" [] [[ 168700 ]] in (* Var *) do~ M.declare_var "d" [[ ([] : list F.t) ]] in - do~ M.substitute_var "d" [[ 168696 ]] in + do~ M.substitute_var "d" [] [[ 168696 ]] in (* Var *) do~ M.declare_var "A" [[ ([] : list F.t) ]] in - do~ M.substitute_var "A" [[ InfixOp.div ~(| InfixOp.mul ~(| 2, InfixOp.add ~(| M.var (| "a" |), M.var (| "d" |) |) |), InfixOp.sub ~(| M.var (| "a" |), M.var (| "d" |) |) |) ]] in + do~ M.substitute_var "A" [] [[ InfixOp.div ~(| InfixOp.mul ~(| 2, InfixOp.add ~(| M.var (| "a" |), M.var (| "d" |) |) |), InfixOp.sub ~(| M.var (| "a" |), M.var (| "d" |) |) |) ]] in (* Var *) do~ M.declare_var "B" [[ ([] : list F.t) ]] in - do~ M.substitute_var "B" [[ InfixOp.div ~(| 4, InfixOp.sub ~(| M.var (| "a" |), M.var (| "d" |) |) |) ]] in + do~ M.substitute_var "B" [] [[ InfixOp.div ~(| 4, InfixOp.sub ~(| M.var (| "a" |), M.var (| "d" |) |) |) ]] in (* Signal Intermediate *) - do~ M.declare_signal "lamda" [[ ([] : list F.t) ]] in + do~ M.declare_signal "lamda" in (* Signal Intermediate *) - do~ M.declare_signal "x1_2" [[ ([] : list F.t) ]] in - do~ M.substitute_var "x1_2" [[ InfixOp.mul ~(| M.var_access (| "in", [Access.Array (0)] |), M.var_access (| "in", [Access.Array (0)] |) |) ]] in - do~ M.substitute_var "lamda" [[ InfixOp.div ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.mul ~(| 3, M.var (| "x1_2" |) |), InfixOp.mul ~(| InfixOp.mul ~(| 2, M.var (| "A" |) |), M.var_access (| "in", [Access.Array (0)] |) |) |), 1 |), InfixOp.mul ~(| InfixOp.mul ~(| 2, M.var (| "B" |) |), M.var_access (| "in", [Access.Array (1)] |) |) |) ]] in + do~ M.declare_signal "x1_2" in + do~ M.substitute_var "x1_2" [] [[ InfixOp.mul ~(| M.var_access (| "in", [Access.Array (0)] |), M.var_access (| "in", [Access.Array (0)] |) |) ]] in + do~ M.substitute_var "lamda" [] [[ InfixOp.div ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.mul ~(| 3, M.var (| "x1_2" |) |), InfixOp.mul ~(| InfixOp.mul ~(| 2, M.var (| "A" |) |), M.var_access (| "in", [Access.Array (0)] |) |) |), 1 |), InfixOp.mul ~(| InfixOp.mul ~(| 2, M.var (| "B" |) |), M.var_access (| "in", [Access.Array (1)] |) |) |) ]] in do~ M.equality_constraint [[ InfixOp.mul ~(| M.var (| "lamda" |), InfixOp.mul ~(| InfixOp.mul ~(| 2, M.var (| "B" |) |), M.var_access (| "in", [Access.Array (1)] |) |) |) ]] [[ InfixOp.add ~(| InfixOp.add ~(| InfixOp.mul ~(| 3, M.var (| "x1_2" |) |), InfixOp.mul ~(| InfixOp.mul ~(| 2, M.var (| "A" |) |), M.var_access (| "in", [Access.Array (0)] |) |) |), 1 |) ]] in - do~ M.substitute_var "out" [[ InfixOp.sub ~(| InfixOp.sub ~(| InfixOp.mul ~(| InfixOp.mul ~(| M.var (| "B" |), M.var (| "lamda" |) |), M.var (| "lamda" |) |), M.var (| "A" |) |), InfixOp.mul ~(| 2, M.var_access (| "in", [Access.Array (0)] |) |) |) ]] in - do~ M.substitute_var "out" [[ InfixOp.sub ~(| InfixOp.mul ~(| M.var (| "lamda" |), InfixOp.sub ~(| M.var_access (| "in", [Access.Array (0)] |), M.var_access (| "out", [Access.Array (0)] |) |) |), M.var_access (| "in", [Access.Array (1)] |) |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ InfixOp.sub ~(| InfixOp.sub ~(| InfixOp.mul ~(| InfixOp.mul ~(| M.var (| "B" |), M.var (| "lamda" |) |), M.var (| "lamda" |) |), M.var (| "A" |) |), InfixOp.mul ~(| 2, M.var_access (| "in", [Access.Array (0)] |) |) |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ InfixOp.sub ~(| InfixOp.mul ~(| M.var (| "lamda" |), InfixOp.sub ~(| M.var_access (| "in", [Access.Array (0)] |), M.var_access (| "out", [Access.Array (0)] |) |) |), M.var_access (| "in", [Access.Array (1)] |) |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/multiplexer.v b/Garden/Circom/Circomlib/translation/circuits/multiplexer.v index 548627b..c562d6f 100644 --- a/Garden/Circom/Circomlib/translation/circuits/multiplexer.v +++ b/Garden/Circom/Circomlib/translation/circuits/multiplexer.v @@ -13,32 +13,40 @@ Module EscalarProductSignals. (* Intermediate *) aux : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in1 : P _ in1 "in1" + | in2 : P _ in2 "in2" + | out : P _ out "out" + | aux : P _ aux "aux". + End IsNamed. End EscalarProductSignals. (* Template body *) Definition EscalarProduct (w : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("w", w)] ( (* Signal Input *) - do~ M.declare_signal "in1" [[ [ M.var (| "w" |) ] ]] in + do~ M.declare_signal "in1" in (* Signal Input *) - do~ M.declare_signal "in2" [[ [ M.var (| "w" |) ] ]] in + do~ M.declare_signal "in2" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Signal Intermediate *) - do~ M.declare_signal "aux" [[ [ M.var (| "w" |) ] ]] in + do~ M.declare_signal "aux" in (* Var *) do~ M.declare_var "lc" [[ ([] : list F.t) ]] in - do~ M.substitute_var "lc" [[ 0 ]] in + do~ M.substitute_var "lc" [] [[ 0 ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "w" |) |) ]] ( - do~ M.substitute_var "aux" [[ InfixOp.mul ~(| M.var_access (| "in1", [Access.Array (M.var (| "i" |))] |), M.var_access (| "in2", [Access.Array (M.var (| "i" |))] |) |) ]] in - do~ M.substitute_var "lc" [[ InfixOp.add ~(| M.var (| "lc" |), M.var_access (| "aux", [Access.Array (M.var (| "i" |))] |) |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "aux" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| M.var_access (| "in1", [Access.Array (M.var (| "i" |))] |), M.var_access (| "in2", [Access.Array (M.var (| "i" |))] |) |) ]] in + do~ M.substitute_var "lc" [] [[ InfixOp.add ~(| M.var (| "lc" |), M.var_access (| "aux", [Access.Array (M.var (| "i" |))] |) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var (| "lc" |) ]] in + do~ M.substitute_var "out" [] [[ M.var (| "lc" |) ]] in M.pure BlockUnit.Tt ). @@ -59,34 +67,41 @@ Module DecoderSignals. (* Output *) success : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | inp : P _ inp "inp" + | out : P _ out "out" + | success : P _ success "success". + End IsNamed. End DecoderSignals. (* Template body *) Definition Decoder (w : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("w", w)] ( (* Signal Input *) - do~ M.declare_signal "inp" [[ ([] : list F.t) ]] in + do~ M.declare_signal "inp" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ M.var (| "w" |) ] ]] in + do~ M.declare_signal "out" in (* Signal Output *) - do~ M.declare_signal "success" [[ ([] : list F.t) ]] in + do~ M.declare_signal "success" in (* Var *) do~ M.declare_var "lc" [[ ([] : list F.t) ]] in - do~ M.substitute_var "lc" [[ 0 ]] in + do~ M.substitute_var "lc" [] [[ 0 ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "w" |) |) ]] ( - do~ M.substitute_var "out" [[ ternary_expression (InfixOp.eq ~(| M.var (| "inp" |), M.var (| "i" |) |)) (1) (0) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |))] [[ ternary_expression (InfixOp.eq ~(| M.var (| "inp" |), M.var (| "i" |) |)) (1) (0) ]] in do~ M.equality_constraint [[ InfixOp.mul ~(| M.var_access (| "out", [Access.Array (M.var (| "i" |))] |), InfixOp.sub ~(| M.var (| "inp" |), M.var (| "i" |) |) |) ]] [[ 0 ]] in - do~ M.substitute_var "lc" [[ InfixOp.add ~(| M.var (| "lc" |), M.var_access (| "out", [Access.Array (M.var (| "i" |))] |) |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "lc" [] [[ InfixOp.add ~(| M.var (| "lc" |), M.var_access (| "out", [Access.Array (M.var (| "i" |))] |) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "success" [[ M.var (| "lc" |) ]] in + do~ M.substitute_var "success" [] [[ M.var (| "lc" |) ]] in do~ M.equality_constraint [[ InfixOp.mul ~(| M.var (| "success" |), InfixOp.sub ~(| M.var (| "success" |), 1 |) |) ]] [[ 0 ]] @@ -110,46 +125,53 @@ Module MultiplexerSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | inp : P _ inp "inp" + | sel : P _ sel "sel" + | out : P _ out "out". + End IsNamed. End MultiplexerSignals. (* Template body *) Definition Multiplexer (wIn nIn : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("wIn", wIn); ("nIn", nIn)] ( (* Signal Input *) - do~ M.declare_signal "inp" [[ [ M.var (| "nIn" |); M.var (| "wIn" |) ] ]] in + do~ M.declare_signal "inp" in (* Signal Input *) - do~ M.declare_signal "sel" [[ ([] : list F.t) ]] in + do~ M.declare_signal "sel" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ M.var (| "wIn" |) ] ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "dec" in - do~ M.substitute_var "dec" [[ M.call_function ~(| "Decoder", [ M.var (| "nIn" |) ] |) ]] in + do~ M.substitute_var "dec" [] [[ M.call_function ~(| "Decoder", [ M.var (| "nIn" |) ] |) ]] in (* Component *) do~ M.declare_component "ep" in (* Var *) do~ M.declare_var "k" [[ ([] : list F.t) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), M.var (| "wIn" |) |) ]] ( - do~ M.substitute_var "ep" [[ M.call_function ~(| "EscalarProduct", [ M.var (| "nIn" |) ] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "ep" [Access.Array (M.var (| "k" |))] [[ M.call_function ~(| "EscalarProduct", [ M.var (| "nIn" |) ] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "dec" [[ M.var (| "sel" |) ]] in + do~ M.substitute_var "dec" [Access.Component "inp"] [[ M.var (| "sel" |) ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "wIn" |) |) ]] ( (* Var *) do~ M.declare_var "k" [[ ([] : list F.t) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), M.var (| "nIn" |) |) ]] ( - do~ M.substitute_var "ep" [[ M.var_access (| "inp", [Access.Array (M.var (| "k" |)); Access.Array (M.var (| "j" |))] |) ]] in - do~ M.substitute_var "ep" [[ M.var_access (| "dec", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "ep" [Access.Array (M.var (| "j" |)); Access.Component "in1"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "inp", [Access.Array (M.var (| "k" |)); Access.Array (M.var (| "j" |))] |) ]] in + do~ M.substitute_var "ep" [Access.Array (M.var (| "j" |)); Access.Component "in2"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "dec", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "ep", [Access.Array (M.var (| "j" |)); Access.Component "out"] |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "j" |))] [[ M.var_access (| "ep", [Access.Array (M.var (| "j" |)); Access.Component "out"] |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.equality_constraint diff --git a/Garden/Circom/Circomlib/translation/circuits/mux1.v b/Garden/Circom/Circomlib/translation/circuits/mux1.v index 2083f9e..0921d3d 100644 --- a/Garden/Circom/Circomlib/translation/circuits/mux1.v +++ b/Garden/Circom/Circomlib/translation/circuits/mux1.v @@ -11,23 +11,30 @@ Module MultiMux1Signals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | c : P _ c "c" + | s : P _ s "s" + | out : P _ out "out". + End IsNamed. End MultiMux1Signals. (* Template body *) Definition MultiMux1 (n : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n)] ( (* Signal Input *) - do~ M.declare_signal "c" [[ [ M.var (| "n" |); 2 ] ]] in + do~ M.declare_signal "c" in (* Signal Input *) - do~ M.declare_signal "s" [[ ([] : list F.t) ]] in + do~ M.declare_signal "s" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "n" |) |) ]] ( - do~ M.substitute_var "out" [[ InfixOp.add ~(| InfixOp.mul ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s" |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |))] [[ InfixOp.add ~(| InfixOp.mul ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s" |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt @@ -49,6 +56,13 @@ Module Mux1Signals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | c : P _ c "c" + | s : P _ s "s" + | out : P _ out "out". + End IsNamed. End Mux1Signals. (* Template body *) @@ -56,24 +70,24 @@ Definition Mux1 : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Signal Input *) - do~ M.declare_signal "c" [[ [ 2 ] ]] in + do~ M.declare_signal "c" in (* Signal Input *) - do~ M.declare_signal "s" [[ ([] : list F.t) ]] in + do~ M.declare_signal "s" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "mux" in - do~ M.substitute_var "mux" [[ M.call_function ~(| "MultiMux1", [ 1 ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "mux" [] [[ M.call_function ~(| "MultiMux1", [ 1 ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 2 |) ]] ( - do~ M.substitute_var "mux" [[ M.var_access (| "c", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (0); Access.Array (M.var (| "i" |))] [[ M.var_access (| "c", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "mux" [[ M.var (| "s" |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "mux", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "s"] [[ M.var (| "s" |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "mux", [Access.Component "out"; Access.Array (0)] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/mux2.v b/Garden/Circom/Circomlib/translation/circuits/mux2.v index a5e0429..49d79b1 100644 --- a/Garden/Circom/Circomlib/translation/circuits/mux2.v +++ b/Garden/Circom/Circomlib/translation/circuits/mux2.v @@ -21,38 +21,50 @@ Module MultiMux2Signals. (* Intermediate *) s10 : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | c : P _ c "c" + | s : P _ s "s" + | out : P _ out "out" + | a10 : P _ a10 "a10" + | a1 : P _ a1 "a1" + | a0 : P _ a0 "a0" + | a : P _ a "a" + | s10 : P _ s10 "s10". + End IsNamed. End MultiMux2Signals. (* Template body *) Definition MultiMux2 (n : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n)] ( (* Signal Input *) - do~ M.declare_signal "c" [[ [ M.var (| "n" |); 4 ] ]] in + do~ M.declare_signal "c" in (* Signal Input *) - do~ M.declare_signal "s" [[ [ 2 ] ]] in + do~ M.declare_signal "s" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "out" in (* Signal Intermediate *) - do~ M.declare_signal "a10" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a10" in (* Signal Intermediate *) - do~ M.declare_signal "a1" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a1" in (* Signal Intermediate *) - do~ M.declare_signal "a0" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a0" in (* Signal Intermediate *) - do~ M.declare_signal "a" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a" in (* Signal Intermediate *) - do~ M.declare_signal "s10" [[ ([] : list F.t) ]] in - do~ M.substitute_var "s10" [[ InfixOp.mul ~(| M.var_access (| "s", [Access.Array (1)] |), M.var_access (| "s", [Access.Array (0)] |) |) ]] in + do~ M.declare_signal "s10" in + do~ M.substitute_var "s10" [] [[ InfixOp.mul ~(| M.var_access (| "s", [Access.Array (1)] |), M.var_access (| "s", [Access.Array (0)] |) |) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "n" |) |) ]] ( - do~ M.substitute_var "a10" [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (3)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s10" |) |) ]] in - do~ M.substitute_var "a1" [[ InfixOp.mul ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (1)] |) |) ]] in - do~ M.substitute_var "a0" [[ InfixOp.mul ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (0)] |) |) ]] in - do~ M.substitute_var "a" [[ M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) ]] in - do~ M.substitute_var "out" [[ InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| M.var_access (| "a10", [Access.Array (M.var (| "i" |))] |), M.var_access (| "a1", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a0", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a", [Access.Array (M.var (| "i" |))] |) |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "a10" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (3)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s10" |) |) ]] in + do~ M.substitute_var "a1" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (1)] |) |) ]] in + do~ M.substitute_var "a0" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (0)] |) |) ]] in + do~ M.substitute_var "a" [Access.Array (M.var (| "i" |))] [[ M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |))] [[ InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| M.var_access (| "a10", [Access.Array (M.var (| "i" |))] |), M.var_access (| "a1", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a0", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a", [Access.Array (M.var (| "i" |))] |) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt @@ -75,6 +87,13 @@ Module Mux2Signals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | c : P _ c "c" + | s : P _ s "s" + | out : P _ out "out". + End IsNamed. End Mux2Signals. (* Template body *) @@ -82,29 +101,29 @@ Definition Mux2 : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Signal Input *) - do~ M.declare_signal "c" [[ [ 4 ] ]] in + do~ M.declare_signal "c" in (* Signal Input *) - do~ M.declare_signal "s" [[ [ 2 ] ]] in + do~ M.declare_signal "s" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "mux" in - do~ M.substitute_var "mux" [[ M.call_function ~(| "MultiMux2", [ 1 ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "mux" [] [[ M.call_function ~(| "MultiMux2", [ 1 ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 4 |) ]] ( - do~ M.substitute_var "mux" [[ M.var_access (| "c", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (0); Access.Array (M.var (| "i" |))] [[ M.var_access (| "c", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 2 |) ]] ( - do~ M.substitute_var "mux" [[ M.var_access (| "s", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mux" [Access.Component "s"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "s", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "mux", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "mux", [Access.Component "out"; Access.Array (0)] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/mux3.v b/Garden/Circom/Circomlib/translation/circuits/mux3.v index 218f708..0f1e402 100644 --- a/Garden/Circom/Circomlib/translation/circuits/mux3.v +++ b/Garden/Circom/Circomlib/translation/circuits/mux3.v @@ -29,50 +29,66 @@ Module MultiMux3Signals. (* Intermediate *) s10 : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | c : P _ c "c" + | s : P _ s "s" + | out : P _ out "out" + | a210 : P _ a210 "a210" + | a21 : P _ a21 "a21" + | a20 : P _ a20 "a20" + | a2 : P _ a2 "a2" + | a10 : P _ a10 "a10" + | a1 : P _ a1 "a1" + | a0 : P _ a0 "a0" + | a : P _ a "a" + | s10 : P _ s10 "s10". + End IsNamed. End MultiMux3Signals. (* Template body *) Definition MultiMux3 (n : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n)] ( (* Signal Input *) - do~ M.declare_signal "c" [[ [ M.var (| "n" |); 8 ] ]] in + do~ M.declare_signal "c" in (* Signal Input *) - do~ M.declare_signal "s" [[ [ 3 ] ]] in + do~ M.declare_signal "s" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "out" in (* Signal Intermediate *) - do~ M.declare_signal "a210" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a210" in (* Signal Intermediate *) - do~ M.declare_signal "a21" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a21" in (* Signal Intermediate *) - do~ M.declare_signal "a20" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a20" in (* Signal Intermediate *) - do~ M.declare_signal "a2" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a2" in (* Signal Intermediate *) - do~ M.declare_signal "a10" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a10" in (* Signal Intermediate *) - do~ M.declare_signal "a1" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a1" in (* Signal Intermediate *) - do~ M.declare_signal "a0" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a0" in (* Signal Intermediate *) - do~ M.declare_signal "a" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a" in (* Signal Intermediate *) - do~ M.declare_signal "s10" [[ ([] : list F.t) ]] in - do~ M.substitute_var "s10" [[ InfixOp.mul ~(| M.var_access (| "s", [Access.Array (1)] |), M.var_access (| "s", [Access.Array (0)] |) |) ]] in + do~ M.declare_signal "s10" in + do~ M.substitute_var "s10" [] [[ InfixOp.mul ~(| M.var_access (| "s", [Access.Array (1)] |), M.var_access (| "s", [Access.Array (0)] |) |) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "n" |) |) ]] ( - do~ M.substitute_var "a210" [[ InfixOp.mul ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (7)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (6)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (5)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (3)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s10" |) |) ]] in - do~ M.substitute_var "a21" [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (6)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (1)] |) |) ]] in - do~ M.substitute_var "a20" [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (5)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (0)] |) |) ]] in - do~ M.substitute_var "a2" [[ InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |) ]] in - do~ M.substitute_var "a10" [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (3)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s10" |) |) ]] in - do~ M.substitute_var "a1" [[ InfixOp.mul ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (1)] |) |) ]] in - do~ M.substitute_var "a0" [[ InfixOp.mul ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (0)] |) |) ]] in - do~ M.substitute_var "a" [[ M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) ]] in - do~ M.substitute_var "out" [[ InfixOp.add ~(| InfixOp.mul ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| M.var_access (| "a210", [Access.Array (M.var (| "i" |))] |), M.var_access (| "a21", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a20", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a2", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "s", [Access.Array (2)] |) |), InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| M.var_access (| "a10", [Access.Array (M.var (| "i" |))] |), M.var_access (| "a1", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a0", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a", [Access.Array (M.var (| "i" |))] |) |) |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "a210" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (7)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (6)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (5)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (3)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s10" |) |) ]] in + do~ M.substitute_var "a21" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (6)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (1)] |) |) ]] in + do~ M.substitute_var "a20" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (5)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (0)] |) |) ]] in + do~ M.substitute_var "a2" [Access.Array (M.var (| "i" |))] [[ InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |) ]] in + do~ M.substitute_var "a10" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (3)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s10" |) |) ]] in + do~ M.substitute_var "a1" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (1)] |) |) ]] in + do~ M.substitute_var "a0" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (0)] |) |) ]] in + do~ M.substitute_var "a" [Access.Array (M.var (| "i" |))] [[ M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |))] [[ InfixOp.add ~(| InfixOp.mul ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| M.var_access (| "a210", [Access.Array (M.var (| "i" |))] |), M.var_access (| "a21", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a20", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a2", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "s", [Access.Array (2)] |) |), InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| M.var_access (| "a10", [Access.Array (M.var (| "i" |))] |), M.var_access (| "a1", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a0", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a", [Access.Array (M.var (| "i" |))] |) |) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt @@ -95,6 +111,13 @@ Module Mux3Signals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | c : P _ c "c" + | s : P _ s "s" + | out : P _ out "out". + End IsNamed. End Mux3Signals. (* Template body *) @@ -102,29 +125,29 @@ Definition Mux3 : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Signal Input *) - do~ M.declare_signal "c" [[ [ 8 ] ]] in + do~ M.declare_signal "c" in (* Signal Input *) - do~ M.declare_signal "s" [[ [ 3 ] ]] in + do~ M.declare_signal "s" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "mux" in - do~ M.substitute_var "mux" [[ M.call_function ~(| "MultiMux3", [ 1 ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "mux" [] [[ M.call_function ~(| "MultiMux3", [ 1 ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 8 |) ]] ( - do~ M.substitute_var "mux" [[ M.var_access (| "c", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (0); Access.Array (M.var (| "i" |))] [[ M.var_access (| "c", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 3 |) ]] ( - do~ M.substitute_var "mux" [[ M.var_access (| "s", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mux" [Access.Component "s"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "s", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "mux", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "mux", [Access.Component "out"; Access.Array (0)] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/mux4.v b/Garden/Circom/Circomlib/translation/circuits/mux4.v index bbdc807..778ab1c 100644 --- a/Garden/Circom/Circomlib/translation/circuits/mux4.v +++ b/Garden/Circom/Circomlib/translation/circuits/mux4.v @@ -51,83 +51,110 @@ Module MultiMux4Signals. (* Intermediate *) s210 : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | c : P _ c "c" + | s : P _ s "s" + | out : P _ out "out" + | a3210 : P _ a3210 "a3210" + | a321 : P _ a321 "a321" + | a320 : P _ a320 "a320" + | a310 : P _ a310 "a310" + | a32 : P _ a32 "a32" + | a31 : P _ a31 "a31" + | a30 : P _ a30 "a30" + | a3 : P _ a3 "a3" + | a210 : P _ a210 "a210" + | a21 : P _ a21 "a21" + | a20 : P _ a20 "a20" + | a10 : P _ a10 "a10" + | a2 : P _ a2 "a2" + | a1 : P _ a1 "a1" + | a0 : P _ a0 "a0" + | a : P _ a "a" + | s10 : P _ s10 "s10" + | s20 : P _ s20 "s20" + | s21 : P _ s21 "s21" + | s210 : P _ s210 "s210". + End IsNamed. End MultiMux4Signals. (* Template body *) Definition MultiMux4 (n : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n)] ( (* Signal Input *) - do~ M.declare_signal "c" [[ [ M.var (| "n" |); 16 ] ]] in + do~ M.declare_signal "c" in (* Signal Input *) - do~ M.declare_signal "s" [[ [ 4 ] ]] in + do~ M.declare_signal "s" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "out" in (* Signal Intermediate *) - do~ M.declare_signal "a3210" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a3210" in (* Signal Intermediate *) - do~ M.declare_signal "a321" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a321" in (* Signal Intermediate *) - do~ M.declare_signal "a320" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a320" in (* Signal Intermediate *) - do~ M.declare_signal "a310" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a310" in (* Signal Intermediate *) - do~ M.declare_signal "a32" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a32" in (* Signal Intermediate *) - do~ M.declare_signal "a31" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a31" in (* Signal Intermediate *) - do~ M.declare_signal "a30" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a30" in (* Signal Intermediate *) - do~ M.declare_signal "a3" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a3" in (* Signal Intermediate *) - do~ M.declare_signal "a210" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a210" in (* Signal Intermediate *) - do~ M.declare_signal "a21" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a21" in (* Signal Intermediate *) - do~ M.declare_signal "a20" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a20" in (* Signal Intermediate *) - do~ M.declare_signal "a10" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a10" in (* Signal Intermediate *) - do~ M.declare_signal "a2" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a2" in (* Signal Intermediate *) - do~ M.declare_signal "a1" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a1" in (* Signal Intermediate *) - do~ M.declare_signal "a0" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a0" in (* Signal Intermediate *) - do~ M.declare_signal "a" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a" in (* Signal Intermediate *) - do~ M.declare_signal "s10" [[ ([] : list F.t) ]] in - do~ M.substitute_var "s10" [[ InfixOp.mul ~(| M.var_access (| "s", [Access.Array (1)] |), M.var_access (| "s", [Access.Array (0)] |) |) ]] in + do~ M.declare_signal "s10" in + do~ M.substitute_var "s10" [] [[ InfixOp.mul ~(| M.var_access (| "s", [Access.Array (1)] |), M.var_access (| "s", [Access.Array (0)] |) |) ]] in (* Signal Intermediate *) - do~ M.declare_signal "s20" [[ ([] : list F.t) ]] in - do~ M.substitute_var "s20" [[ InfixOp.mul ~(| M.var_access (| "s", [Access.Array (2)] |), M.var_access (| "s", [Access.Array (0)] |) |) ]] in + do~ M.declare_signal "s20" in + do~ M.substitute_var "s20" [] [[ InfixOp.mul ~(| M.var_access (| "s", [Access.Array (2)] |), M.var_access (| "s", [Access.Array (0)] |) |) ]] in (* Signal Intermediate *) - do~ M.declare_signal "s21" [[ ([] : list F.t) ]] in - do~ M.substitute_var "s21" [[ InfixOp.mul ~(| M.var_access (| "s", [Access.Array (2)] |), M.var_access (| "s", [Access.Array (1)] |) |) ]] in + do~ M.declare_signal "s21" in + do~ M.substitute_var "s21" [] [[ InfixOp.mul ~(| M.var_access (| "s", [Access.Array (2)] |), M.var_access (| "s", [Access.Array (1)] |) |) ]] in (* Signal Intermediate *) - do~ M.declare_signal "s210" [[ ([] : list F.t) ]] in - do~ M.substitute_var "s210" [[ InfixOp.mul ~(| M.var (| "s21" |), M.var_access (| "s", [Access.Array (0)] |) |) ]] in + do~ M.declare_signal "s210" in + do~ M.substitute_var "s210" [] [[ InfixOp.mul ~(| M.var (| "s21" |), M.var_access (| "s", [Access.Array (0)] |) |) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "n" |) |) ]] ( - do~ M.substitute_var "a3210" [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (15)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (14)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (13)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (12)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (11)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (10)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (9)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (8)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (7)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (6)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (5)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (3)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s210" |) |) ]] in - do~ M.substitute_var "a321" [[ InfixOp.mul ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (14)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (12)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (10)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (8)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (6)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s21" |) |) ]] in - do~ M.substitute_var "a320" [[ InfixOp.mul ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (13)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (12)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (9)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (8)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (5)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s20" |) |) ]] in - do~ M.substitute_var "a310" [[ InfixOp.mul ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (11)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (10)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (9)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (8)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (3)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s10" |) |) ]] in - do~ M.substitute_var "a32" [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (12)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (8)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (2)] |) |) ]] in - do~ M.substitute_var "a31" [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (10)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (8)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (1)] |) |) ]] in - do~ M.substitute_var "a30" [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (9)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (8)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (0)] |) |) ]] in - do~ M.substitute_var "a3" [[ InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (8)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |) ]] in - do~ M.substitute_var "a210" [[ InfixOp.mul ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (7)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (6)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (5)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (3)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s210" |) |) ]] in - do~ M.substitute_var "a21" [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (6)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s21" |) |) ]] in - do~ M.substitute_var "a20" [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (5)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s20" |) |) ]] in - do~ M.substitute_var "a10" [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (3)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s10" |) |) ]] in - do~ M.substitute_var "a2" [[ InfixOp.mul ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (2)] |) |) ]] in - do~ M.substitute_var "a1" [[ InfixOp.mul ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (1)] |) |) ]] in - do~ M.substitute_var "a0" [[ InfixOp.mul ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (0)] |) |) ]] in - do~ M.substitute_var "a" [[ M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) ]] in - do~ M.substitute_var "out" [[ InfixOp.add ~(| InfixOp.mul ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| M.var_access (| "a3210", [Access.Array (M.var (| "i" |))] |), M.var_access (| "a321", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a320", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a310", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a32", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a31", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a30", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a3", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "s", [Access.Array (3)] |) |), InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| M.var_access (| "a210", [Access.Array (M.var (| "i" |))] |), M.var_access (| "a21", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a20", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a10", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a2", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a1", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a0", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a", [Access.Array (M.var (| "i" |))] |) |) |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "a3210" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (15)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (14)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (13)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (12)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (11)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (10)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (9)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (8)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (7)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (6)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (5)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (3)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s210" |) |) ]] in + do~ M.substitute_var "a321" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (14)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (12)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (10)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (8)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (6)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s21" |) |) ]] in + do~ M.substitute_var "a320" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (13)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (12)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (9)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (8)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (5)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s20" |) |) ]] in + do~ M.substitute_var "a310" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (11)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (10)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (9)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (8)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (3)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s10" |) |) ]] in + do~ M.substitute_var "a32" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (12)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (8)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (2)] |) |) ]] in + do~ M.substitute_var "a31" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (10)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (8)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (1)] |) |) ]] in + do~ M.substitute_var "a30" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (9)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (8)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (0)] |) |) ]] in + do~ M.substitute_var "a3" [Access.Array (M.var (| "i" |))] [[ InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (8)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |) ]] in + do~ M.substitute_var "a210" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (7)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (6)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (5)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (3)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s210" |) |) ]] in + do~ M.substitute_var "a21" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (6)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s21" |) |) ]] in + do~ M.substitute_var "a20" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (5)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s20" |) |) ]] in + do~ M.substitute_var "a10" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (3)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var (| "s10" |) |) ]] in + do~ M.substitute_var "a2" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (4)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (2)] |) |) ]] in + do~ M.substitute_var "a1" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (2)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (1)] |) |) ]] in + do~ M.substitute_var "a0" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.sub ~(| M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (1)] |), M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) |), M.var_access (| "s", [Access.Array (0)] |) |) ]] in + do~ M.substitute_var "a" [Access.Array (M.var (| "i" |))] [[ M.var_access (| "c", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |))] [[ InfixOp.add ~(| InfixOp.mul ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| M.var_access (| "a3210", [Access.Array (M.var (| "i" |))] |), M.var_access (| "a321", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a320", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a310", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a32", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a31", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a30", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a3", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "s", [Access.Array (3)] |) |), InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| M.var_access (| "a210", [Access.Array (M.var (| "i" |))] |), M.var_access (| "a21", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a20", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a10", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a2", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a1", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a0", [Access.Array (M.var (| "i" |))] |) |), M.var_access (| "a", [Access.Array (M.var (| "i" |))] |) |) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt @@ -150,6 +177,13 @@ Module Mux4Signals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | c : P _ c "c" + | s : P _ s "s" + | out : P _ out "out". + End IsNamed. End Mux4Signals. (* Template body *) @@ -157,29 +191,29 @@ Definition Mux4 : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Signal Input *) - do~ M.declare_signal "c" [[ [ 16 ] ]] in + do~ M.declare_signal "c" in (* Signal Input *) - do~ M.declare_signal "s" [[ [ 4 ] ]] in + do~ M.declare_signal "s" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "mux" in - do~ M.substitute_var "mux" [[ M.call_function ~(| "MultiMux4", [ 1 ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "mux" [] [[ M.call_function ~(| "MultiMux4", [ 1 ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 16 |) ]] ( - do~ M.substitute_var "mux" [[ M.var_access (| "c", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (0); Access.Array (M.var (| "i" |))] [[ M.var_access (| "c", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 4 |) ]] ( - do~ M.substitute_var "mux" [[ M.var_access (| "s", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mux" [Access.Component "s"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "s", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "mux", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "mux", [Access.Component "out"; Access.Array (0)] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/pedersen.v b/Garden/Circom/Circomlib/translation/circuits/pedersen.v index c54490f..ad1f7e3 100644 --- a/Garden/Circom/Circomlib/translation/circuits/pedersen.v +++ b/Garden/Circom/Circomlib/translation/circuits/pedersen.v @@ -13,92 +13,100 @@ Module Window4Signals. (* Output *) out8 : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | base : P _ base "base" + | out : P _ out "out" + | out8 : P _ out8 "out8". + End IsNamed. End Window4Signals. (* Template body *) Definition Window4 : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 4 ] ]] in + do~ M.declare_signal "in" in (* Signal Input *) - do~ M.declare_signal "base" [[ [ 2 ] ]] in + do~ M.declare_signal "base" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in + do~ M.declare_signal "out" in (* Signal Output *) - do~ M.declare_signal "out8" [[ [ 2 ] ]] in + do~ M.declare_signal "out8" in (* Component *) do~ M.declare_component "mux" in - do~ M.substitute_var "mux" [[ M.call_function ~(| "MultiMux3", [ 2 ] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "in", [Access.Array (0)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "in", [Access.Array (1)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "in", [Access.Array (2)] |) ]] in + do~ M.substitute_var "mux" [] [[ M.call_function ~(| "MultiMux3", [ 2 ] |) ]] in + do~ M.substitute_var "mux" [Access.Component "s"; Access.Array (0)] [[ M.var_access (| "in", [Access.Array (0)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "s"; Access.Array (1)] [[ M.var_access (| "in", [Access.Array (1)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "s"; Access.Array (2)] [[ M.var_access (| "in", [Access.Array (2)] |) ]] in (* Component *) do~ M.declare_component "dbl2" in - do~ M.substitute_var "dbl2" [[ M.call_function ~(| "MontgomeryDouble", ([] : list F.t) |) ]] in + do~ M.substitute_var "dbl2" [] [[ M.call_function ~(| "MontgomeryDouble", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "adr3" in - do~ M.substitute_var "adr3" [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "adr3" [] [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "adr4" in - do~ M.substitute_var "adr4" [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "adr4" [] [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "adr5" in - do~ M.substitute_var "adr5" [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "adr5" [] [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "adr6" in - do~ M.substitute_var "adr6" [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "adr6" [] [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "adr7" in - do~ M.substitute_var "adr7" [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "adr7" [] [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "adr8" in - do~ M.substitute_var "adr8" [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "base", [Access.Array (0)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "base", [Access.Array (1)] |) ]] in - do~ M.substitute_var "dbl2" [[ M.var_access (| "base", [Access.Array (0)] |) ]] in - do~ M.substitute_var "dbl2" [[ M.var_access (| "base", [Access.Array (1)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "dbl2", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "dbl2", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "adr3" [[ M.var_access (| "base", [Access.Array (0)] |) ]] in - do~ M.substitute_var "adr3" [[ M.var_access (| "base", [Access.Array (1)] |) ]] in - do~ M.substitute_var "adr3" [[ M.var_access (| "dbl2", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adr3" [[ M.var_access (| "dbl2", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr3", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr3", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "adr4" [[ M.var_access (| "base", [Access.Array (0)] |) ]] in - do~ M.substitute_var "adr4" [[ M.var_access (| "base", [Access.Array (1)] |) ]] in - do~ M.substitute_var "adr4" [[ M.var_access (| "adr3", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adr4" [[ M.var_access (| "adr3", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr4", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr4", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "adr5" [[ M.var_access (| "base", [Access.Array (0)] |) ]] in - do~ M.substitute_var "adr5" [[ M.var_access (| "base", [Access.Array (1)] |) ]] in - do~ M.substitute_var "adr5" [[ M.var_access (| "adr4", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adr5" [[ M.var_access (| "adr4", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr5", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr5", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "adr6" [[ M.var_access (| "base", [Access.Array (0)] |) ]] in - do~ M.substitute_var "adr6" [[ M.var_access (| "base", [Access.Array (1)] |) ]] in - do~ M.substitute_var "adr6" [[ M.var_access (| "adr5", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adr6" [[ M.var_access (| "adr5", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr6", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr6", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "adr7" [[ M.var_access (| "base", [Access.Array (0)] |) ]] in - do~ M.substitute_var "adr7" [[ M.var_access (| "base", [Access.Array (1)] |) ]] in - do~ M.substitute_var "adr7" [[ M.var_access (| "adr6", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adr7" [[ M.var_access (| "adr6", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr7", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr7", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "adr8" [[ M.var_access (| "base", [Access.Array (0)] |) ]] in - do~ M.substitute_var "adr8" [[ M.var_access (| "base", [Access.Array (1)] |) ]] in - do~ M.substitute_var "adr8" [[ M.var_access (| "adr7", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adr8" [[ M.var_access (| "adr7", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr8", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "adr8", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "out8" [[ M.var_access (| "adr8", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "out8" [[ M.var_access (| "adr8", [Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "mux", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "out" [[ InfixOp.add ~(| InfixOp.mul ~(| InfixOp.mul ~(| PrefixOp.sub ~(| M.var_access (| "mux", [Access.Component "out"; Access.Array (1)] |) |), 2 |), M.var_access (| "in", [Access.Array (3)] |) |), M.var_access (| "mux", [Access.Component "out"; Access.Array (1)] |) |) ]] in + do~ M.substitute_var "adr8" [] [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (0); Access.Array (0)] [[ M.var_access (| "base", [Access.Array (0)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (1); Access.Array (0)] [[ M.var_access (| "base", [Access.Array (1)] |) ]] in + do~ M.substitute_var "dbl2" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "base", [Access.Array (0)] |) ]] in + do~ M.substitute_var "dbl2" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "base", [Access.Array (1)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (0); Access.Array (1)] [[ M.var_access (| "dbl2", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (1); Access.Array (1)] [[ M.var_access (| "dbl2", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adr3" [Access.Component "in1"; Access.Array (0)] [[ M.var_access (| "base", [Access.Array (0)] |) ]] in + do~ M.substitute_var "adr3" [Access.Component "in1"; Access.Array (1)] [[ M.var_access (| "base", [Access.Array (1)] |) ]] in + do~ M.substitute_var "adr3" [Access.Component "in2"; Access.Array (0)] [[ M.var_access (| "dbl2", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adr3" [Access.Component "in2"; Access.Array (1)] [[ M.var_access (| "dbl2", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (0); Access.Array (2)] [[ M.var_access (| "adr3", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (1); Access.Array (2)] [[ M.var_access (| "adr3", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adr4" [Access.Component "in1"; Access.Array (0)] [[ M.var_access (| "base", [Access.Array (0)] |) ]] in + do~ M.substitute_var "adr4" [Access.Component "in1"; Access.Array (1)] [[ M.var_access (| "base", [Access.Array (1)] |) ]] in + do~ M.substitute_var "adr4" [Access.Component "in2"; Access.Array (0)] [[ M.var_access (| "adr3", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adr4" [Access.Component "in2"; Access.Array (1)] [[ M.var_access (| "adr3", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (0); Access.Array (3)] [[ M.var_access (| "adr4", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (1); Access.Array (3)] [[ M.var_access (| "adr4", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adr5" [Access.Component "in1"; Access.Array (0)] [[ M.var_access (| "base", [Access.Array (0)] |) ]] in + do~ M.substitute_var "adr5" [Access.Component "in1"; Access.Array (1)] [[ M.var_access (| "base", [Access.Array (1)] |) ]] in + do~ M.substitute_var "adr5" [Access.Component "in2"; Access.Array (0)] [[ M.var_access (| "adr4", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adr5" [Access.Component "in2"; Access.Array (1)] [[ M.var_access (| "adr4", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (0); Access.Array (4)] [[ M.var_access (| "adr5", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (1); Access.Array (4)] [[ M.var_access (| "adr5", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adr6" [Access.Component "in1"; Access.Array (0)] [[ M.var_access (| "base", [Access.Array (0)] |) ]] in + do~ M.substitute_var "adr6" [Access.Component "in1"; Access.Array (1)] [[ M.var_access (| "base", [Access.Array (1)] |) ]] in + do~ M.substitute_var "adr6" [Access.Component "in2"; Access.Array (0)] [[ M.var_access (| "adr5", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adr6" [Access.Component "in2"; Access.Array (1)] [[ M.var_access (| "adr5", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (0); Access.Array (5)] [[ M.var_access (| "adr6", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (1); Access.Array (5)] [[ M.var_access (| "adr6", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adr7" [Access.Component "in1"; Access.Array (0)] [[ M.var_access (| "base", [Access.Array (0)] |) ]] in + do~ M.substitute_var "adr7" [Access.Component "in1"; Access.Array (1)] [[ M.var_access (| "base", [Access.Array (1)] |) ]] in + do~ M.substitute_var "adr7" [Access.Component "in2"; Access.Array (0)] [[ M.var_access (| "adr6", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adr7" [Access.Component "in2"; Access.Array (1)] [[ M.var_access (| "adr6", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (0); Access.Array (6)] [[ M.var_access (| "adr7", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (1); Access.Array (6)] [[ M.var_access (| "adr7", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adr8" [Access.Component "in1"; Access.Array (0)] [[ M.var_access (| "base", [Access.Array (0)] |) ]] in + do~ M.substitute_var "adr8" [Access.Component "in1"; Access.Array (1)] [[ M.var_access (| "base", [Access.Array (1)] |) ]] in + do~ M.substitute_var "adr8" [Access.Component "in2"; Access.Array (0)] [[ M.var_access (| "adr7", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adr8" [Access.Component "in2"; Access.Array (1)] [[ M.var_access (| "adr7", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (0); Access.Array (7)] [[ M.var_access (| "adr8", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (1); Access.Array (7)] [[ M.var_access (| "adr8", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "out8" [Access.Array (0)] [[ M.var_access (| "adr8", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "out8" [Access.Array (1)] [[ M.var_access (| "adr8", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ M.var_access (| "mux", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ InfixOp.add ~(| InfixOp.mul ~(| InfixOp.mul ~(| PrefixOp.sub ~(| M.var_access (| "mux", [Access.Component "out"; Access.Array (1)] |) |), 2 |), M.var_access (| "in", [Access.Array (3)] |) |), M.var_access (| "mux", [Access.Component "out"; Access.Array (1)] |) |) ]] in M.pure BlockUnit.Tt ). @@ -118,28 +126,35 @@ Module SegmentSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | base : P _ base "base" + | out : P _ out "out". + End IsNamed. End SegmentSignals. (* Template body *) Definition Segment (nWindows : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("nWindows", nWindows)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ InfixOp.mul ~(| M.var (| "nWindows" |), 4 |) ] ]] in + do~ M.declare_signal "in" in (* Signal Input *) - do~ M.declare_signal "base" [[ [ 2 ] ]] in + do~ M.declare_signal "base" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in (* Component *) do~ M.declare_component "e2m" in - do~ M.substitute_var "e2m" [[ M.call_function ~(| "Edwards2Montgomery", ([] : list F.t) |) ]] in - do~ M.substitute_var "e2m" [[ M.var_access (| "base", [Access.Array (0)] |) ]] in - do~ M.substitute_var "e2m" [[ M.var_access (| "base", [Access.Array (1)] |) ]] in + do~ M.substitute_var "e2m" [] [[ M.call_function ~(| "Edwards2Montgomery", ([] : list F.t) |) ]] in + do~ M.substitute_var "e2m" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "base", [Access.Array (0)] |) ]] in + do~ M.substitute_var "e2m" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "base", [Access.Array (1)] |) ]] in (* Component *) do~ M.declare_component "windows" in (* Component *) @@ -148,59 +163,59 @@ Definition Segment (nWindows : F.t) : M.t (BlockUnit.t Empty_set) := do~ M.declare_component "doublers2" in (* Component *) do~ M.declare_component "adders" in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "nWindows" |) |) ]] ( - do~ M.substitute_var "windows" [[ M.call_function ~(| "Window4", ([] : list F.t) |) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "windows" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "Window4", ([] : list F.t) |) ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), 4 |) ]] ( - do~ M.substitute_var "windows" [[ M.var_access (| "in", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 4, M.var (| "i" |) |), M.var (| "j" |) |))] |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "windows" [Access.Array (M.var (| "i" |)); Access.Component "in"; Access.Array (M.var (| "j" |))] [[ M.var_access (| "in", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 4, M.var (| "i" |) |), M.var (| "j" |) |))] |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.if_ [[ InfixOp.eq ~(| M.var (| "i" |), 0 |) ]] (* then *) ( - do~ M.substitute_var "windows" [[ M.var_access (| "e2m", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "windows" [[ M.var_access (| "e2m", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "windows" [Access.Array (M.var (| "i" |)); Access.Component "base"; Access.Array (0)] [[ M.var_access (| "e2m", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "windows" [Access.Array (M.var (| "i" |)); Access.Component "base"; Access.Array (1)] [[ M.var_access (| "e2m", [Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "doublers1" [[ M.call_function ~(| "MontgomeryDouble", ([] : list F.t) |) ]] in - do~ M.substitute_var "doublers2" [[ M.call_function ~(| "MontgomeryDouble", ([] : list F.t) |) ]] in - do~ M.substitute_var "doublers1" [[ M.var_access (| "windows", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out8"; Access.Array (0)] |) ]] in - do~ M.substitute_var "doublers1" [[ M.var_access (| "windows", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out8"; Access.Array (1)] |) ]] in - do~ M.substitute_var "doublers2" [[ M.var_access (| "doublers1", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "doublers2" [[ M.var_access (| "doublers1", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "windows" [[ M.var_access (| "doublers2", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "windows" [[ M.var_access (| "doublers2", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "adders" [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "doublers1" [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |))] [[ M.call_function ~(| "MontgomeryDouble", ([] : list F.t) |) ]] in + do~ M.substitute_var "doublers2" [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |))] [[ M.call_function ~(| "MontgomeryDouble", ([] : list F.t) |) ]] in + do~ M.substitute_var "doublers1" [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "in"; Access.Array (0)] [[ M.var_access (| "windows", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out8"; Access.Array (0)] |) ]] in + do~ M.substitute_var "doublers1" [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "in"; Access.Array (1)] [[ M.var_access (| "windows", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out8"; Access.Array (1)] |) ]] in + do~ M.substitute_var "doublers2" [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "in"; Access.Array (0)] [[ M.var_access (| "doublers1", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "doublers2" [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "in"; Access.Array (1)] [[ M.var_access (| "doublers1", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "windows" [Access.Array (M.var (| "i" |)); Access.Component "base"; Access.Array (0)] [[ M.var_access (| "doublers2", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "windows" [Access.Array (M.var (| "i" |)); Access.Component "base"; Access.Array (1)] [[ M.var_access (| "doublers2", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |))] [[ M.call_function ~(| "MontgomeryAdd", ([] : list F.t) |) ]] in do~ M.if_ [[ InfixOp.eq ~(| M.var (| "i" |), 1 |) ]] (* then *) ( - do~ M.substitute_var "adders" [[ M.var_access (| "windows", [Access.Array (0); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adders" [[ M.var_access (| "windows", [Access.Array (0); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "in1"; Access.Array (0)] [[ M.var_access (| "windows", [Access.Array (0); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "in1"; Access.Array (1)] [[ M.var_access (| "windows", [Access.Array (0); Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "adders" [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 2 |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adders" [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 2 |)); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "in1"; Access.Array (0)] [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 2 |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "in1"; Access.Array (1)] [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 2 |)); Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "adders" [[ M.var_access (| "windows", [Access.Array (M.var (| "i" |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adders" [[ M.var_access (| "windows", [Access.Array (M.var (| "i" |)); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "in2"; Access.Array (0)] [[ M.var_access (| "windows", [Access.Array (M.var (| "i" |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "in2"; Access.Array (1)] [[ M.var_access (| "windows", [Access.Array (M.var (| "i" |)); Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "m2e" in - do~ M.substitute_var "m2e" [[ M.call_function ~(| "Montgomery2Edwards", ([] : list F.t) |) ]] in + do~ M.substitute_var "m2e" [] [[ M.call_function ~(| "Montgomery2Edwards", ([] : list F.t) |) ]] in do~ M.if_ [[ InfixOp.greater ~(| M.var (| "nWindows" |), 1 |) ]] (* then *) ( - do~ M.substitute_var "m2e" [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "nWindows" |), 2 |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "m2e" [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "nWindows" |), 2 |)); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "m2e" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "nWindows" |), 2 |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "m2e" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "nWindows" |), 2 |)); Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "m2e" [[ M.var_access (| "windows", [Access.Array (0); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "m2e" [[ M.var_access (| "windows", [Access.Array (0); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "m2e" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "windows", [Access.Array (0); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "m2e" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "windows", [Access.Array (0); Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "m2e", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "m2e", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ M.var_access (| "m2e", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ M.var_access (| "m2e", [Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ). @@ -218,86 +233,92 @@ Module PedersenSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End PedersenSignals. (* Template body *) Definition Pedersen (n : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "BASE" [[ [ 10; 2 ] ]] in - do~ M.substitute_var "BASE" [[ array_with_repeat (array_with_repeat (0) (2)) (10) ]] in - do~ M.substitute_var "BASE" [[ [ [ 10457101036533406547632367118273992217979173478358440826365724437999023779287; 19824078218392094440610104313265183977899662750282163392862422243483260492317 ]; [ 2671756056509184035029146175565761955751135805354291559563293617232983272177; 2663205510731142763556352975002641716101654201788071096152948830924149045094 ]; [ 5802099305472655231388284418920769829666717045250560929368476121199858275951; 5980429700218124965372158798884772646841287887664001482443826541541529227896 ]; [ 7107336197374528537877327281242680114152313102022415488494307685842428166594; 2857869773864086953506483169737724679646433914307247183624878062391496185654 ]; [ 20265828622013100949498132415626198973119240347465898028410217039057588424236; 1160461593266035632937973507065134938065359936056410650153315956301179689506 ]; [ 1487999857809287756929114517587739322941449154962237464737694709326309567994; 14017256862867289575056460215526364897734808720610101650676790868051368668003 ]; [ 14618644331049802168996997831720384953259095788558646464435263343433563860015; 13115243279999696210147231297848654998887864576952244320558158620692603342236 ]; [ 6814338563135591367010655964669793483652536871717891893032616415581401894627; 13660303521961041205824633772157003587453809761793065294055279768121314853695 ]; [ 3571615583211663069428808372184817973703476260057504149923239576077102575715; 11981351099832644138306422070127357074117642951423551606012551622164230222506 ]; [ 18597552580465440374022635246985743886550544261632147935254624835147509493269; 6753322320275422086923032033899357299485124665258735666995435957890214041481 ] ] ]] in + do~ M.substitute_var "BASE" [] [[ array_with_repeat (array_with_repeat (0) (2)) (10) ]] in + do~ M.substitute_var "BASE" [] [[ [ [ 10457101036533406547632367118273992217979173478358440826365724437999023779287; 19824078218392094440610104313265183977899662750282163392862422243483260492317 ]; [ 2671756056509184035029146175565761955751135805354291559563293617232983272177; 2663205510731142763556352975002641716101654201788071096152948830924149045094 ]; [ 5802099305472655231388284418920769829666717045250560929368476121199858275951; 5980429700218124965372158798884772646841287887664001482443826541541529227896 ]; [ 7107336197374528537877327281242680114152313102022415488494307685842428166594; 2857869773864086953506483169737724679646433914307247183624878062391496185654 ]; [ 20265828622013100949498132415626198973119240347465898028410217039057588424236; 1160461593266035632937973507065134938065359936056410650153315956301179689506 ]; [ 1487999857809287756929114517587739322941449154962237464737694709326309567994; 14017256862867289575056460215526364897734808720610101650676790868051368668003 ]; [ 14618644331049802168996997831720384953259095788558646464435263343433563860015; 13115243279999696210147231297848654998887864576952244320558158620692603342236 ]; [ 6814338563135591367010655964669793483652536871717891893032616415581401894627; 13660303521961041205824633772157003587453809761793065294055279768121314853695 ]; [ 3571615583211663069428808372184817973703476260057504149923239576077102575715; 11981351099832644138306422070127357074117642951423551606012551622164230222506 ]; [ 18597552580465440374022635246985743886550544261632147935254624835147509493269; 6753322320275422086923032033899357299485124665258735666995435957890214041481 ] ] ]] in (* Var *) do~ M.declare_var "nSegments" [[ ([] : list F.t) ]] in - do~ M.substitute_var "nSegments" [[ InfixOp.add ~(| InfixOp.intDiv ~(| InfixOp.sub ~(| M.var (| "n" |), 1 |), 200 |), 1 |) ]] in + do~ M.substitute_var "nSegments" [] [[ InfixOp.add ~(| InfixOp.intDiv ~(| InfixOp.sub ~(| M.var (| "n" |), 1 |), 200 |), 1 |) ]] in (* Component *) do~ M.declare_component "segments" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in (* Var *) do~ M.declare_var "nBits" [[ ([] : list F.t) ]] in - do~ M.substitute_var "nBits" [[ 0 ]] in + do~ M.substitute_var "nBits" [] [[ 0 ]] in (* Var *) do~ M.declare_var "nWindows" [[ ([] : list F.t) ]] in - do~ M.substitute_var "nWindows" [[ 0 ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "nWindows" [] [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "nSegments" |) |) ]] ( - do~ M.substitute_var "nBits" [[ ternary_expression (InfixOp.eq ~(| M.var (| "i" |), InfixOp.sub ~(| M.var (| "nSegments" |), 1 |) |)) (InfixOp.sub ~(| M.var (| "n" |), InfixOp.mul ~(| InfixOp.sub ~(| M.var (| "nSegments" |), 1 |), 200 |) |)) (200) ]] in - do~ M.substitute_var "nWindows" [[ InfixOp.add ~(| InfixOp.intDiv ~(| InfixOp.sub ~(| M.var (| "nBits" |), 1 |), 4 |), 1 |) ]] in - do~ M.substitute_var "segments" [[ M.call_function ~(| "Segment", [ M.var (| "nWindows" |) ] |) ]] in - do~ M.substitute_var "segments" [[ M.var_access (| "BASE", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) ]] in - do~ M.substitute_var "segments" [[ M.var_access (| "BASE", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "nBits" [] [[ ternary_expression (InfixOp.eq ~(| M.var (| "i" |), InfixOp.sub ~(| M.var (| "nSegments" |), 1 |) |)) (InfixOp.sub ~(| M.var (| "n" |), InfixOp.mul ~(| InfixOp.sub ~(| M.var (| "nSegments" |), 1 |), 200 |) |)) (200) ]] in + do~ M.substitute_var "nWindows" [] [[ InfixOp.add ~(| InfixOp.intDiv ~(| InfixOp.sub ~(| M.var (| "nBits" |), 1 |), 4 |), 1 |) ]] in + do~ M.substitute_var "segments" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "Segment", [ M.var (| "nWindows" |) ] |) ]] in + do~ M.substitute_var "segments" [Access.Array (M.var (| "i" |)); Access.Component "base"; Access.Array (0)] [[ M.var_access (| "BASE", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) ]] in + do~ M.substitute_var "segments" [Access.Array (M.var (| "i" |)); Access.Component "base"; Access.Array (1)] [[ M.var_access (| "BASE", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "nBits" |) |) ]] ( - do~ M.substitute_var "segments" [[ M.var_access (| "in", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| M.var (| "i" |), 200 |), M.var (| "j" |) |))] |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "segments" [Access.Array (M.var (| "i" |)); Access.Component "in"; Access.Array (M.var (| "j" |))] [[ M.var_access (| "in", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| M.var (| "i" |), 200 |), M.var (| "j" |) |))] |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "j" [[ M.var (| "nBits" |) ]] in + do~ M.substitute_var "j" [] [[ M.var (| "nBits" |) ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), InfixOp.mul ~(| M.var (| "nWindows" |), 4 |) |) ]] ( - do~ M.substitute_var "segments" [[ 0 ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "segments" [Access.Array (M.var (| "i" |)); Access.Component "in"; Access.Array (M.var (| "j" |))] [[ 0 ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "adders" in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), InfixOp.sub ~(| M.var (| "nSegments" |), 1 |) |) ]] ( - do~ M.substitute_var "adders" [[ M.call_function ~(| "BabyAdd", ([] : list F.t) |) ]] in + do~ M.substitute_var "adders" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "BabyAdd", ([] : list F.t) |) ]] in do~ M.if_ [[ InfixOp.eq ~(| M.var (| "i" |), 0 |) ]] (* then *) ( - do~ M.substitute_var "adders" [[ M.var_access (| "segments", [Access.Array (0); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adders" [[ M.var_access (| "segments", [Access.Array (0); Access.Component "out"; Access.Array (1)] |) ]] in - do~ M.substitute_var "adders" [[ M.var_access (| "segments", [Access.Array (1); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adders" [[ M.var_access (| "segments", [Access.Array (1); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (M.var (| "i" |)); Access.Component "x1"] [[ M.var_access (| "segments", [Access.Array (0); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (M.var (| "i" |)); Access.Component "y1"] [[ M.var_access (| "segments", [Access.Array (0); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (M.var (| "i" |)); Access.Component "x2"] [[ M.var_access (| "segments", [Access.Array (1); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (M.var (| "i" |)); Access.Component "y2"] [[ M.var_access (| "segments", [Access.Array (1); Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "adders" [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "xout"] |) ]] in - do~ M.substitute_var "adders" [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "yout"] |) ]] in - do~ M.substitute_var "adders" [[ M.var_access (| "segments", [Access.Array (InfixOp.add ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "adders" [[ M.var_access (| "segments", [Access.Array (InfixOp.add ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (M.var (| "i" |)); Access.Component "x1"] [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "xout"] |) ]] in + do~ M.substitute_var "adders" [Access.Array (M.var (| "i" |)); Access.Component "y1"] [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "yout"] |) ]] in + do~ M.substitute_var "adders" [Access.Array (M.var (| "i" |)); Access.Component "x2"] [[ M.var_access (| "segments", [Access.Array (InfixOp.add ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "adders" [Access.Array (M.var (| "i" |)); Access.Component "y2"] [[ M.var_access (| "segments", [Access.Array (InfixOp.add ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.if_ [[ InfixOp.greater ~(| M.var (| "nSegments" |), 1 |) ]] (* then *) ( - do~ M.substitute_var "out" [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "nSegments" |), 2 |)); Access.Component "xout"] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "nSegments" |), 2 |)); Access.Component "yout"] |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "nSegments" |), 2 |)); Access.Component "xout"] |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ M.var_access (| "adders", [Access.Array (InfixOp.sub ~(| M.var (| "nSegments" |), 2 |)); Access.Component "yout"] |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "out" [[ M.var_access (| "segments", [Access.Array (0); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "segments", [Access.Array (0); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ M.var_access (| "segments", [Access.Array (0); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ M.var_access (| "segments", [Access.Array (0); Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt diff --git a/Garden/Circom/Circomlib/translation/circuits/pedersen_old.v b/Garden/Circom/Circomlib/translation/circuits/pedersen_old.v index 5dab7a1..53ed542 100644 --- a/Garden/Circom/Circomlib/translation/circuits/pedersen_old.v +++ b/Garden/Circom/Circomlib/translation/circuits/pedersen_old.v @@ -9,60 +9,66 @@ Module PedersenSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End PedersenSignals. (* Template body *) Definition Pedersen (n : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "nexps" [[ ([] : list F.t) ]] in - do~ M.substitute_var "nexps" [[ InfixOp.add ~(| InfixOp.intDiv ~(| InfixOp.sub ~(| M.var (| "n" |), 1 |), 250 |), 1 |) ]] in + do~ M.substitute_var "nexps" [] [[ InfixOp.add ~(| InfixOp.intDiv ~(| InfixOp.sub ~(| M.var (| "n" |), 1 |), 250 |), 1 |) ]] in (* Var *) do~ M.declare_var "nlastbits" [[ ([] : list F.t) ]] in - do~ M.substitute_var "nlastbits" [[ InfixOp.sub ~(| M.var (| "n" |), InfixOp.mul ~(| InfixOp.sub ~(| M.var (| "nexps" |), 1 |), 250 |) |) ]] in + do~ M.substitute_var "nlastbits" [] [[ InfixOp.sub ~(| M.var (| "n" |), InfixOp.mul ~(| InfixOp.sub ~(| M.var (| "nexps" |), 1 |), 250 |) |) ]] in (* Component *) do~ M.declare_component "escalarMuls" in (* Var *) do~ M.declare_var "PBASE" [[ [ 10; 2 ] ]] in - do~ M.substitute_var "PBASE" [[ array_with_repeat (array_with_repeat (0) (2)) (10) ]] in - do~ M.substitute_var "PBASE" [[ [ [ 10457101036533406547632367118273992217979173478358440826365724437999023779287; 19824078218392094440610104313265183977899662750282163392862422243483260492317 ]; [ 2671756056509184035029146175565761955751135805354291559563293617232983272177; 2663205510731142763556352975002641716101654201788071096152948830924149045094 ]; [ 5802099305472655231388284418920769829666717045250560929368476121199858275951; 5980429700218124965372158798884772646841287887664001482443826541541529227896 ]; [ 7107336197374528537877327281242680114152313102022415488494307685842428166594; 2857869773864086953506483169737724679646433914307247183624878062391496185654 ]; [ 20265828622013100949498132415626198973119240347465898028410217039057588424236; 1160461593266035632937973507065134938065359936056410650153315956301179689506 ]; [ 1487999857809287756929114517587739322941449154962237464737694709326309567994; 14017256862867289575056460215526364897734808720610101650676790868051368668003 ]; [ 14618644331049802168996997831720384953259095788558646464435263343433563860015; 13115243279999696210147231297848654998887864576952244320558158620692603342236 ]; [ 6814338563135591367010655964669793483652536871717891893032616415581401894627; 13660303521961041205824633772157003587453809761793065294055279768121314853695 ]; [ 3571615583211663069428808372184817973703476260057504149923239576077102575715; 11981351099832644138306422070127357074117642951423551606012551622164230222506 ]; [ 18597552580465440374022635246985743886550544261632147935254624835147509493269; 6753322320275422086923032033899357299485124665258735666995435957890214041481 ] ] ]] in + do~ M.substitute_var "PBASE" [] [[ array_with_repeat (array_with_repeat (0) (2)) (10) ]] in + do~ M.substitute_var "PBASE" [] [[ [ [ 10457101036533406547632367118273992217979173478358440826365724437999023779287; 19824078218392094440610104313265183977899662750282163392862422243483260492317 ]; [ 2671756056509184035029146175565761955751135805354291559563293617232983272177; 2663205510731142763556352975002641716101654201788071096152948830924149045094 ]; [ 5802099305472655231388284418920769829666717045250560929368476121199858275951; 5980429700218124965372158798884772646841287887664001482443826541541529227896 ]; [ 7107336197374528537877327281242680114152313102022415488494307685842428166594; 2857869773864086953506483169737724679646433914307247183624878062391496185654 ]; [ 20265828622013100949498132415626198973119240347465898028410217039057588424236; 1160461593266035632937973507065134938065359936056410650153315956301179689506 ]; [ 1487999857809287756929114517587739322941449154962237464737694709326309567994; 14017256862867289575056460215526364897734808720610101650676790868051368668003 ]; [ 14618644331049802168996997831720384953259095788558646464435263343433563860015; 13115243279999696210147231297848654998887864576952244320558158620692603342236 ]; [ 6814338563135591367010655964669793483652536871717891893032616415581401894627; 13660303521961041205824633772157003587453809761793065294055279768121314853695 ]; [ 3571615583211663069428808372184817973703476260057504149923239576077102575715; 11981351099832644138306422070127357074117642951423551606012551622164230222506 ]; [ 18597552580465440374022635246985743886550544261632147935254624835147509493269; 6753322320275422086923032033899357299485124665258735666995435957890214041481 ] ] ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in (* Var *) do~ M.declare_var "nexpbits" [[ ([] : list F.t) ]] in - do~ M.substitute_var "nexpbits" [[ 0 ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "nexpbits" [] [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "nexps" |) |) ]] ( - do~ M.substitute_var "nexpbits" [[ ternary_expression (InfixOp.eq ~(| M.var (| "i" |), InfixOp.sub ~(| M.var (| "nexps" |), 1 |) |)) (M.var (| "nlastbits" |)) (250) ]] in - do~ M.substitute_var "escalarMuls" [[ M.call_function ~(| "EscalarMul", [ M.var (| "nexpbits" |); M.var_access (| "PBASE", [Access.Array (M.var (| "i" |))] |) ] |) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "nexpbits" [] [[ ternary_expression (InfixOp.eq ~(| M.var (| "i" |), InfixOp.sub ~(| M.var (| "nexps" |), 1 |) |)) (M.var (| "nlastbits" |)) (250) ]] in + do~ M.substitute_var "escalarMuls" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "EscalarMul", [ M.var (| "nexpbits" |); M.var_access (| "PBASE", [Access.Array (M.var (| "i" |))] |) ] |) ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "nexpbits" |) |) ]] ( - do~ M.substitute_var "escalarMuls" [[ M.var_access (| "in", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 250, M.var (| "i" |) |), M.var (| "j" |) |))] |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "escalarMuls" [Access.Array (M.var (| "i" |)); Access.Component "in"; Access.Array (M.var (| "j" |))] [[ M.var_access (| "in", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 250, M.var (| "i" |) |), M.var (| "j" |) |))] |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.if_ [[ InfixOp.eq ~(| M.var (| "i" |), 0 |) ]] (* then *) ( - do~ M.substitute_var "escalarMuls" [[ 0 ]] in - do~ M.substitute_var "escalarMuls" [[ 1 ]] in + do~ M.substitute_var "escalarMuls" [Access.Array (M.var (| "i" |)); Access.Component "inp"; Access.Array (0)] [[ 0 ]] in + do~ M.substitute_var "escalarMuls" [Access.Array (M.var (| "i" |)); Access.Component "inp"; Access.Array (1)] [[ 1 ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "escalarMuls" [[ M.var_access (| "escalarMuls", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "escalarMuls" [[ M.var_access (| "escalarMuls", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "escalarMuls" [Access.Array (M.var (| "i" |)); Access.Component "inp"; Access.Array (0)] [[ M.var_access (| "escalarMuls", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "escalarMuls" [Access.Array (M.var (| "i" |)); Access.Component "inp"; Access.Array (1)] [[ M.var_access (| "escalarMuls", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "escalarMuls", [Access.Array (InfixOp.sub ~(| M.var (| "nexps" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "escalarMuls", [Access.Array (InfixOp.sub ~(| M.var (| "nexps" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ M.var_access (| "escalarMuls", [Access.Array (InfixOp.sub ~(| M.var (| "nexps" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ M.var_access (| "escalarMuls", [Access.Array (InfixOp.sub ~(| M.var (| "nexps" |), 1 |)); Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/pointbits.v b/Garden/Circom/Circomlib/translation/circuits/pointbits.v index 3bed548..cd215d9 100644 --- a/Garden/Circom/Circomlib/translation/circuits/pointbits.v +++ b/Garden/Circom/Circomlib/translation/circuits/pointbits.v @@ -12,7 +12,7 @@ Definition sqrt (n : F.t) : M.t F.t := ) in (* Var *) do~ M.declare_var "res" [[ ([] : list F.t) ]] in - do~ M.substitute_var "res" [[ InfixOp.pow ~(| M.var (| "n" |), InfixOp.shiftR ~(| PrefixOp.sub ~(| 1 |), 1 |) |) ]] in + do~ M.substitute_var "res" [] [[ InfixOp.pow ~(| M.var (| "n" |), InfixOp.shiftR ~(| PrefixOp.sub ~(| 1 |), 1 |) |) ]] in do~ M.if_ [[ InfixOp.notEq ~(| M.var (| "res" |), 1 |) ]] (* then *) ( do~ M.return_ [[ 0 ]] in M.pure BlockUnit.Tt @@ -21,51 +21,51 @@ Definition sqrt (n : F.t) : M.t F.t := ) in (* Var *) do~ M.declare_var "m" [[ ([] : list F.t) ]] in - do~ M.substitute_var "m" [[ 28 ]] in + do~ M.substitute_var "m" [] [[ 28 ]] in (* Var *) do~ M.declare_var "c" [[ ([] : list F.t) ]] in - do~ M.substitute_var "c" [[ 19103219067921713944291392827692070036145651957329286315305642004821462161904 ]] in + do~ M.substitute_var "c" [] [[ 19103219067921713944291392827692070036145651957329286315305642004821462161904 ]] in (* Var *) do~ M.declare_var "t" [[ ([] : list F.t) ]] in - do~ M.substitute_var "t" [[ InfixOp.pow ~(| M.var (| "n" |), 81540058820840996586704275553141814055101440848469862132140264610111 |) ]] in + do~ M.substitute_var "t" [] [[ InfixOp.pow ~(| M.var (| "n" |), 81540058820840996586704275553141814055101440848469862132140264610111 |) ]] in (* Var *) do~ M.declare_var "r" [[ ([] : list F.t) ]] in - do~ M.substitute_var "r" [[ InfixOp.pow ~(| M.var (| "n" |), InfixOp.shiftR ~(| InfixOp.add ~(| 81540058820840996586704275553141814055101440848469862132140264610111, 1 |), 1 |) |) ]] in + do~ M.substitute_var "r" [] [[ InfixOp.pow ~(| M.var (| "n" |), InfixOp.shiftR ~(| InfixOp.add ~(| 81540058820840996586704275553141814055101440848469862132140264610111, 1 |), 1 |) |) ]] in (* Var *) do~ M.declare_var "sq" [[ ([] : list F.t) ]] in - do~ M.substitute_var "sq" [[ 0 ]] in + do~ M.substitute_var "sq" [] [[ 0 ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Var *) do~ M.declare_var "b" [[ ([] : list F.t) ]] in - do~ M.substitute_var "b" [[ 0 ]] in + do~ M.substitute_var "b" [] [[ 0 ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.boolAnd ~(| InfixOp.notEq ~(| M.var (| "r" |), 0 |), InfixOp.notEq ~(| M.var (| "t" |), 1 |) |) ]] ( - do~ M.substitute_var "sq" [[ InfixOp.mul ~(| M.var (| "t" |), M.var (| "t" |) |) ]] in - do~ M.substitute_var "i" [[ 1 ]] in + do~ M.substitute_var "sq" [] [[ InfixOp.mul ~(| M.var (| "t" |), M.var (| "t" |) |) ]] in + do~ M.substitute_var "i" [] [[ 1 ]] in do~ M.while [[ InfixOp.notEq ~(| M.var (| "sq" |), 1 |) ]] ( - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in - do~ M.substitute_var "sq" [[ InfixOp.mul ~(| M.var (| "sq" |), M.var (| "sq" |) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "sq" [] [[ InfixOp.mul ~(| M.var (| "sq" |), M.var (| "sq" |) |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "b" [[ M.var (| "c" |) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "b" [] [[ M.var (| "c" |) ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), InfixOp.sub ~(| InfixOp.sub ~(| M.var (| "m" |), M.var (| "i" |) |), 1 |) |) ]] ( - do~ M.substitute_var "b" [[ InfixOp.mul ~(| M.var (| "b" |), M.var (| "b" |) |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "b" [] [[ InfixOp.mul ~(| M.var (| "b" |), M.var (| "b" |) |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "m" [[ M.var (| "i" |) ]] in - do~ M.substitute_var "c" [[ InfixOp.mul ~(| M.var (| "b" |), M.var (| "b" |) |) ]] in - do~ M.substitute_var "t" [[ InfixOp.mul ~(| M.var (| "t" |), M.var (| "c" |) |) ]] in - do~ M.substitute_var "r" [[ InfixOp.mul ~(| M.var (| "r" |), M.var (| "b" |) |) ]] in + do~ M.substitute_var "m" [] [[ M.var (| "i" |) ]] in + do~ M.substitute_var "c" [] [[ InfixOp.mul ~(| M.var (| "b" |), M.var (| "b" |) |) ]] in + do~ M.substitute_var "t" [] [[ InfixOp.mul ~(| M.var (| "t" |), M.var (| "c" |) |) ]] in + do~ M.substitute_var "r" [] [[ InfixOp.mul ~(| M.var (| "r" |), M.var (| "b" |) |) ]] in M.pure BlockUnit.Tt ) in do~ M.if_ [[ InfixOp.lesser ~(| M.var (| "r" |), 0 |) ]] (* then *) ( - do~ M.substitute_var "r" [[ PrefixOp.sub ~(| M.var (| "r" |) |) ]] in + do~ M.substitute_var "r" [] [[ PrefixOp.sub ~(| M.var (| "r" |) |) ]] in M.pure BlockUnit.Tt ) (* else *) ( M.pure BlockUnit.Tt @@ -82,15 +82,21 @@ Module Bits2PointSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End Bits2PointSignals. (* Template body *) Definition Bits2Point : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 256 ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in + do~ M.declare_signal "out" in M.pure BlockUnit.Tt ). @@ -108,25 +114,31 @@ Module Bits2Point_StrictSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End Bits2Point_StrictSignals. (* Template body *) Definition Bits2Point_Strict : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 256 ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Component *) do~ M.declare_component "aliasCheckY" in - do~ M.substitute_var "aliasCheckY" [[ M.call_function ~(| "AliasCheck", ([] : list F.t) |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "aliasCheckY" [] [[ M.call_function ~(| "AliasCheck", ([] : list F.t) |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 254 |) ]] ( - do~ M.substitute_var "aliasCheckY" [[ M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "aliasCheckY" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.equality_constraint @@ -135,58 +147,58 @@ Definition Bits2Point_Strict : M.t (BlockUnit.t Empty_set) := in (* Component *) do~ M.declare_component "b2nY" in - do~ M.substitute_var "b2nY" [[ M.call_function ~(| "Bits2Num", [ 254 ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "b2nY" [] [[ M.call_function ~(| "Bits2Num", [ 254 ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 254 |) ]] ( - do~ M.substitute_var "b2nY" [[ M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "b2nY" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "b2nY", [Access.Component "out"] |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ M.var_access (| "b2nY", [Access.Component "out"] |) ]] in (* Var *) do~ M.declare_var "a" [[ ([] : list F.t) ]] in - do~ M.substitute_var "a" [[ 168700 ]] in + do~ M.substitute_var "a" [] [[ 168700 ]] in (* Var *) do~ M.declare_var "d" [[ ([] : list F.t) ]] in - do~ M.substitute_var "d" [[ 168696 ]] in + do~ M.substitute_var "d" [] [[ 168696 ]] in (* Var *) do~ M.declare_var "y2" [[ ([] : list F.t) ]] in - do~ M.substitute_var "y2" [[ InfixOp.mul ~(| M.var_access (| "out", [Access.Array (1)] |), M.var_access (| "out", [Access.Array (1)] |) |) ]] in + do~ M.substitute_var "y2" [] [[ InfixOp.mul ~(| M.var_access (| "out", [Access.Array (1)] |), M.var_access (| "out", [Access.Array (1)] |) |) ]] in (* Var *) do~ M.declare_var "x" [[ ([] : list F.t) ]] in - do~ M.substitute_var "x" [[ M.call_function ~(| "sqrt", [ InfixOp.div ~(| InfixOp.sub ~(| 1, M.var (| "y2" |) |), InfixOp.sub ~(| M.var (| "a" |), InfixOp.mul ~(| M.var (| "d" |), M.var (| "y2" |) |) |) |) ] |) ]] in + do~ M.substitute_var "x" [] [[ M.call_function ~(| "sqrt", [ InfixOp.div ~(| InfixOp.sub ~(| 1, M.var (| "y2" |) |), InfixOp.sub ~(| M.var (| "a" |), InfixOp.mul ~(| M.var (| "d" |), M.var (| "y2" |) |) |) |) ] |) ]] in do~ M.if_ [[ InfixOp.eq ~(| M.var_access (| "in", [Access.Array (255)] |), 1 |) ]] (* then *) ( - do~ M.substitute_var "x" [[ PrefixOp.sub ~(| M.var (| "x" |) |) ]] in + do~ M.substitute_var "x" [] [[ PrefixOp.sub ~(| M.var (| "x" |) |) ]] in M.pure BlockUnit.Tt ) (* else *) ( M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var (| "x" |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ M.var (| "x" |) ]] in (* Component *) do~ M.declare_component "babyCheck" in - do~ M.substitute_var "babyCheck" [[ M.call_function ~(| "BabyCheck", ([] : list F.t) |) ]] in - do~ M.substitute_var "babyCheck" [[ M.var_access (| "out", [Access.Array (0)] |) ]] in - do~ M.substitute_var "babyCheck" [[ M.var_access (| "out", [Access.Array (1)] |) ]] in + do~ M.substitute_var "babyCheck" [] [[ M.call_function ~(| "BabyCheck", ([] : list F.t) |) ]] in + do~ M.substitute_var "babyCheck" [Access.Component "x"] [[ M.var_access (| "out", [Access.Array (0)] |) ]] in + do~ M.substitute_var "babyCheck" [Access.Component "y"] [[ M.var_access (| "out", [Access.Array (1)] |) ]] in (* Component *) do~ M.declare_component "n2bX" in - do~ M.substitute_var "n2bX" [[ M.call_function ~(| "Num2Bits", [ 254 ] |) ]] in - do~ M.substitute_var "n2bX" [[ M.var_access (| "out", [Access.Array (0)] |) ]] in + do~ M.substitute_var "n2bX" [] [[ M.call_function ~(| "Num2Bits", [ 254 ] |) ]] in + do~ M.substitute_var "n2bX" [Access.Component "in"] [[ M.var_access (| "out", [Access.Array (0)] |) ]] in (* Component *) do~ M.declare_component "aliasCheckX" in - do~ M.substitute_var "aliasCheckX" [[ M.call_function ~(| "AliasCheck", ([] : list F.t) |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "aliasCheckX" [] [[ M.call_function ~(| "AliasCheck", ([] : list F.t) |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 254 |) ]] ( - do~ M.substitute_var "aliasCheckX" [[ M.var_access (| "n2bX", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "aliasCheckX" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "n2bX", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "signCalc" in - do~ M.substitute_var "signCalc" [[ M.call_function ~(| "CompConstant", [ 10944121435919637611123202872628637544274182200208017171849102093287904247808 ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "signCalc" [] [[ M.call_function ~(| "CompConstant", [ 10944121435919637611123202872628637544274182200208017171849102093287904247808 ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 254 |) ]] ( - do~ M.substitute_var "signCalc" [[ M.var_access (| "n2bX", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "signCalc" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "n2bX", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.equality_constraint @@ -210,15 +222,21 @@ Module Point2BitsSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End Point2BitsSignals. (* Template body *) Definition Point2Bits : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 2 ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 256 ] ]] in + do~ M.declare_signal "out" in M.pure BlockUnit.Tt ). @@ -236,56 +254,62 @@ Module Point2Bits_StrictSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End Point2Bits_StrictSignals. (* Template body *) Definition Point2Bits_Strict : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 2 ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 256 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Component *) do~ M.declare_component "n2bX" in - do~ M.substitute_var "n2bX" [[ M.call_function ~(| "Num2Bits", [ 254 ] |) ]] in - do~ M.substitute_var "n2bX" [[ M.var_access (| "in", [Access.Array (0)] |) ]] in + do~ M.substitute_var "n2bX" [] [[ M.call_function ~(| "Num2Bits", [ 254 ] |) ]] in + do~ M.substitute_var "n2bX" [Access.Component "in"] [[ M.var_access (| "in", [Access.Array (0)] |) ]] in (* Component *) do~ M.declare_component "n2bY" in - do~ M.substitute_var "n2bY" [[ M.call_function ~(| "Num2Bits", [ 254 ] |) ]] in - do~ M.substitute_var "n2bY" [[ M.var_access (| "in", [Access.Array (1)] |) ]] in + do~ M.substitute_var "n2bY" [] [[ M.call_function ~(| "Num2Bits", [ 254 ] |) ]] in + do~ M.substitute_var "n2bY" [Access.Component "in"] [[ M.var_access (| "in", [Access.Array (1)] |) ]] in (* Component *) do~ M.declare_component "aliasCheckX" in - do~ M.substitute_var "aliasCheckX" [[ M.call_function ~(| "AliasCheck", ([] : list F.t) |) ]] in + do~ M.substitute_var "aliasCheckX" [] [[ M.call_function ~(| "AliasCheck", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "aliasCheckY" in - do~ M.substitute_var "aliasCheckY" [[ M.call_function ~(| "AliasCheck", ([] : list F.t) |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "aliasCheckY" [] [[ M.call_function ~(| "AliasCheck", ([] : list F.t) |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 254 |) ]] ( - do~ M.substitute_var "aliasCheckX" [[ M.var_access (| "n2bX", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "aliasCheckY" [[ M.var_access (| "n2bY", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "aliasCheckX" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "n2bX", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "aliasCheckY" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "n2bY", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "signCalc" in - do~ M.substitute_var "signCalc" [[ M.call_function ~(| "CompConstant", [ 10944121435919637611123202872628637544274182200208017171849102093287904247808 ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "signCalc" [] [[ M.call_function ~(| "CompConstant", [ 10944121435919637611123202872628637544274182200208017171849102093287904247808 ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 254 |) ]] ( - do~ M.substitute_var "signCalc" [[ M.var_access (| "n2bX", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "signCalc" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "n2bX", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 254 |) ]] ( - do~ M.substitute_var "out" [[ M.var_access (| "n2bY", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |))] [[ M.var_access (| "n2bY", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ 0 ]] in - do~ M.substitute_var "out" [[ M.var_access (| "signCalc", [Access.Component "out"] |) ]] in + do~ M.substitute_var "out" [Access.Array (254)] [[ 0 ]] in + do~ M.substitute_var "out" [Access.Array (255)] [[ M.var_access (| "signCalc", [Access.Component "out"] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/poseidon.v b/Garden/Circom/Circomlib/translation/circuits/poseidon.v index 8d5a59d..c9d7ba9 100644 --- a/Garden/Circom/Circomlib/translation/circuits/poseidon.v +++ b/Garden/Circom/Circomlib/translation/circuits/poseidon.v @@ -13,22 +13,30 @@ Module SigmaSignals. (* Intermediate *) in4 : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out" + | in2 : P _ in2 "in2" + | in4 : P _ in4 "in4". + End IsNamed. End SigmaSignals. (* Template body *) Definition Sigma : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ ([] : list F.t) ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Signal Intermediate *) - do~ M.declare_signal "in2" [[ ([] : list F.t) ]] in + do~ M.declare_signal "in2" in (* Signal Intermediate *) - do~ M.declare_signal "in4" [[ ([] : list F.t) ]] in - do~ M.substitute_var "in2" [[ InfixOp.mul ~(| M.var (| "in" |), M.var (| "in" |) |) ]] in - do~ M.substitute_var "in4" [[ InfixOp.mul ~(| M.var (| "in2" |), M.var (| "in2" |) |) ]] in - do~ M.substitute_var "out" [[ InfixOp.mul ~(| M.var (| "in4" |), M.var (| "in" |) |) ]] in + do~ M.declare_signal "in4" in + do~ M.substitute_var "in2" [] [[ InfixOp.mul ~(| M.var (| "in" |), M.var (| "in" |) |) ]] in + do~ M.substitute_var "in4" [] [[ InfixOp.mul ~(| M.var (| "in2" |), M.var (| "in2" |) |) ]] in + do~ M.substitute_var "out" [] [[ InfixOp.mul ~(| M.var (| "in4" |), M.var (| "in" |) |) ]] in M.pure BlockUnit.Tt ). @@ -47,21 +55,27 @@ Module ArkSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End ArkSignals. (* Template body *) Definition Ark (t C r : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("t", t); ("C", C); ("r", r)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ M.var (| "t" |) ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ M.var (| "t" |) ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "t" |) |) ]] ( - do~ M.substitute_var "out" [[ InfixOp.add ~(| M.var_access (| "in", [Access.Array (M.var (| "i" |))] |), M.var_access (| "C", [Access.Array (InfixOp.add ~(| M.var (| "i" |), M.var (| "r" |) |))] |) |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |))] [[ InfixOp.add ~(| M.var_access (| "in", [Access.Array (M.var (| "i" |))] |), M.var_access (| "C", [Access.Array (InfixOp.add ~(| M.var (| "i" |), M.var (| "r" |) |))] |) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt @@ -81,33 +95,39 @@ Module MixSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End MixSignals. (* Template body *) Definition Mix (t M : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("t", t); ("M", M)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ M.var (| "t" |) ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ M.var (| "t" |) ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "lc" [[ ([] : list F.t) ]] in - do~ M.substitute_var "lc" [[ 0 ]] in + do~ M.substitute_var "lc" [] [[ 0 ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "t" |) |) ]] ( - do~ M.substitute_var "lc" [[ 0 ]] in + do~ M.substitute_var "lc" [] [[ 0 ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "t" |) |) ]] ( - do~ M.substitute_var "lc" [[ InfixOp.add ~(| M.var (| "lc" |), InfixOp.mul ~(| M.var_access (| "M", [Access.Array (M.var (| "j" |)); Access.Array (M.var (| "i" |))] |), M.var_access (| "in", [Access.Array (M.var (| "j" |))] |) |) |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "lc" [] [[ InfixOp.add ~(| M.var (| "lc" |), InfixOp.mul ~(| M.var_access (| "M", [Access.Array (M.var (| "j" |)); Access.Array (M.var (| "i" |))] |), M.var_access (| "in", [Access.Array (M.var (| "j" |))] |) |) |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var (| "lc" |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |))] [[ M.var (| "lc" |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt @@ -127,27 +147,33 @@ Module MixLastSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End MixLastSignals. (* Template body *) Definition MixLast (t M s : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("t", t); ("M", M); ("s", s)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ M.var (| "t" |) ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "lc" [[ ([] : list F.t) ]] in - do~ M.substitute_var "lc" [[ 0 ]] in + do~ M.substitute_var "lc" [] [[ 0 ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "t" |) |) ]] ( - do~ M.substitute_var "lc" [[ InfixOp.add ~(| M.var (| "lc" |), InfixOp.mul ~(| M.var_access (| "M", [Access.Array (M.var (| "j" |)); Access.Array (M.var (| "s" |))] |), M.var_access (| "in", [Access.Array (M.var (| "j" |))] |) |) |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "lc" [] [[ InfixOp.add ~(| M.var (| "lc" |), InfixOp.mul ~(| M.var_access (| "M", [Access.Array (M.var (| "j" |)); Access.Array (M.var (| "s" |))] |), M.var_access (| "in", [Access.Array (M.var (| "j" |))] |) |) |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var (| "lc" |) ]] in + do~ M.substitute_var "out" [] [[ M.var (| "lc" |) ]] in M.pure BlockUnit.Tt ). @@ -165,33 +191,39 @@ Module MixSSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End MixSSignals. (* Template body *) Definition MixS (t S r : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("t", t); ("S", S); ("r", r)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ M.var (| "t" |) ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ M.var (| "t" |) ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "lc" [[ ([] : list F.t) ]] in - do~ M.substitute_var "lc" [[ 0 ]] in + do~ M.substitute_var "lc" [] [[ 0 ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "t" |) |) ]] ( - do~ M.substitute_var "lc" [[ InfixOp.add ~(| M.var (| "lc" |), InfixOp.mul ~(| M.var_access (| "S", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| InfixOp.sub ~(| InfixOp.mul ~(| M.var (| "t" |), 2 |), 1 |), M.var (| "r" |) |), M.var (| "i" |) |))] |), M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) |) |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "lc" [] [[ InfixOp.add ~(| M.var (| "lc" |), InfixOp.mul ~(| M.var_access (| "S", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| InfixOp.sub ~(| InfixOp.mul ~(| M.var (| "t" |), 2 |), 1 |), M.var (| "r" |) |), M.var (| "i" |) |))] |), M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) |) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var (| "lc" |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ M.var (| "lc" |) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 1 ]] in + do~ M.substitute_var "i" [] [[ 1 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "t" |) |) ]] ( - do~ M.substitute_var "out" [[ InfixOp.add ~(| M.var_access (| "in", [Access.Array (M.var (| "i" |))] |), InfixOp.mul ~(| M.var_access (| "in", [Access.Array (0)] |), M.var_access (| "S", [Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.mul ~(| InfixOp.sub ~(| InfixOp.mul ~(| M.var (| "t" |), 2 |), 1 |), M.var (| "r" |) |), M.var (| "t" |) |), M.var (| "i" |) |), 1 |))] |) |) |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |))] [[ InfixOp.add ~(| M.var_access (| "in", [Access.Array (M.var (| "i" |))] |), InfixOp.mul ~(| M.var_access (| "in", [Access.Array (0)] |), M.var_access (| "S", [Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.mul ~(| InfixOp.sub ~(| InfixOp.mul ~(| M.var (| "t" |), 2 |), 1 |), M.var (| "r" |) |), M.var (| "t" |) |), M.var (| "i" |) |), 1 |))] |) |) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt @@ -213,46 +245,53 @@ Module PoseidonExSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | inputs : P _ inputs "inputs" + | initialState : P _ initialState "initialState" + | out : P _ out "out". + End IsNamed. End PoseidonExSignals. (* Template body *) Definition PoseidonEx (nInputs nOuts : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("nInputs", nInputs); ("nOuts", nOuts)] ( (* Signal Input *) - do~ M.declare_signal "inputs" [[ [ M.var (| "nInputs" |) ] ]] in + do~ M.declare_signal "inputs" in (* Signal Input *) - do~ M.declare_signal "initialState" [[ ([] : list F.t) ]] in + do~ M.declare_signal "initialState" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ M.var (| "nOuts" |) ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "N_ROUNDS_P" [[ [ 16 ] ]] in - do~ M.substitute_var "N_ROUNDS_P" [[ array_with_repeat (0) (16) ]] in - do~ M.substitute_var "N_ROUNDS_P" [[ [ 56; 57; 56; 60; 60; 63; 64; 63; 60; 66; 60; 65; 70; 60; 64; 68 ] ]] in + do~ M.substitute_var "N_ROUNDS_P" [] [[ array_with_repeat (0) (16) ]] in + do~ M.substitute_var "N_ROUNDS_P" [] [[ [ 56; 57; 56; 60; 60; 63; 64; 63; 60; 66; 60; 65; 70; 60; 64; 68 ] ]] in (* Var *) do~ M.declare_var "t" [[ ([] : list F.t) ]] in - do~ M.substitute_var "t" [[ InfixOp.add ~(| M.var (| "nInputs" |), 1 |) ]] in + do~ M.substitute_var "t" [] [[ InfixOp.add ~(| M.var (| "nInputs" |), 1 |) ]] in (* Var *) do~ M.declare_var "nRoundsF" [[ ([] : list F.t) ]] in - do~ M.substitute_var "nRoundsF" [[ 8 ]] in + do~ M.substitute_var "nRoundsF" [] [[ 8 ]] in (* Var *) do~ M.declare_var "nRoundsP" [[ ([] : list F.t) ]] in - do~ M.substitute_var "nRoundsP" [[ M.var_access (| "N_ROUNDS_P", [Access.Array (InfixOp.sub ~(| M.var (| "t" |), 2 |))] |) ]] in + do~ M.substitute_var "nRoundsP" [] [[ M.var_access (| "N_ROUNDS_P", [Access.Array (InfixOp.sub ~(| M.var (| "t" |), 2 |))] |) ]] in (* Var *) do~ M.declare_var "C" [[ [ InfixOp.add ~(| InfixOp.mul ~(| M.var (| "t" |), M.var (| "nRoundsF" |) |), M.var (| "nRoundsP" |) |) ] ]] in - do~ M.substitute_var "C" [[ array_with_repeat (0) (InfixOp.add ~(| InfixOp.mul ~(| M.var (| "t" |), M.var (| "nRoundsF" |) |), M.var (| "nRoundsP" |) |)) ]] in - do~ M.substitute_var "C" [[ M.call_function ~(| "POSEIDON_C", [ M.var (| "t" |) ] |) ]] in + do~ M.substitute_var "C" [] [[ array_with_repeat (0) (InfixOp.add ~(| InfixOp.mul ~(| M.var (| "t" |), M.var (| "nRoundsF" |) |), M.var (| "nRoundsP" |) |)) ]] in + do~ M.substitute_var "C" [] [[ M.call_function ~(| "POSEIDON_C", [ M.var (| "t" |) ] |) ]] in (* Var *) do~ M.declare_var "S" [[ [ InfixOp.mul ~(| M.var_access (| "N_ROUNDS_P", [Access.Array (InfixOp.sub ~(| M.var (| "t" |), 2 |))] |), InfixOp.sub ~(| InfixOp.mul ~(| M.var (| "t" |), 2 |), 1 |) |) ] ]] in - do~ M.substitute_var "S" [[ array_with_repeat (0) (InfixOp.mul ~(| M.var_access (| "N_ROUNDS_P", [Access.Array (InfixOp.sub ~(| M.var (| "t" |), 2 |))] |), InfixOp.sub ~(| InfixOp.mul ~(| M.var (| "t" |), 2 |), 1 |) |)) ]] in - do~ M.substitute_var "S" [[ M.call_function ~(| "POSEIDON_S", [ M.var (| "t" |) ] |) ]] in + do~ M.substitute_var "S" [] [[ array_with_repeat (0) (InfixOp.mul ~(| M.var_access (| "N_ROUNDS_P", [Access.Array (InfixOp.sub ~(| M.var (| "t" |), 2 |))] |), InfixOp.sub ~(| InfixOp.mul ~(| M.var (| "t" |), 2 |), 1 |) |)) ]] in + do~ M.substitute_var "S" [] [[ M.call_function ~(| "POSEIDON_S", [ M.var (| "t" |) ] |) ]] in (* Var *) do~ M.declare_var "M" [[ [ M.var (| "t" |); M.var (| "t" |) ] ]] in - do~ M.substitute_var "M" [[ array_with_repeat (array_with_repeat (0) (M.var (| "t" |))) (M.var (| "t" |)) ]] in - do~ M.substitute_var "M" [[ M.call_function ~(| "POSEIDON_M", [ M.var (| "t" |) ] |) ]] in + do~ M.substitute_var "M" [] [[ array_with_repeat (array_with_repeat (0) (M.var (| "t" |))) (M.var (| "t" |)) ]] in + do~ M.substitute_var "M" [] [[ M.call_function ~(| "POSEIDON_M", [ M.var (| "t" |) ] |) ]] in (* Var *) do~ M.declare_var "P" [[ [ M.var (| "t" |); M.var (| "t" |) ] ]] in - do~ M.substitute_var "P" [[ array_with_repeat (array_with_repeat (0) (M.var (| "t" |))) (M.var (| "t" |)) ]] in - do~ M.substitute_var "P" [[ M.call_function ~(| "POSEIDON_P", [ M.var (| "t" |) ] |) ]] in + do~ M.substitute_var "P" [] [[ array_with_repeat (array_with_repeat (0) (M.var (| "t" |))) (M.var (| "t" |)) ]] in + do~ M.substitute_var "P" [] [[ M.call_function ~(| "POSEIDON_P", [ M.var (| "t" |) ] |) ]] in (* Component *) do~ M.declare_component "ark" in (* Component *) @@ -265,188 +304,188 @@ Definition PoseidonEx (nInputs nOuts : F.t) : M.t (BlockUnit.t Empty_set) := do~ M.declare_component "mixS" in (* Component *) do~ M.declare_component "mixLast" in - do~ M.substitute_var "ark" [[ M.call_function ~(| "Ark", [ M.var (| "t" |); M.var (| "C" |); 0 ] |) ]] in + do~ M.substitute_var "ark" [Access.Array (0)] [[ M.call_function ~(| "Ark", [ M.var (| "t" |); M.var (| "C" |); 0 ] |) ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "t" |) |) ]] ( do~ M.if_ [[ InfixOp.greater ~(| M.var (| "j" |), 0 |) ]] (* then *) ( - do~ M.substitute_var "ark" [[ M.var_access (| "inputs", [Access.Array (InfixOp.sub ~(| M.var (| "j" |), 1 |))] |) ]] in + do~ M.substitute_var "ark" [Access.Array (0); Access.Component "in"; Access.Array (M.var (| "j" |))] [[ M.var_access (| "inputs", [Access.Array (InfixOp.sub ~(| M.var (| "j" |), 1 |))] |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "ark" [[ M.var (| "initialState" |) ]] in + do~ M.substitute_var "ark" [Access.Array (0); Access.Component "in"; Access.Array (M.var (| "j" |))] [[ M.var (| "initialState" |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Var *) do~ M.declare_var "r" [[ ([] : list F.t) ]] in - do~ M.substitute_var "r" [[ 0 ]] in + do~ M.substitute_var "r" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "r" |), InfixOp.sub ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), 1 |) |) ]] ( (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "t" |) |) ]] ( - do~ M.substitute_var "sigmaF" [[ M.call_function ~(| "Sigma", ([] : list F.t) |) ]] in + do~ M.substitute_var "sigmaF" [Access.Array (M.var (| "r" |)); Access.Array (M.var (| "j" |))] [[ M.call_function ~(| "Sigma", ([] : list F.t) |) ]] in do~ M.if_ [[ InfixOp.eq ~(| M.var (| "r" |), 0 |) ]] (* then *) ( - do~ M.substitute_var "sigmaF" [[ M.var_access (| "ark", [Access.Array (0); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in + do~ M.substitute_var "sigmaF" [Access.Array (M.var (| "r" |)); Access.Array (M.var (| "j" |)); Access.Component "in"] [[ M.var_access (| "ark", [Access.Array (0); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "sigmaF" [[ M.var_access (| "mix", [Access.Array (InfixOp.sub ~(| M.var (| "r" |), 1 |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in + do~ M.substitute_var "sigmaF" [Access.Array (M.var (| "r" |)); Access.Array (M.var (| "j" |)); Access.Component "in"] [[ M.var_access (| "mix", [Access.Array (InfixOp.sub ~(| M.var (| "r" |), 1 |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "ark" [[ M.call_function ~(| "Ark", [ M.var (| "t" |); M.var (| "C" |); InfixOp.mul ~(| InfixOp.add ~(| M.var (| "r" |), 1 |), M.var (| "t" |) |) ] |) ]] in + do~ M.substitute_var "ark" [Access.Array (InfixOp.add ~(| M.var (| "r" |), 1 |))] [[ M.call_function ~(| "Ark", [ M.var (| "t" |); M.var (| "C" |); InfixOp.mul ~(| InfixOp.add ~(| M.var (| "r" |), 1 |), M.var (| "t" |) |) ] |) ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "t" |) |) ]] ( - do~ M.substitute_var "ark" [[ M.var_access (| "sigmaF", [Access.Array (M.var (| "r" |)); Access.Array (M.var (| "j" |)); Access.Component "out"] |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "ark" [Access.Array (InfixOp.add ~(| M.var (| "r" |), 1 |)); Access.Component "in"; Access.Array (M.var (| "j" |))] [[ M.var_access (| "sigmaF", [Access.Array (M.var (| "r" |)); Access.Array (M.var (| "j" |)); Access.Component "out"] |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "mix" [[ M.call_function ~(| "Mix", [ M.var (| "t" |); M.var (| "M" |) ] |) ]] in + do~ M.substitute_var "mix" [Access.Array (M.var (| "r" |))] [[ M.call_function ~(| "Mix", [ M.var (| "t" |); M.var (| "M" |) ] |) ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "t" |) |) ]] ( - do~ M.substitute_var "mix" [[ M.var_access (| "ark", [Access.Array (InfixOp.add ~(| M.var (| "r" |), 1 |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "mix" [Access.Array (M.var (| "r" |)); Access.Component "in"; Access.Array (M.var (| "j" |))] [[ M.var_access (| "ark", [Access.Array (InfixOp.add ~(| M.var (| "r" |), 1 |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "r" [[ InfixOp.add ~(| M.var (| "r" |), 1 |) ]] in + do~ M.substitute_var "r" [] [[ InfixOp.add ~(| M.var (| "r" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "t" |) |) ]] ( - do~ M.substitute_var "sigmaF" [[ M.call_function ~(| "Sigma", ([] : list F.t) |) ]] in - do~ M.substitute_var "sigmaF" [[ M.var_access (| "mix", [Access.Array (InfixOp.sub ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), 2 |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "sigmaF" [Access.Array (InfixOp.sub ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), 1 |)); Access.Array (M.var (| "j" |))] [[ M.call_function ~(| "Sigma", ([] : list F.t) |) ]] in + do~ M.substitute_var "sigmaF" [Access.Array (InfixOp.sub ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), 1 |)); Access.Array (M.var (| "j" |)); Access.Component "in"] [[ M.var_access (| "mix", [Access.Array (InfixOp.sub ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), 2 |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "ark" [[ M.call_function ~(| "Ark", [ M.var (| "t" |); M.var (| "C" |); InfixOp.mul ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), M.var (| "t" |) |) ] |) ]] in + do~ M.substitute_var "ark" [Access.Array (InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |))] [[ M.call_function ~(| "Ark", [ M.var (| "t" |); M.var (| "C" |); InfixOp.mul ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), M.var (| "t" |) |) ] |) ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "t" |) |) ]] ( - do~ M.substitute_var "ark" [[ M.var_access (| "sigmaF", [Access.Array (InfixOp.sub ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), 1 |)); Access.Array (M.var (| "j" |)); Access.Component "out"] |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "ark" [Access.Array (InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |)); Access.Component "in"; Access.Array (M.var (| "j" |))] [[ M.var_access (| "sigmaF", [Access.Array (InfixOp.sub ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), 1 |)); Access.Array (M.var (| "j" |)); Access.Component "out"] |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "mix" [[ M.call_function ~(| "Mix", [ M.var (| "t" |); M.var (| "P" |) ] |) ]] in + do~ M.substitute_var "mix" [Access.Array (InfixOp.sub ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), 1 |))] [[ M.call_function ~(| "Mix", [ M.var (| "t" |); M.var (| "P" |) ] |) ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "t" |) |) ]] ( - do~ M.substitute_var "mix" [[ M.var_access (| "ark", [Access.Array (InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "mix" [Access.Array (InfixOp.sub ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), 1 |)); Access.Component "in"; Access.Array (M.var (| "j" |))] [[ M.var_access (| "ark", [Access.Array (InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Var *) do~ M.declare_var "r" [[ ([] : list F.t) ]] in - do~ M.substitute_var "r" [[ 0 ]] in + do~ M.substitute_var "r" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "r" |), M.var (| "nRoundsP" |) |) ]] ( - do~ M.substitute_var "sigmaP" [[ M.call_function ~(| "Sigma", ([] : list F.t) |) ]] in + do~ M.substitute_var "sigmaP" [Access.Array (M.var (| "r" |))] [[ M.call_function ~(| "Sigma", ([] : list F.t) |) ]] in do~ M.if_ [[ InfixOp.eq ~(| M.var (| "r" |), 0 |) ]] (* then *) ( - do~ M.substitute_var "sigmaP" [[ M.var_access (| "mix", [Access.Array (InfixOp.sub ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "sigmaP" [Access.Array (M.var (| "r" |)); Access.Component "in"] [[ M.var_access (| "mix", [Access.Array (InfixOp.sub ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "sigmaP" [[ M.var_access (| "mixS", [Access.Array (InfixOp.sub ~(| M.var (| "r" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "sigmaP" [Access.Array (M.var (| "r" |)); Access.Component "in"] [[ M.var_access (| "mixS", [Access.Array (InfixOp.sub ~(| M.var (| "r" |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "mixS" [[ M.call_function ~(| "MixS", [ M.var (| "t" |); M.var (| "S" |); M.var (| "r" |) ] |) ]] in + do~ M.substitute_var "mixS" [Access.Array (M.var (| "r" |))] [[ M.call_function ~(| "MixS", [ M.var (| "t" |); M.var (| "S" |); M.var (| "r" |) ] |) ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "t" |) |) ]] ( do~ M.if_ [[ InfixOp.eq ~(| M.var (| "j" |), 0 |) ]] (* then *) ( - do~ M.substitute_var "mixS" [[ InfixOp.add ~(| M.var_access (| "sigmaP", [Access.Array (M.var (| "r" |)); Access.Component "out"] |), M.var_access (| "C", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| InfixOp.add ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), 1 |), M.var (| "t" |) |), M.var (| "r" |) |))] |) |) ]] in + do~ M.substitute_var "mixS" [Access.Array (M.var (| "r" |)); Access.Component "in"; Access.Array (M.var (| "j" |))] [[ InfixOp.add ~(| M.var_access (| "sigmaP", [Access.Array (M.var (| "r" |)); Access.Component "out"] |), M.var_access (| "C", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| InfixOp.add ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), 1 |), M.var (| "t" |) |), M.var (| "r" |) |))] |) |) ]] in M.pure BlockUnit.Tt ) (* else *) ( do~ M.if_ [[ InfixOp.eq ~(| M.var (| "r" |), 0 |) ]] (* then *) ( - do~ M.substitute_var "mixS" [[ M.var_access (| "mix", [Access.Array (InfixOp.sub ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), 1 |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in + do~ M.substitute_var "mixS" [Access.Array (M.var (| "r" |)); Access.Component "in"; Access.Array (M.var (| "j" |))] [[ M.var_access (| "mix", [Access.Array (InfixOp.sub ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), 1 |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "mixS" [[ M.var_access (| "mixS", [Access.Array (InfixOp.sub ~(| M.var (| "r" |), 1 |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in + do~ M.substitute_var "mixS" [Access.Array (M.var (| "r" |)); Access.Component "in"; Access.Array (M.var (| "j" |))] [[ M.var_access (| "mixS", [Access.Array (InfixOp.sub ~(| M.var (| "r" |), 1 |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "r" [[ InfixOp.add ~(| M.var (| "r" |), 1 |) ]] in + do~ M.substitute_var "r" [] [[ InfixOp.add ~(| M.var (| "r" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Var *) do~ M.declare_var "r" [[ ([] : list F.t) ]] in - do~ M.substitute_var "r" [[ 0 ]] in + do~ M.substitute_var "r" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "r" |), InfixOp.sub ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), 1 |) |) ]] ( (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "t" |) |) ]] ( - do~ M.substitute_var "sigmaF" [[ M.call_function ~(| "Sigma", ([] : list F.t) |) ]] in + do~ M.substitute_var "sigmaF" [Access.Array (InfixOp.add ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), M.var (| "r" |) |)); Access.Array (M.var (| "j" |))] [[ M.call_function ~(| "Sigma", ([] : list F.t) |) ]] in do~ M.if_ [[ InfixOp.eq ~(| M.var (| "r" |), 0 |) ]] (* then *) ( - do~ M.substitute_var "sigmaF" [[ M.var_access (| "mixS", [Access.Array (InfixOp.sub ~(| M.var (| "nRoundsP" |), 1 |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in + do~ M.substitute_var "sigmaF" [Access.Array (InfixOp.add ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), M.var (| "r" |) |)); Access.Array (M.var (| "j" |)); Access.Component "in"] [[ M.var_access (| "mixS", [Access.Array (InfixOp.sub ~(| M.var (| "nRoundsP" |), 1 |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "sigmaF" [[ M.var_access (| "mix", [Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), M.var (| "r" |) |), 1 |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in + do~ M.substitute_var "sigmaF" [Access.Array (InfixOp.add ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), M.var (| "r" |) |)); Access.Array (M.var (| "j" |)); Access.Component "in"] [[ M.var_access (| "mix", [Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), M.var (| "r" |) |), 1 |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "ark" [[ M.call_function ~(| "Ark", [ M.var (| "t" |); M.var (| "C" |); InfixOp.add ~(| InfixOp.add ~(| InfixOp.mul ~(| InfixOp.add ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), 1 |), M.var (| "t" |) |), M.var (| "nRoundsP" |) |), InfixOp.mul ~(| M.var (| "r" |), M.var (| "t" |) |) |) ] |) ]] in + do~ M.substitute_var "ark" [Access.Array (InfixOp.add ~(| InfixOp.add ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), M.var (| "r" |) |), 1 |))] [[ M.call_function ~(| "Ark", [ M.var (| "t" |); M.var (| "C" |); InfixOp.add ~(| InfixOp.add ~(| InfixOp.mul ~(| InfixOp.add ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), 1 |), M.var (| "t" |) |), M.var (| "nRoundsP" |) |), InfixOp.mul ~(| M.var (| "r" |), M.var (| "t" |) |) |) ] |) ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "t" |) |) ]] ( - do~ M.substitute_var "ark" [[ M.var_access (| "sigmaF", [Access.Array (InfixOp.add ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), M.var (| "r" |) |)); Access.Array (M.var (| "j" |)); Access.Component "out"] |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "ark" [Access.Array (InfixOp.add ~(| InfixOp.add ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), M.var (| "r" |) |), 1 |)); Access.Component "in"; Access.Array (M.var (| "j" |))] [[ M.var_access (| "sigmaF", [Access.Array (InfixOp.add ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), M.var (| "r" |) |)); Access.Array (M.var (| "j" |)); Access.Component "out"] |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "mix" [[ M.call_function ~(| "Mix", [ M.var (| "t" |); M.var (| "M" |) ] |) ]] in + do~ M.substitute_var "mix" [Access.Array (InfixOp.add ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), M.var (| "r" |) |))] [[ M.call_function ~(| "Mix", [ M.var (| "t" |); M.var (| "M" |) ] |) ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "t" |) |) ]] ( - do~ M.substitute_var "mix" [[ M.var_access (| "ark", [Access.Array (InfixOp.add ~(| InfixOp.add ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), M.var (| "r" |) |), 1 |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "mix" [Access.Array (InfixOp.add ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), M.var (| "r" |) |)); Access.Component "in"; Access.Array (M.var (| "j" |))] [[ M.var_access (| "ark", [Access.Array (InfixOp.add ~(| InfixOp.add ~(| InfixOp.intDiv ~(| M.var (| "nRoundsF" |), 2 |), M.var (| "r" |) |), 1 |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "r" [[ InfixOp.add ~(| M.var (| "r" |), 1 |) ]] in + do~ M.substitute_var "r" [] [[ InfixOp.add ~(| M.var (| "r" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "t" |) |) ]] ( - do~ M.substitute_var "sigmaF" [[ M.call_function ~(| "Sigma", ([] : list F.t) |) ]] in - do~ M.substitute_var "sigmaF" [[ M.var_access (| "mix", [Access.Array (InfixOp.sub ~(| M.var (| "nRoundsF" |), 2 |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "sigmaF" [Access.Array (InfixOp.sub ~(| M.var (| "nRoundsF" |), 1 |)); Access.Array (M.var (| "j" |))] [[ M.call_function ~(| "Sigma", ([] : list F.t) |) ]] in + do~ M.substitute_var "sigmaF" [Access.Array (InfixOp.sub ~(| M.var (| "nRoundsF" |), 1 |)); Access.Array (M.var (| "j" |)); Access.Component "in"] [[ M.var_access (| "mix", [Access.Array (InfixOp.sub ~(| M.var (| "nRoundsF" |), 2 |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "nOuts" |) |) ]] ( - do~ M.substitute_var "mixLast" [[ M.call_function ~(| "MixLast", [ M.var (| "t" |); M.var (| "M" |); M.var (| "i" |) ] |) ]] in + do~ M.substitute_var "mixLast" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "MixLast", [ M.var (| "t" |); M.var (| "M" |); M.var (| "i" |) ] |) ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "t" |) |) ]] ( - do~ M.substitute_var "mixLast" [[ M.var_access (| "sigmaF", [Access.Array (InfixOp.sub ~(| M.var (| "nRoundsF" |), 1 |)); Access.Array (M.var (| "j" |)); Access.Component "out"] |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "mixLast" [Access.Array (M.var (| "i" |)); Access.Component "in"; Access.Array (M.var (| "j" |))] [[ M.var_access (| "sigmaF", [Access.Array (InfixOp.sub ~(| M.var (| "nRoundsF" |), 1 |)); Access.Array (M.var (| "j" |)); Access.Component "out"] |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "mixLast", [Access.Array (M.var (| "i" |)); Access.Component "out"] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |))] [[ M.var_access (| "mixLast", [Access.Array (M.var (| "i" |)); Access.Component "out"] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt @@ -466,28 +505,34 @@ Module PoseidonSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | inputs : P _ inputs "inputs" + | out : P _ out "out". + End IsNamed. End PoseidonSignals. (* Template body *) Definition Poseidon (nInputs : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("nInputs", nInputs)] ( (* Signal Input *) - do~ M.declare_signal "inputs" [[ [ M.var (| "nInputs" |) ] ]] in + do~ M.declare_signal "inputs" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "pEx" in - do~ M.substitute_var "pEx" [[ M.call_function ~(| "PoseidonEx", [ M.var (| "nInputs" |); 1 ] |) ]] in - do~ M.substitute_var "pEx" [[ 0 ]] in + do~ M.substitute_var "pEx" [] [[ M.call_function ~(| "PoseidonEx", [ M.var (| "nInputs" |); 1 ] |) ]] in + do~ M.substitute_var "pEx" [Access.Component "initialState"] [[ 0 ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "nInputs" |) |) ]] ( - do~ M.substitute_var "pEx" [[ M.var_access (| "inputs", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "pEx" [Access.Component "inputs"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "inputs", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "pEx", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "pEx", [Access.Component "out"; Access.Array (0)] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/poseidon_old.v b/Garden/Circom/Circomlib/translation/circuits/poseidon_old.v index 4b0830d..285b008 100644 --- a/Garden/Circom/Circomlib/translation/circuits/poseidon_old.v +++ b/Garden/Circom/Circomlib/translation/circuits/poseidon_old.v @@ -13,22 +13,30 @@ Module SigmaSignals. (* Intermediate *) in4 : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out" + | in2 : P _ in2 "in2" + | in4 : P _ in4 "in4". + End IsNamed. End SigmaSignals. (* Template body *) Definition Sigma : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ ([] : list F.t) ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Signal Intermediate *) - do~ M.declare_signal "in2" [[ ([] : list F.t) ]] in + do~ M.declare_signal "in2" in (* Signal Intermediate *) - do~ M.declare_signal "in4" [[ ([] : list F.t) ]] in - do~ M.substitute_var "in2" [[ InfixOp.mul ~(| M.var (| "in" |), M.var (| "in" |) |) ]] in - do~ M.substitute_var "in4" [[ InfixOp.mul ~(| M.var (| "in2" |), M.var (| "in2" |) |) ]] in - do~ M.substitute_var "out" [[ InfixOp.mul ~(| M.var (| "in4" |), M.var (| "in" |) |) ]] in + do~ M.declare_signal "in4" in + do~ M.substitute_var "in2" [] [[ InfixOp.mul ~(| M.var (| "in" |), M.var (| "in" |) |) ]] in + do~ M.substitute_var "in4" [] [[ InfixOp.mul ~(| M.var (| "in2" |), M.var (| "in2" |) |) ]] in + do~ M.substitute_var "out" [] [[ InfixOp.mul ~(| M.var (| "in4" |), M.var (| "in" |) |) ]] in M.pure BlockUnit.Tt ). @@ -47,21 +55,27 @@ Module ArkSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End ArkSignals. (* Template body *) Definition Ark (t C r : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("t", t); ("C", C); ("r", r)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ M.var (| "t" |) ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ M.var (| "t" |) ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "t" |) |) ]] ( - do~ M.substitute_var "out" [[ InfixOp.add ~(| M.var_access (| "in", [Access.Array (M.var (| "i" |))] |), M.var_access (| "C", [Access.Array (InfixOp.add ~(| M.var (| "i" |), M.var (| "r" |) |))] |) |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |))] [[ InfixOp.add ~(| M.var_access (| "in", [Access.Array (M.var (| "i" |))] |), M.var_access (| "C", [Access.Array (InfixOp.add ~(| M.var (| "i" |), M.var (| "r" |) |))] |) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt @@ -81,33 +95,39 @@ Module MixSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End MixSignals. (* Template body *) Definition Mix (t M : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("t", t); ("M", M)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ M.var (| "t" |) ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ M.var (| "t" |) ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "lc" [[ ([] : list F.t) ]] in - do~ M.substitute_var "lc" [[ 0 ]] in + do~ M.substitute_var "lc" [] [[ 0 ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "t" |) |) ]] ( - do~ M.substitute_var "lc" [[ 0 ]] in + do~ M.substitute_var "lc" [] [[ 0 ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "t" |) |) ]] ( - do~ M.substitute_var "lc" [[ InfixOp.add ~(| M.var (| "lc" |), InfixOp.mul ~(| M.var_access (| "M", [Access.Array (M.var (| "i" |)); Access.Array (M.var (| "j" |))] |), M.var_access (| "in", [Access.Array (M.var (| "j" |))] |) |) |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "lc" [] [[ InfixOp.add ~(| M.var (| "lc" |), InfixOp.mul ~(| M.var_access (| "M", [Access.Array (M.var (| "i" |)); Access.Array (M.var (| "j" |))] |), M.var_access (| "in", [Access.Array (M.var (| "j" |))] |) |) |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var (| "lc" |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |))] [[ M.var (| "lc" |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt @@ -127,36 +147,42 @@ Module PoseidonSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | inputs : P _ inputs "inputs" + | out : P _ out "out". + End IsNamed. End PoseidonSignals. (* Template body *) Definition Poseidon (nInputs : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("nInputs", nInputs)] ( (* Signal Input *) - do~ M.declare_signal "inputs" [[ [ M.var (| "nInputs" |) ] ]] in + do~ M.declare_signal "inputs" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "N_ROUNDS_P" [[ [ 16 ] ]] in - do~ M.substitute_var "N_ROUNDS_P" [[ array_with_repeat (0) (16) ]] in - do~ M.substitute_var "N_ROUNDS_P" [[ [ 56; 57; 56; 60; 60; 63; 64; 63; 60; 66; 60; 65; 70; 60; 64; 68 ] ]] in + do~ M.substitute_var "N_ROUNDS_P" [] [[ array_with_repeat (0) (16) ]] in + do~ M.substitute_var "N_ROUNDS_P" [] [[ [ 56; 57; 56; 60; 60; 63; 64; 63; 60; 66; 60; 65; 70; 60; 64; 68 ] ]] in (* Var *) do~ M.declare_var "t" [[ ([] : list F.t) ]] in - do~ M.substitute_var "t" [[ InfixOp.add ~(| M.var (| "nInputs" |), 1 |) ]] in + do~ M.substitute_var "t" [] [[ InfixOp.add ~(| M.var (| "nInputs" |), 1 |) ]] in (* Var *) do~ M.declare_var "nRoundsF" [[ ([] : list F.t) ]] in - do~ M.substitute_var "nRoundsF" [[ 8 ]] in + do~ M.substitute_var "nRoundsF" [] [[ 8 ]] in (* Var *) do~ M.declare_var "nRoundsP" [[ ([] : list F.t) ]] in - do~ M.substitute_var "nRoundsP" [[ M.var_access (| "N_ROUNDS_P", [Access.Array (InfixOp.sub ~(| M.var (| "t" |), 2 |))] |) ]] in + do~ M.substitute_var "nRoundsP" [] [[ M.var_access (| "N_ROUNDS_P", [Access.Array (InfixOp.sub ~(| M.var (| "t" |), 2 |))] |) ]] in (* Var *) do~ M.declare_var "C" [[ [ InfixOp.mul ~(| M.var (| "t" |), InfixOp.add ~(| M.var (| "nRoundsF" |), M.var (| "nRoundsP" |) |) |) ] ]] in - do~ M.substitute_var "C" [[ array_with_repeat (0) (InfixOp.mul ~(| M.var (| "t" |), InfixOp.add ~(| M.var (| "nRoundsF" |), M.var (| "nRoundsP" |) |) |)) ]] in - do~ M.substitute_var "C" [[ M.call_function ~(| "POSEIDON_C", [ M.var (| "t" |) ] |) ]] in + do~ M.substitute_var "C" [] [[ array_with_repeat (0) (InfixOp.mul ~(| M.var (| "t" |), InfixOp.add ~(| M.var (| "nRoundsF" |), M.var (| "nRoundsP" |) |) |)) ]] in + do~ M.substitute_var "C" [] [[ M.call_function ~(| "POSEIDON_C", [ M.var (| "t" |) ] |) ]] in (* Var *) do~ M.declare_var "M" [[ [ M.var (| "t" |); M.var (| "t" |) ] ]] in - do~ M.substitute_var "M" [[ array_with_repeat (array_with_repeat (0) (M.var (| "t" |))) (M.var (| "t" |)) ]] in - do~ M.substitute_var "M" [[ M.call_function ~(| "POSEIDON_M", [ M.var (| "t" |) ] |) ]] in + do~ M.substitute_var "M" [] [[ array_with_repeat (array_with_repeat (0) (M.var (| "t" |))) (M.var (| "t" |)) ]] in + do~ M.substitute_var "M" [] [[ M.call_function ~(| "POSEIDON_M", [ M.var (| "t" |) ] |) ]] in (* Component *) do~ M.declare_component "ark" in (* Component *) @@ -167,66 +193,66 @@ Definition Poseidon (nInputs : F.t) : M.t (BlockUnit.t Empty_set) := do~ M.declare_component "mix" in (* Var *) do~ M.declare_var "k" [[ ([] : list F.t) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), InfixOp.add ~(| M.var (| "nRoundsF" |), M.var (| "nRoundsP" |) |) |) ]] ( - do~ M.substitute_var "ark" [[ M.call_function ~(| "Ark", [ M.var (| "t" |); M.var (| "C" |); InfixOp.mul ~(| M.var (| "t" |), M.var (| "i" |) |) ] |) ]] in + do~ M.substitute_var "ark" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "Ark", [ M.var (| "t" |); M.var (| "C" |); InfixOp.mul ~(| M.var (| "t" |), M.var (| "i" |) |) ] |) ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "t" |) |) ]] ( do~ M.if_ [[ InfixOp.eq ~(| M.var (| "i" |), 0 |) ]] (* then *) ( do~ M.if_ [[ InfixOp.greater ~(| M.var (| "j" |), 0 |) ]] (* then *) ( - do~ M.substitute_var "ark" [[ M.var_access (| "inputs", [Access.Array (InfixOp.sub ~(| M.var (| "j" |), 1 |))] |) ]] in + do~ M.substitute_var "ark" [Access.Array (M.var (| "i" |)); Access.Component "in"; Access.Array (M.var (| "j" |))] [[ M.var_access (| "inputs", [Access.Array (InfixOp.sub ~(| M.var (| "j" |), 1 |))] |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "ark" [[ 0 ]] in + do~ M.substitute_var "ark" [Access.Array (M.var (| "i" |)); Access.Component "in"; Access.Array (M.var (| "j" |))] [[ 0 ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "ark" [[ M.var_access (| "mix", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in + do~ M.substitute_var "ark" [Access.Array (M.var (| "i" |)); Access.Component "in"; Access.Array (M.var (| "j" |))] [[ M.var_access (| "mix", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.if_ [[ InfixOp.boolOr ~(| InfixOp.lesser ~(| M.var (| "i" |), InfixOp.div ~(| M.var (| "nRoundsF" |), 2 |) |), InfixOp.greaterEq ~(| M.var (| "i" |), InfixOp.add ~(| M.var (| "nRoundsP" |), InfixOp.div ~(| M.var (| "nRoundsF" |), 2 |) |) |) |) ]] (* then *) ( - do~ M.substitute_var "k" [[ ternary_expression (InfixOp.lesser ~(| M.var (| "i" |), InfixOp.div ~(| M.var (| "nRoundsF" |), 2 |) |)) (M.var (| "i" |)) (InfixOp.sub ~(| M.var (| "i" |), M.var (| "nRoundsP" |) |)) ]] in - do~ M.substitute_var "mix" [[ M.call_function ~(| "Mix", [ M.var (| "t" |); M.var (| "M" |) ] |) ]] in + do~ M.substitute_var "k" [] [[ ternary_expression (InfixOp.lesser ~(| M.var (| "i" |), InfixOp.div ~(| M.var (| "nRoundsF" |), 2 |) |)) (M.var (| "i" |)) (InfixOp.sub ~(| M.var (| "i" |), M.var (| "nRoundsP" |) |)) ]] in + do~ M.substitute_var "mix" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "Mix", [ M.var (| "t" |); M.var (| "M" |) ] |) ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "t" |) |) ]] ( - do~ M.substitute_var "sigmaF" [[ M.call_function ~(| "Sigma", ([] : list F.t) |) ]] in - do~ M.substitute_var "sigmaF" [[ M.var_access (| "ark", [Access.Array (M.var (| "i" |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in - do~ M.substitute_var "mix" [[ M.var_access (| "sigmaF", [Access.Array (M.var (| "k" |)); Access.Array (M.var (| "j" |)); Access.Component "out"] |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "sigmaF" [Access.Array (M.var (| "k" |)); Access.Array (M.var (| "j" |))] [[ M.call_function ~(| "Sigma", ([] : list F.t) |) ]] in + do~ M.substitute_var "sigmaF" [Access.Array (M.var (| "k" |)); Access.Array (M.var (| "j" |)); Access.Component "in"] [[ M.var_access (| "ark", [Access.Array (M.var (| "i" |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in + do~ M.substitute_var "mix" [Access.Array (M.var (| "i" |)); Access.Component "in"; Access.Array (M.var (| "j" |))] [[ M.var_access (| "sigmaF", [Access.Array (M.var (| "k" |)); Access.Array (M.var (| "j" |)); Access.Component "out"] |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "k" [[ InfixOp.sub ~(| M.var (| "i" |), InfixOp.div ~(| M.var (| "nRoundsF" |), 2 |) |) ]] in - do~ M.substitute_var "mix" [[ M.call_function ~(| "Mix", [ M.var (| "t" |); M.var (| "M" |) ] |) ]] in - do~ M.substitute_var "sigmaP" [[ M.call_function ~(| "Sigma", ([] : list F.t) |) ]] in - do~ M.substitute_var "sigmaP" [[ M.var_access (| "ark", [Access.Array (M.var (| "i" |)); Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "mix" [[ M.var_access (| "sigmaP", [Access.Array (M.var (| "k" |)); Access.Component "out"] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.sub ~(| M.var (| "i" |), InfixOp.div ~(| M.var (| "nRoundsF" |), 2 |) |) ]] in + do~ M.substitute_var "mix" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "Mix", [ M.var (| "t" |); M.var (| "M" |) ] |) ]] in + do~ M.substitute_var "sigmaP" [Access.Array (M.var (| "k" |))] [[ M.call_function ~(| "Sigma", ([] : list F.t) |) ]] in + do~ M.substitute_var "sigmaP" [Access.Array (M.var (| "k" |)); Access.Component "in"] [[ M.var_access (| "ark", [Access.Array (M.var (| "i" |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "mix" [Access.Array (M.var (| "i" |)); Access.Component "in"; Access.Array (0)] [[ M.var_access (| "sigmaP", [Access.Array (M.var (| "k" |)); Access.Component "out"] |) ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 1 ]] in + do~ M.substitute_var "j" [] [[ 1 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), M.var (| "t" |) |) ]] ( - do~ M.substitute_var "mix" [[ M.var_access (| "ark", [Access.Array (M.var (| "i" |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "mix" [Access.Array (M.var (| "i" |)); Access.Component "in"; Access.Array (M.var (| "j" |))] [[ M.var_access (| "ark", [Access.Array (M.var (| "i" |)); Access.Component "out"; Access.Array (M.var (| "j" |))] |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "mix", [Access.Array (InfixOp.sub ~(| InfixOp.add ~(| M.var (| "nRoundsF" |), M.var (| "nRoundsP" |) |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "mix", [Access.Array (InfixOp.sub ~(| InfixOp.add ~(| M.var (| "nRoundsF" |), M.var (| "nRoundsP" |) |), 1 |)); Access.Component "out"; Access.Array (0)] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/sha256/ch.v b/Garden/Circom/Circomlib/translation/circuits/sha256/ch.v index 64d0b5d..71c97eb 100644 --- a/Garden/Circom/Circomlib/translation/circuits/sha256/ch.v +++ b/Garden/Circom/Circomlib/translation/circuits/sha256/ch.v @@ -13,25 +13,33 @@ Module Ch_tSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | a : P _ a "a" + | b : P _ b "b" + | c : P _ c "c" + | out : P _ out "out". + End IsNamed. End Ch_tSignals. (* Template body *) Definition Ch_t (n : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n)] ( (* Signal Input *) - do~ M.declare_signal "a" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a" in (* Signal Input *) - do~ M.declare_signal "b" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "b" in (* Signal Input *) - do~ M.declare_signal "c" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "c" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "k" [[ ([] : list F.t) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), M.var (| "n" |) |) ]] ( - do~ M.substitute_var "out" [[ InfixOp.add ~(| InfixOp.mul ~(| M.var_access (| "a", [Access.Array (M.var (| "k" |))] |), InfixOp.sub ~(| M.var_access (| "b", [Access.Array (M.var (| "k" |))] |), M.var_access (| "c", [Access.Array (M.var (| "k" |))] |) |) |), M.var_access (| "c", [Access.Array (M.var (| "k" |))] |) |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "k" |))] [[ InfixOp.add ~(| InfixOp.mul ~(| M.var_access (| "a", [Access.Array (M.var (| "k" |))] |), InfixOp.sub ~(| M.var_access (| "b", [Access.Array (M.var (| "k" |))] |), M.var_access (| "c", [Access.Array (M.var (| "k" |))] |) |) |), M.var_access (| "c", [Access.Array (M.var (| "k" |))] |) |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt diff --git a/Garden/Circom/Circomlib/translation/circuits/sha256/constants.v b/Garden/Circom/Circomlib/translation/circuits/sha256/constants.v index 75b9b8c..b7e5715 100644 --- a/Garden/Circom/Circomlib/translation/circuits/sha256/constants.v +++ b/Garden/Circom/Circomlib/translation/circuits/sha256/constants.v @@ -7,23 +7,28 @@ Module HSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | out : P _ out "out". + End IsNamed. End HSignals. (* Template body *) Definition H (x : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("x", x)] ( (* Signal Output *) - do~ M.declare_signal "out" [[ [ 32 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "c" [[ [ 8 ] ]] in - do~ M.substitute_var "c" [[ array_with_repeat (0) (8) ]] in - do~ M.substitute_var "c" [[ [ 1779033703; 3144134277; 1013904242; 2773480762; 1359893119; 2600822924; 528734635; 1541459225 ] ]] in + do~ M.substitute_var "c" [] [[ array_with_repeat (0) (8) ]] in + do~ M.substitute_var "c" [] [[ [ 1779033703; 3144134277; 1013904242; 2773480762; 1359893119; 2600822924; 528734635; 1541459225 ] ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 32 |) ]] ( - do~ M.substitute_var "out" [[ InfixOp.bitAnd ~(| InfixOp.shiftR ~(| M.var_access (| "c", [Access.Array (M.var (| "x" |))] |), M.var (| "i" |) |), 1 |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |))] [[ InfixOp.bitAnd ~(| InfixOp.shiftR ~(| M.var_access (| "c", [Access.Array (M.var (| "x" |))] |), M.var (| "i" |) |), 1 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt @@ -41,23 +46,28 @@ Module KSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | out : P _ out "out". + End IsNamed. End KSignals. (* Template body *) Definition K (x : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("x", x)] ( (* Signal Output *) - do~ M.declare_signal "out" [[ [ 32 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "c" [[ [ 64 ] ]] in - do~ M.substitute_var "c" [[ array_with_repeat (0) (64) ]] in - do~ M.substitute_var "c" [[ [ 1116352408; 1899447441; 3049323471; 3921009573; 961987163; 1508970993; 2453635748; 2870763221; 3624381080; 310598401; 607225278; 1426881987; 1925078388; 2162078206; 2614888103; 3248222580; 3835390401; 4022224774; 264347078; 604807628; 770255983; 1249150122; 1555081692; 1996064986; 2554220882; 2821834349; 2952996808; 3210313671; 3336571891; 3584528711; 113926993; 338241895; 666307205; 773529912; 1294757372; 1396182291; 1695183700; 1986661051; 2177026350; 2456956037; 2730485921; 2820302411; 3259730800; 3345764771; 3516065817; 3600352804; 4094571909; 275423344; 430227734; 506948616; 659060556; 883997877; 958139571; 1322822218; 1537002063; 1747873779; 1955562222; 2024104815; 2227730452; 2361852424; 2428436474; 2756734187; 3204031479; 3329325298 ] ]] in + do~ M.substitute_var "c" [] [[ array_with_repeat (0) (64) ]] in + do~ M.substitute_var "c" [] [[ [ 1116352408; 1899447441; 3049323471; 3921009573; 961987163; 1508970993; 2453635748; 2870763221; 3624381080; 310598401; 607225278; 1426881987; 1925078388; 2162078206; 2614888103; 3248222580; 3835390401; 4022224774; 264347078; 604807628; 770255983; 1249150122; 1555081692; 1996064986; 2554220882; 2821834349; 2952996808; 3210313671; 3336571891; 3584528711; 113926993; 338241895; 666307205; 773529912; 1294757372; 1396182291; 1695183700; 1986661051; 2177026350; 2456956037; 2730485921; 2820302411; 3259730800; 3345764771; 3516065817; 3600352804; 4094571909; 275423344; 430227734; 506948616; 659060556; 883997877; 958139571; 1322822218; 1537002063; 1747873779; 1955562222; 2024104815; 2227730452; 2361852424; 2428436474; 2756734187; 3204031479; 3329325298 ] ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 32 |) ]] ( - do~ M.substitute_var "out" [[ InfixOp.bitAnd ~(| InfixOp.shiftR ~(| M.var_access (| "c", [Access.Array (M.var (| "x" |))] |), M.var (| "i" |) |), 1 |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |))] [[ InfixOp.bitAnd ~(| InfixOp.shiftR ~(| M.var_access (| "c", [Access.Array (M.var (| "x" |))] |), M.var (| "i" |) |), 1 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt diff --git a/Garden/Circom/Circomlib/translation/circuits/sha256/main.v b/Garden/Circom/Circomlib/translation/circuits/sha256/main.v index 1f24b93..5e1924a 100644 --- a/Garden/Circom/Circomlib/translation/circuits/sha256/main.v +++ b/Garden/Circom/Circomlib/translation/circuits/sha256/main.v @@ -11,23 +11,30 @@ Module MainSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | a : P _ a "a" + | b : P _ b "b" + | out : P _ out "out". + End IsNamed. End MainSignals. (* Template body *) Definition Main : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "a" [[ ([] : list F.t) ]] in + do~ M.declare_signal "a" in (* Signal Input *) - do~ M.declare_signal "b" [[ ([] : list F.t) ]] in + do~ M.declare_signal "b" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "sha256_2" in - do~ M.substitute_var "sha256_2" [[ M.call_function ~(| "Sha256_2", ([] : list F.t) |) ]] in - do~ M.substitute_var "sha256_2" [[ M.var (| "a" |) ]] in - do~ M.substitute_var "sha256_2" [[ M.var (| "a" |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "sha256_2", [Access.Component "out"] |) ]] in + do~ M.substitute_var "sha256_2" [] [[ M.call_function ~(| "Sha256_2", ([] : list F.t) |) ]] in + do~ M.substitute_var "sha256_2" [Access.Component "a"] [[ M.var (| "a" |) ]] in + do~ M.substitute_var "sha256_2" [Access.Component "b"] [[ M.var (| "a" |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "sha256_2", [Access.Component "out"] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/sha256/maj.v b/Garden/Circom/Circomlib/translation/circuits/sha256/maj.v index f9ee8fc..22da3ac 100644 --- a/Garden/Circom/Circomlib/translation/circuits/sha256/maj.v +++ b/Garden/Circom/Circomlib/translation/circuits/sha256/maj.v @@ -15,28 +15,37 @@ Module Maj_tSignals. (* Intermediate *) mid : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | a : P _ a "a" + | b : P _ b "b" + | c : P _ c "c" + | out : P _ out "out" + | mid : P _ mid "mid". + End IsNamed. End Maj_tSignals. (* Template body *) Definition Maj_t (n : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n)] ( (* Signal Input *) - do~ M.declare_signal "a" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a" in (* Signal Input *) - do~ M.declare_signal "b" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "b" in (* Signal Input *) - do~ M.declare_signal "c" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "c" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "out" in (* Signal Intermediate *) - do~ M.declare_signal "mid" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "mid" in (* Var *) do~ M.declare_var "k" [[ ([] : list F.t) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), M.var (| "n" |) |) ]] ( - do~ M.substitute_var "mid" [[ InfixOp.mul ~(| M.var_access (| "b", [Access.Array (M.var (| "k" |))] |), M.var_access (| "c", [Access.Array (M.var (| "k" |))] |) |) ]] in - do~ M.substitute_var "out" [[ InfixOp.add ~(| InfixOp.mul ~(| M.var_access (| "a", [Access.Array (M.var (| "k" |))] |), InfixOp.sub ~(| InfixOp.add ~(| M.var_access (| "b", [Access.Array (M.var (| "k" |))] |), M.var_access (| "c", [Access.Array (M.var (| "k" |))] |) |), InfixOp.mul ~(| 2, M.var_access (| "mid", [Access.Array (M.var (| "k" |))] |) |) |) |), M.var_access (| "mid", [Access.Array (M.var (| "k" |))] |) |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "mid" [Access.Array (M.var (| "k" |))] [[ InfixOp.mul ~(| M.var_access (| "b", [Access.Array (M.var (| "k" |))] |), M.var_access (| "c", [Access.Array (M.var (| "k" |))] |) |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "k" |))] [[ InfixOp.add ~(| InfixOp.mul ~(| M.var_access (| "a", [Access.Array (M.var (| "k" |))] |), InfixOp.sub ~(| InfixOp.add ~(| M.var_access (| "b", [Access.Array (M.var (| "k" |))] |), M.var_access (| "c", [Access.Array (M.var (| "k" |))] |) |), InfixOp.mul ~(| 2, M.var_access (| "mid", [Access.Array (M.var (| "k" |))] |) |) |) |), M.var_access (| "mid", [Access.Array (M.var (| "k" |))] |) |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt diff --git a/Garden/Circom/Circomlib/translation/circuits/sha256/rotate.v b/Garden/Circom/Circomlib/translation/circuits/sha256/rotate.v index ce5404f..b7ce8d1 100644 --- a/Garden/Circom/Circomlib/translation/circuits/sha256/rotate.v +++ b/Garden/Circom/Circomlib/translation/circuits/sha256/rotate.v @@ -9,21 +9,27 @@ Module RotRSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End RotRSignals. (* Template body *) Definition RotR (n r : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n); ("r", r)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "n" |) |) ]] ( - do~ M.substitute_var "out" [[ M.var_access (| "in", [Access.Array (InfixOp.mod_ ~(| InfixOp.add ~(| M.var (| "i" |), M.var (| "r" |) |), M.var (| "n" |) |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |))] [[ M.var_access (| "in", [Access.Array (InfixOp.mod_ ~(| InfixOp.add ~(| M.var (| "i" |), M.var (| "r" |) |), M.var (| "n" |) |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt diff --git a/Garden/Circom/Circomlib/translation/circuits/sha256/sha256.v b/Garden/Circom/Circomlib/translation/circuits/sha256/sha256.v index 10c4815..531d1bc 100644 --- a/Garden/Circom/Circomlib/translation/circuits/sha256/sha256.v +++ b/Garden/Circom/Circomlib/translation/circuits/sha256/sha256.v @@ -11,122 +11,129 @@ Module Sha256Signals. (* Intermediate *) paddedIn : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out" + | paddedIn : P _ paddedIn "paddedIn". + End IsNamed. End Sha256Signals. (* Template body *) Definition Sha256 (nBits : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("nBits", nBits)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ M.var (| "nBits" |) ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 256 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Var *) do~ M.declare_var "k" [[ ([] : list F.t) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in (* Var *) do~ M.declare_var "nBlocks" [[ ([] : list F.t) ]] in - do~ M.substitute_var "nBlocks" [[ 0 ]] in + do~ M.substitute_var "nBlocks" [] [[ 0 ]] in (* Var *) do~ M.declare_var "bitsLastBlock" [[ ([] : list F.t) ]] in - do~ M.substitute_var "bitsLastBlock" [[ 0 ]] in - do~ M.substitute_var "nBlocks" [[ InfixOp.add ~(| InfixOp.intDiv ~(| InfixOp.add ~(| M.var (| "nBits" |), 64 |), 512 |), 1 |) ]] in + do~ M.substitute_var "bitsLastBlock" [] [[ 0 ]] in + do~ M.substitute_var "nBlocks" [] [[ InfixOp.add ~(| InfixOp.intDiv ~(| InfixOp.add ~(| M.var (| "nBits" |), 64 |), 512 |), 1 |) ]] in (* Signal Intermediate *) - do~ M.declare_signal "paddedIn" [[ [ InfixOp.mul ~(| M.var (| "nBlocks" |), 512 |) ] ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.declare_signal "paddedIn" in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), M.var (| "nBits" |) |) ]] ( - do~ M.substitute_var "paddedIn" [[ M.var_access (| "in", [Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "paddedIn" [Access.Array (M.var (| "k" |))] [[ M.var_access (| "in", [Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "paddedIn" [[ 1 ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "nBits" |), 1 |) ]] in + do~ M.substitute_var "paddedIn" [Access.Array (M.var (| "nBits" |))] [[ 1 ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "nBits" |), 1 |) ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), InfixOp.sub ~(| InfixOp.mul ~(| M.var (| "nBlocks" |), 512 |), 64 |) |) ]] ( - do~ M.substitute_var "paddedIn" [[ 0 ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "paddedIn" [Access.Array (M.var (| "k" |))] [[ 0 ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 64 |) ]] ( - do~ M.substitute_var "paddedIn" [[ InfixOp.bitAnd ~(| InfixOp.shiftR ~(| M.var (| "nBits" |), M.var (| "k" |) |), 1 |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "paddedIn" [Access.Array (InfixOp.sub ~(| InfixOp.sub ~(| InfixOp.mul ~(| M.var (| "nBlocks" |), 512 |), M.var (| "k" |) |), 1 |))] [[ InfixOp.bitAnd ~(| InfixOp.shiftR ~(| M.var (| "nBits" |), M.var (| "k" |) |), 1 |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "ha0" in - do~ M.substitute_var "ha0" [[ M.call_function ~(| "H", [ 0 ] |) ]] in + do~ M.substitute_var "ha0" [] [[ M.call_function ~(| "H", [ 0 ] |) ]] in (* Component *) do~ M.declare_component "hb0" in - do~ M.substitute_var "hb0" [[ M.call_function ~(| "H", [ 1 ] |) ]] in + do~ M.substitute_var "hb0" [] [[ M.call_function ~(| "H", [ 1 ] |) ]] in (* Component *) do~ M.declare_component "hc0" in - do~ M.substitute_var "hc0" [[ M.call_function ~(| "H", [ 2 ] |) ]] in + do~ M.substitute_var "hc0" [] [[ M.call_function ~(| "H", [ 2 ] |) ]] in (* Component *) do~ M.declare_component "hd0" in - do~ M.substitute_var "hd0" [[ M.call_function ~(| "H", [ 3 ] |) ]] in + do~ M.substitute_var "hd0" [] [[ M.call_function ~(| "H", [ 3 ] |) ]] in (* Component *) do~ M.declare_component "he0" in - do~ M.substitute_var "he0" [[ M.call_function ~(| "H", [ 4 ] |) ]] in + do~ M.substitute_var "he0" [] [[ M.call_function ~(| "H", [ 4 ] |) ]] in (* Component *) do~ M.declare_component "hf0" in - do~ M.substitute_var "hf0" [[ M.call_function ~(| "H", [ 5 ] |) ]] in + do~ M.substitute_var "hf0" [] [[ M.call_function ~(| "H", [ 5 ] |) ]] in (* Component *) do~ M.declare_component "hg0" in - do~ M.substitute_var "hg0" [[ M.call_function ~(| "H", [ 6 ] |) ]] in + do~ M.substitute_var "hg0" [] [[ M.call_function ~(| "H", [ 6 ] |) ]] in (* Component *) do~ M.declare_component "hh0" in - do~ M.substitute_var "hh0" [[ M.call_function ~(| "H", [ 7 ] |) ]] in + do~ M.substitute_var "hh0" [] [[ M.call_function ~(| "H", [ 7 ] |) ]] in (* Component *) do~ M.declare_component "sha256compression" in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "nBlocks" |) |) ]] ( - do~ M.substitute_var "sha256compression" [[ M.call_function ~(| "Sha256compression", ([] : list F.t) |) ]] in + do~ M.substitute_var "sha256compression" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "Sha256compression", ([] : list F.t) |) ]] in do~ M.if_ [[ InfixOp.eq ~(| M.var (| "i" |), 0 |) ]] (* then *) ( - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "sha256compression" [[ M.var_access (| "ha0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sha256compression" [[ M.var_access (| "hb0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sha256compression" [[ M.var_access (| "hc0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sha256compression" [[ M.var_access (| "hd0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sha256compression" [[ M.var_access (| "he0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sha256compression" [[ M.var_access (| "hf0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sha256compression" [[ M.var_access (| "hg0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sha256compression" [[ M.var_access (| "hh0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "sha256compression" [Access.Array (M.var (| "i" |)); Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 0, 32 |), M.var (| "k" |) |))] [[ M.var_access (| "ha0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sha256compression" [Access.Array (M.var (| "i" |)); Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 1, 32 |), M.var (| "k" |) |))] [[ M.var_access (| "hb0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sha256compression" [Access.Array (M.var (| "i" |)); Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 2, 32 |), M.var (| "k" |) |))] [[ M.var_access (| "hc0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sha256compression" [Access.Array (M.var (| "i" |)); Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 3, 32 |), M.var (| "k" |) |))] [[ M.var_access (| "hd0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sha256compression" [Access.Array (M.var (| "i" |)); Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 4, 32 |), M.var (| "k" |) |))] [[ M.var_access (| "he0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sha256compression" [Access.Array (M.var (| "i" |)); Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 5, 32 |), M.var (| "k" |) |))] [[ M.var_access (| "hf0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sha256compression" [Access.Array (M.var (| "i" |)); Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 6, 32 |), M.var (| "k" |) |))] [[ M.var_access (| "hg0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sha256compression" [Access.Array (M.var (| "i" |)); Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 7, 32 |), M.var (| "k" |) |))] [[ M.var_access (| "hh0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "sha256compression" [[ M.var_access (| "sha256compression", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| 32, 0 |), 31 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "sha256compression" [[ M.var_access (| "sha256compression", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| 32, 1 |), 31 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "sha256compression" [[ M.var_access (| "sha256compression", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| 32, 2 |), 31 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "sha256compression" [[ M.var_access (| "sha256compression", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| 32, 3 |), 31 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "sha256compression" [[ M.var_access (| "sha256compression", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| 32, 4 |), 31 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "sha256compression" [[ M.var_access (| "sha256compression", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| 32, 5 |), 31 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "sha256compression" [[ M.var_access (| "sha256compression", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| 32, 6 |), 31 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "sha256compression" [[ M.var_access (| "sha256compression", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| 32, 7 |), 31 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "sha256compression" [Access.Array (M.var (| "i" |)); Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 0 |), M.var (| "k" |) |))] [[ M.var_access (| "sha256compression", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| 32, 0 |), 31 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "sha256compression" [Access.Array (M.var (| "i" |)); Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 1 |), M.var (| "k" |) |))] [[ M.var_access (| "sha256compression", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| 32, 1 |), 31 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "sha256compression" [Access.Array (M.var (| "i" |)); Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 2 |), M.var (| "k" |) |))] [[ M.var_access (| "sha256compression", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| 32, 2 |), 31 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "sha256compression" [Access.Array (M.var (| "i" |)); Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 3 |), M.var (| "k" |) |))] [[ M.var_access (| "sha256compression", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| 32, 3 |), 31 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "sha256compression" [Access.Array (M.var (| "i" |)); Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 4 |), M.var (| "k" |) |))] [[ M.var_access (| "sha256compression", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| 32, 4 |), 31 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "sha256compression" [Access.Array (M.var (| "i" |)); Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 5 |), M.var (| "k" |) |))] [[ M.var_access (| "sha256compression", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| 32, 5 |), 31 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "sha256compression" [Access.Array (M.var (| "i" |)); Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 6 |), M.var (| "k" |) |))] [[ M.var_access (| "sha256compression", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| 32, 6 |), 31 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "sha256compression" [Access.Array (M.var (| "i" |)); Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 7 |), M.var (| "k" |) |))] [[ M.var_access (| "sha256compression", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"; Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| 32, 7 |), 31 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 512 |) ]] ( - do~ M.substitute_var "sha256compression" [[ M.var_access (| "paddedIn", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| M.var (| "i" |), 512 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "sha256compression" [Access.Array (M.var (| "i" |)); Access.Component "inp"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "paddedIn", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| M.var (| "i" |), 512 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 256 |) ]] ( - do~ M.substitute_var "out" [[ M.var_access (| "sha256compression", [Access.Array (InfixOp.sub ~(| M.var (| "nBlocks" |), 1 |)); Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "k" |))] [[ M.var_access (| "sha256compression", [Access.Array (InfixOp.sub ~(| M.var (| "nBlocks" |), 1 |)); Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt diff --git a/Garden/Circom/Circomlib/translation/circuits/sha256/sha256_2.v b/Garden/Circom/Circomlib/translation/circuits/sha256/sha256_2.v index d429875..54deed2 100644 --- a/Garden/Circom/Circomlib/translation/circuits/sha256/sha256_2.v +++ b/Garden/Circom/Circomlib/translation/circuits/sha256/sha256_2.v @@ -11,102 +11,109 @@ Module Sha256_2Signals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | a : P _ a "a" + | b : P _ b "b" + | out : P _ out "out". + End IsNamed. End Sha256_2Signals. (* Template body *) Definition Sha256_2 : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "a" [[ ([] : list F.t) ]] in + do~ M.declare_signal "a" in (* Signal Input *) - do~ M.declare_signal "b" [[ ([] : list F.t) ]] in + do~ M.declare_signal "b" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Var *) do~ M.declare_var "k" [[ ([] : list F.t) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in (* Component *) do~ M.declare_component "bits2num" in - do~ M.substitute_var "bits2num" [[ M.call_function ~(| "Bits2Num", [ 216 ] |) ]] in + do~ M.substitute_var "bits2num" [] [[ M.call_function ~(| "Bits2Num", [ 216 ] |) ]] in (* Component *) do~ M.declare_component "num2bits" in - do~ M.substitute_var "num2bits" [[ M.call_function ~(| "Num2Bits", [ 216 ] |) ]] in - do~ M.substitute_var "num2bits" [[ M.call_function ~(| "Num2Bits", [ 216 ] |) ]] in - do~ M.substitute_var "num2bits" [[ M.var (| "a" |) ]] in - do~ M.substitute_var "num2bits" [[ M.var (| "b" |) ]] in + do~ M.substitute_var "num2bits" [Access.Array (0)] [[ M.call_function ~(| "Num2Bits", [ 216 ] |) ]] in + do~ M.substitute_var "num2bits" [Access.Array (1)] [[ M.call_function ~(| "Num2Bits", [ 216 ] |) ]] in + do~ M.substitute_var "num2bits" [Access.Array (0); Access.Component "in"] [[ M.var (| "a" |) ]] in + do~ M.substitute_var "num2bits" [Access.Array (1); Access.Component "in"] [[ M.var (| "b" |) ]] in (* Component *) do~ M.declare_component "sha256compression" in - do~ M.substitute_var "sha256compression" [[ M.call_function ~(| "Sha256compression", ([] : list F.t) |) ]] in + do~ M.substitute_var "sha256compression" [] [[ M.call_function ~(| "Sha256compression", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "ha0" in - do~ M.substitute_var "ha0" [[ M.call_function ~(| "H", [ 0 ] |) ]] in + do~ M.substitute_var "ha0" [] [[ M.call_function ~(| "H", [ 0 ] |) ]] in (* Component *) do~ M.declare_component "hb0" in - do~ M.substitute_var "hb0" [[ M.call_function ~(| "H", [ 1 ] |) ]] in + do~ M.substitute_var "hb0" [] [[ M.call_function ~(| "H", [ 1 ] |) ]] in (* Component *) do~ M.declare_component "hc0" in - do~ M.substitute_var "hc0" [[ M.call_function ~(| "H", [ 2 ] |) ]] in + do~ M.substitute_var "hc0" [] [[ M.call_function ~(| "H", [ 2 ] |) ]] in (* Component *) do~ M.declare_component "hd0" in - do~ M.substitute_var "hd0" [[ M.call_function ~(| "H", [ 3 ] |) ]] in + do~ M.substitute_var "hd0" [] [[ M.call_function ~(| "H", [ 3 ] |) ]] in (* Component *) do~ M.declare_component "he0" in - do~ M.substitute_var "he0" [[ M.call_function ~(| "H", [ 4 ] |) ]] in + do~ M.substitute_var "he0" [] [[ M.call_function ~(| "H", [ 4 ] |) ]] in (* Component *) do~ M.declare_component "hf0" in - do~ M.substitute_var "hf0" [[ M.call_function ~(| "H", [ 5 ] |) ]] in + do~ M.substitute_var "hf0" [] [[ M.call_function ~(| "H", [ 5 ] |) ]] in (* Component *) do~ M.declare_component "hg0" in - do~ M.substitute_var "hg0" [[ M.call_function ~(| "H", [ 6 ] |) ]] in + do~ M.substitute_var "hg0" [] [[ M.call_function ~(| "H", [ 6 ] |) ]] in (* Component *) do~ M.declare_component "hh0" in - do~ M.substitute_var "hh0" [[ M.call_function ~(| "H", [ 7 ] |) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "hh0" [] [[ M.call_function ~(| "H", [ 7 ] |) ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "sha256compression" [[ M.var_access (| "ha0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sha256compression" [[ M.var_access (| "hb0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sha256compression" [[ M.var_access (| "hc0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sha256compression" [[ M.var_access (| "hd0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sha256compression" [[ M.var_access (| "he0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sha256compression" [[ M.var_access (| "hf0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sha256compression" [[ M.var_access (| "hg0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sha256compression" [[ M.var_access (| "hh0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "sha256compression" [Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 0, 32 |), M.var (| "k" |) |))] [[ M.var_access (| "ha0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sha256compression" [Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 1, 32 |), M.var (| "k" |) |))] [[ M.var_access (| "hb0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sha256compression" [Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 2, 32 |), M.var (| "k" |) |))] [[ M.var_access (| "hc0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sha256compression" [Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 3, 32 |), M.var (| "k" |) |))] [[ M.var_access (| "hd0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sha256compression" [Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 4, 32 |), M.var (| "k" |) |))] [[ M.var_access (| "he0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sha256compression" [Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 5, 32 |), M.var (| "k" |) |))] [[ M.var_access (| "hf0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sha256compression" [Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 6, 32 |), M.var (| "k" |) |))] [[ M.var_access (| "hg0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sha256compression" [Access.Component "hin"; Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 7, 32 |), M.var (| "k" |) |))] [[ M.var_access (| "hh0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 216 |) ]] ( - do~ M.substitute_var "sha256compression" [[ M.var_access (| "num2bits", [Access.Array (0); Access.Component "out"; Access.Array (InfixOp.sub ~(| 215, M.var (| "i" |) |))] |) ]] in - do~ M.substitute_var "sha256compression" [[ M.var_access (| "num2bits", [Access.Array (1); Access.Component "out"; Access.Array (InfixOp.sub ~(| 215, M.var (| "i" |) |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "sha256compression" [Access.Component "inp"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "num2bits", [Access.Array (0); Access.Component "out"; Access.Array (InfixOp.sub ~(| 215, M.var (| "i" |) |))] |) ]] in + do~ M.substitute_var "sha256compression" [Access.Component "inp"; Access.Array (InfixOp.add ~(| M.var (| "i" |), 216 |))] [[ M.var_access (| "num2bits", [Access.Array (1); Access.Component "out"; Access.Array (InfixOp.sub ~(| 215, M.var (| "i" |) |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "sha256compression" [[ 1 ]] in - do~ M.substitute_var "i" [[ 433 ]] in + do~ M.substitute_var "sha256compression" [Access.Component "inp"; Access.Array (432)] [[ 1 ]] in + do~ M.substitute_var "i" [] [[ 433 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 503 |) ]] ( - do~ M.substitute_var "sha256compression" [[ 0 ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "sha256compression" [Access.Component "inp"; Access.Array (M.var (| "i" |))] [[ 0 ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "sha256compression" [[ 1 ]] in - do~ M.substitute_var "sha256compression" [[ 1 ]] in - do~ M.substitute_var "sha256compression" [[ 0 ]] in - do~ M.substitute_var "sha256compression" [[ 1 ]] in - do~ M.substitute_var "sha256compression" [[ 1 ]] in - do~ M.substitute_var "sha256compression" [[ 0 ]] in - do~ M.substitute_var "sha256compression" [[ 0 ]] in - do~ M.substitute_var "sha256compression" [[ 0 ]] in - do~ M.substitute_var "sha256compression" [[ 0 ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "sha256compression" [Access.Component "inp"; Access.Array (503)] [[ 1 ]] in + do~ M.substitute_var "sha256compression" [Access.Component "inp"; Access.Array (504)] [[ 1 ]] in + do~ M.substitute_var "sha256compression" [Access.Component "inp"; Access.Array (505)] [[ 0 ]] in + do~ M.substitute_var "sha256compression" [Access.Component "inp"; Access.Array (506)] [[ 1 ]] in + do~ M.substitute_var "sha256compression" [Access.Component "inp"; Access.Array (507)] [[ 1 ]] in + do~ M.substitute_var "sha256compression" [Access.Component "inp"; Access.Array (508)] [[ 0 ]] in + do~ M.substitute_var "sha256compression" [Access.Component "inp"; Access.Array (509)] [[ 0 ]] in + do~ M.substitute_var "sha256compression" [Access.Component "inp"; Access.Array (510)] [[ 0 ]] in + do~ M.substitute_var "sha256compression" [Access.Component "inp"; Access.Array (511)] [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 216 |) ]] ( - do~ M.substitute_var "bits2num" [[ M.var_access (| "sha256compression", [Access.Component "out"; Access.Array (InfixOp.sub ~(| 255, M.var (| "i" |) |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "bits2num" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "sha256compression", [Access.Component "out"; Access.Array (InfixOp.sub ~(| 255, M.var (| "i" |) |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "bits2num", [Access.Component "out"] |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "bits2num", [Access.Component "out"] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/sha256/sha256compression.v b/Garden/Circom/Circomlib/translation/circuits/sha256/sha256compression.v index dbcaf3e..91c1420 100644 --- a/Garden/Circom/Circomlib/translation/circuits/sha256/sha256compression.v +++ b/Garden/Circom/Circomlib/translation/circuits/sha256/sha256compression.v @@ -29,217 +29,233 @@ Module Sha256compressionSignals. (* Intermediate *) w : list (list F.t); }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | hin : P _ hin "hin" + | inp : P _ inp "inp" + | out : P _ out "out" + | a : P _ a "a" + | b : P _ b "b" + | c : P _ c "c" + | d : P _ d "d" + | e : P _ e "e" + | f : P _ f "f" + | g : P _ g "g" + | h : P _ h "h" + | w : P _ w "w". + End IsNamed. End Sha256compressionSignals. (* Template body *) Definition Sha256compression : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "hin" [[ [ 256 ] ]] in + do~ M.declare_signal "hin" in (* Signal Input *) - do~ M.declare_signal "inp" [[ [ 512 ] ]] in + do~ M.declare_signal "inp" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 256 ] ]] in + do~ M.declare_signal "out" in (* Signal Intermediate *) - do~ M.declare_signal "a" [[ [ 65; 32 ] ]] in + do~ M.declare_signal "a" in (* Signal Intermediate *) - do~ M.declare_signal "b" [[ [ 65; 32 ] ]] in + do~ M.declare_signal "b" in (* Signal Intermediate *) - do~ M.declare_signal "c" [[ [ 65; 32 ] ]] in + do~ M.declare_signal "c" in (* Signal Intermediate *) - do~ M.declare_signal "d" [[ [ 65; 32 ] ]] in + do~ M.declare_signal "d" in (* Signal Intermediate *) - do~ M.declare_signal "e" [[ [ 65; 32 ] ]] in + do~ M.declare_signal "e" in (* Signal Intermediate *) - do~ M.declare_signal "f" [[ [ 65; 32 ] ]] in + do~ M.declare_signal "f" in (* Signal Intermediate *) - do~ M.declare_signal "g" [[ [ 65; 32 ] ]] in + do~ M.declare_signal "g" in (* Signal Intermediate *) - do~ M.declare_signal "h" [[ [ 65; 32 ] ]] in + do~ M.declare_signal "h" in (* Signal Intermediate *) - do~ M.declare_signal "w" [[ [ 64; 32 ] ]] in + do~ M.declare_signal "w" in (* Var *) do~ M.declare_var "outCalc" [[ [ 256 ] ]] in - do~ M.substitute_var "outCalc" [[ array_with_repeat (0) (256) ]] in - do~ M.substitute_var "outCalc" [[ M.call_function ~(| "sha256compression", [ M.var (| "hin" |); M.var (| "inp" |) ] |) ]] in + do~ M.substitute_var "outCalc" [] [[ array_with_repeat (0) (256) ]] in + do~ M.substitute_var "outCalc" [] [[ M.call_function ~(| "sha256compression", [ M.var (| "hin" |); M.var (| "inp" |) ] |) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 256 |) ]] ( - do~ M.substitute_var "out" [[ M.var_access (| "outCalc", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |))] [[ M.var_access (| "outCalc", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "sigmaPlus" in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 48 |) ]] ( - do~ M.substitute_var "sigmaPlus" [[ M.call_function ~(| "SigmaPlus", ([] : list F.t) |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "sigmaPlus" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "SigmaPlus", ([] : list F.t) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "ct_k" in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 64 |) ]] ( - do~ M.substitute_var "ct_k" [[ M.call_function ~(| "K", [ M.var (| "i" |) ] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "ct_k" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "K", [ M.var (| "i" |) ] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "t1" in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 64 |) ]] ( - do~ M.substitute_var "t1" [[ M.call_function ~(| "T1", ([] : list F.t) |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "t1" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "T1", ([] : list F.t) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "t2" in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 64 |) ]] ( - do~ M.substitute_var "t2" [[ M.call_function ~(| "T2", ([] : list F.t) |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "t2" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "T2", ([] : list F.t) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "suma" in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 64 |) ]] ( - do~ M.substitute_var "suma" [[ M.call_function ~(| "BinSum", [ 32; 2 ] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "suma" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "BinSum", [ 32; 2 ] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "sume" in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 64 |) ]] ( - do~ M.substitute_var "sume" [[ M.call_function ~(| "BinSum", [ 32; 2 ] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "sume" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "BinSum", [ 32; 2 ] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "fsum" in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 8 |) ]] ( - do~ M.substitute_var "fsum" [[ M.call_function ~(| "BinSum", [ 32; 2 ] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "fsum" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "BinSum", [ 32; 2 ] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Var *) do~ M.declare_var "k" [[ ([] : list F.t) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in (* Var *) do~ M.declare_var "t" [[ ([] : list F.t) ]] in - do~ M.substitute_var "t" [[ 0 ]] in - do~ M.substitute_var "t" [[ 0 ]] in + do~ M.substitute_var "t" [] [[ 0 ]] in + do~ M.substitute_var "t" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "t" |), 64 |) ]] ( do~ M.if_ [[ InfixOp.lesser ~(| M.var (| "t" |), 16 |) ]] (* then *) ( - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "w" [[ M.var_access (| "inp", [Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| M.var (| "t" |), 32 |), 31 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "w" [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] [[ M.var_access (| "inp", [Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| M.var (| "t" |), 32 |), 31 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "sigmaPlus" [[ M.var_access (| "w", [Access.Array (InfixOp.sub ~(| M.var (| "t" |), 2 |)); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sigmaPlus" [[ M.var_access (| "w", [Access.Array (InfixOp.sub ~(| M.var (| "t" |), 7 |)); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sigmaPlus" [[ M.var_access (| "w", [Access.Array (InfixOp.sub ~(| M.var (| "t" |), 15 |)); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sigmaPlus" [[ M.var_access (| "w", [Access.Array (InfixOp.sub ~(| M.var (| "t" |), 16 |)); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "sigmaPlus" [Access.Array (InfixOp.sub ~(| M.var (| "t" |), 16 |)); Access.Component "in2"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "w", [Access.Array (InfixOp.sub ~(| M.var (| "t" |), 2 |)); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sigmaPlus" [Access.Array (InfixOp.sub ~(| M.var (| "t" |), 16 |)); Access.Component "in7"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "w", [Access.Array (InfixOp.sub ~(| M.var (| "t" |), 7 |)); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sigmaPlus" [Access.Array (InfixOp.sub ~(| M.var (| "t" |), 16 |)); Access.Component "in15"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "w", [Access.Array (InfixOp.sub ~(| M.var (| "t" |), 15 |)); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sigmaPlus" [Access.Array (InfixOp.sub ~(| M.var (| "t" |), 16 |)); Access.Component "in16"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "w", [Access.Array (InfixOp.sub ~(| M.var (| "t" |), 16 |)); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "w" [[ M.var_access (| "sigmaPlus", [Access.Array (InfixOp.sub ~(| M.var (| "t" |), 16 |)); Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "w" [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] [[ M.var_access (| "sigmaPlus", [Access.Array (InfixOp.sub ~(| M.var (| "t" |), 16 |)); Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "t" [[ InfixOp.add ~(| M.var (| "t" |), 1 |) ]] in + do~ M.substitute_var "t" [] [[ InfixOp.add ~(| M.var (| "t" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "a" [[ M.var_access (| "hin", [Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "b" [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 1 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "c" [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 2 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "d" [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 3 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "e" [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 4 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "f" [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 5 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "g" [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 6 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "h" [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 7 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "a" [Access.Array (0); Access.Array (M.var (| "k" |))] [[ M.var_access (| "hin", [Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "b" [Access.Array (0); Access.Array (M.var (| "k" |))] [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 1 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "c" [Access.Array (0); Access.Array (M.var (| "k" |))] [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 2 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "d" [Access.Array (0); Access.Array (M.var (| "k" |))] [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 3 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "e" [Access.Array (0); Access.Array (M.var (| "k" |))] [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 4 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "f" [Access.Array (0); Access.Array (M.var (| "k" |))] [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 5 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "g" [Access.Array (0); Access.Array (M.var (| "k" |))] [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 6 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "h" [Access.Array (0); Access.Array (M.var (| "k" |))] [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 7 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "t" [[ 0 ]] in + do~ M.substitute_var "t" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "t" |), 64 |) ]] ( - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "t1" [[ M.var_access (| "h", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "t1" [[ M.var_access (| "e", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "t1" [[ M.var_access (| "f", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "t1" [[ M.var_access (| "g", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "t1" [[ M.var_access (| "ct_k", [Access.Array (M.var (| "t" |)); Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "t1" [[ M.var_access (| "w", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "t2" [[ M.var_access (| "a", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "t2" [[ M.var_access (| "b", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "t2" [[ M.var_access (| "c", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "t1" [Access.Array (M.var (| "t" |)); Access.Component "h"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "h", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "t1" [Access.Array (M.var (| "t" |)); Access.Component "e"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "e", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "t1" [Access.Array (M.var (| "t" |)); Access.Component "f"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "f", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "t1" [Access.Array (M.var (| "t" |)); Access.Component "g"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "g", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "t1" [Access.Array (M.var (| "t" |)); Access.Component "k"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "ct_k", [Access.Array (M.var (| "t" |)); Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "t1" [Access.Array (M.var (| "t" |)); Access.Component "w"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "w", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "t2" [Access.Array (M.var (| "t" |)); Access.Component "a"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "a", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "t2" [Access.Array (M.var (| "t" |)); Access.Component "b"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "b", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "t2" [Access.Array (M.var (| "t" |)); Access.Component "c"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "c", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "sume" [[ M.var_access (| "d", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sume" [[ M.var_access (| "t1", [Access.Array (M.var (| "t" |)); Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "suma" [[ M.var_access (| "t1", [Access.Array (M.var (| "t" |)); Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "suma" [[ M.var_access (| "t2", [Access.Array (M.var (| "t" |)); Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "sume" [Access.Array (M.var (| "t" |)); Access.Component "in"; Access.Array (0); Access.Array (M.var (| "k" |))] [[ M.var_access (| "d", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sume" [Access.Array (M.var (| "t" |)); Access.Component "in"; Access.Array (1); Access.Array (M.var (| "k" |))] [[ M.var_access (| "t1", [Access.Array (M.var (| "t" |)); Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "suma" [Access.Array (M.var (| "t" |)); Access.Component "in"; Access.Array (0); Access.Array (M.var (| "k" |))] [[ M.var_access (| "t1", [Access.Array (M.var (| "t" |)); Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "suma" [Access.Array (M.var (| "t" |)); Access.Component "in"; Access.Array (1); Access.Array (M.var (| "k" |))] [[ M.var_access (| "t2", [Access.Array (M.var (| "t" |)); Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "h" [[ M.var_access (| "g", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "g" [[ M.var_access (| "f", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "f" [[ M.var_access (| "e", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "e" [[ M.var_access (| "sume", [Access.Array (M.var (| "t" |)); Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "d" [[ M.var_access (| "c", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "c" [[ M.var_access (| "b", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "b" [[ M.var_access (| "a", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "a" [[ M.var_access (| "suma", [Access.Array (M.var (| "t" |)); Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "h" [Access.Array (InfixOp.add ~(| M.var (| "t" |), 1 |)); Access.Array (M.var (| "k" |))] [[ M.var_access (| "g", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "g" [Access.Array (InfixOp.add ~(| M.var (| "t" |), 1 |)); Access.Array (M.var (| "k" |))] [[ M.var_access (| "f", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "f" [Access.Array (InfixOp.add ~(| M.var (| "t" |), 1 |)); Access.Array (M.var (| "k" |))] [[ M.var_access (| "e", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "e" [Access.Array (InfixOp.add ~(| M.var (| "t" |), 1 |)); Access.Array (M.var (| "k" |))] [[ M.var_access (| "sume", [Access.Array (M.var (| "t" |)); Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "d" [Access.Array (InfixOp.add ~(| M.var (| "t" |), 1 |)); Access.Array (M.var (| "k" |))] [[ M.var_access (| "c", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "c" [Access.Array (InfixOp.add ~(| M.var (| "t" |), 1 |)); Access.Array (M.var (| "k" |))] [[ M.var_access (| "b", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "b" [Access.Array (InfixOp.add ~(| M.var (| "t" |), 1 |)); Access.Array (M.var (| "k" |))] [[ M.var_access (| "a", [Access.Array (M.var (| "t" |)); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "a" [Access.Array (InfixOp.add ~(| M.var (| "t" |), 1 |)); Access.Array (M.var (| "k" |))] [[ M.var_access (| "suma", [Access.Array (M.var (| "t" |)); Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "t" [[ InfixOp.add ~(| M.var (| "t" |), 1 |) ]] in + do~ M.substitute_var "t" [] [[ InfixOp.add ~(| M.var (| "t" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "fsum" [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 0 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "fsum" [[ M.var_access (| "a", [Access.Array (64); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "fsum" [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 1 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "fsum" [[ M.var_access (| "b", [Access.Array (64); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "fsum" [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 2 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "fsum" [[ M.var_access (| "c", [Access.Array (64); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "fsum" [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 3 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "fsum" [[ M.var_access (| "d", [Access.Array (64); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "fsum" [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 4 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "fsum" [[ M.var_access (| "e", [Access.Array (64); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "fsum" [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 5 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "fsum" [[ M.var_access (| "f", [Access.Array (64); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "fsum" [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 6 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "fsum" [[ M.var_access (| "g", [Access.Array (64); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "fsum" [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 7 |), M.var (| "k" |) |))] |) ]] in - do~ M.substitute_var "fsum" [[ M.var_access (| "h", [Access.Array (64); Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "fsum" [Access.Array (0); Access.Component "in"; Access.Array (0); Access.Array (M.var (| "k" |))] [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 0 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "fsum" [Access.Array (0); Access.Component "in"; Access.Array (1); Access.Array (M.var (| "k" |))] [[ M.var_access (| "a", [Access.Array (64); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "fsum" [Access.Array (1); Access.Component "in"; Access.Array (0); Access.Array (M.var (| "k" |))] [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 1 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "fsum" [Access.Array (1); Access.Component "in"; Access.Array (1); Access.Array (M.var (| "k" |))] [[ M.var_access (| "b", [Access.Array (64); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "fsum" [Access.Array (2); Access.Component "in"; Access.Array (0); Access.Array (M.var (| "k" |))] [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 2 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "fsum" [Access.Array (2); Access.Component "in"; Access.Array (1); Access.Array (M.var (| "k" |))] [[ M.var_access (| "c", [Access.Array (64); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "fsum" [Access.Array (3); Access.Component "in"; Access.Array (0); Access.Array (M.var (| "k" |))] [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 3 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "fsum" [Access.Array (3); Access.Component "in"; Access.Array (1); Access.Array (M.var (| "k" |))] [[ M.var_access (| "d", [Access.Array (64); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "fsum" [Access.Array (4); Access.Component "in"; Access.Array (0); Access.Array (M.var (| "k" |))] [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 4 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "fsum" [Access.Array (4); Access.Component "in"; Access.Array (1); Access.Array (M.var (| "k" |))] [[ M.var_access (| "e", [Access.Array (64); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "fsum" [Access.Array (5); Access.Component "in"; Access.Array (0); Access.Array (M.var (| "k" |))] [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 5 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "fsum" [Access.Array (5); Access.Component "in"; Access.Array (1); Access.Array (M.var (| "k" |))] [[ M.var_access (| "f", [Access.Array (64); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "fsum" [Access.Array (6); Access.Component "in"; Access.Array (0); Access.Array (M.var (| "k" |))] [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 6 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "fsum" [Access.Array (6); Access.Component "in"; Access.Array (1); Access.Array (M.var (| "k" |))] [[ M.var_access (| "g", [Access.Array (64); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "fsum" [Access.Array (7); Access.Component "in"; Access.Array (0); Access.Array (M.var (| "k" |))] [[ M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| 32, 7 |), M.var (| "k" |) |))] |) ]] in + do~ M.substitute_var "fsum" [Access.Array (7); Access.Component "in"; Access.Array (1); Access.Array (M.var (| "k" |))] [[ M.var_access (| "h", [Access.Array (64); Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( do~ M.equality_constraint [[ M.var_access (| "out", [Access.Array (InfixOp.sub ~(| 31, M.var (| "k" |) |))] |) ]] @@ -273,7 +289,7 @@ Definition Sha256compression : M.t (BlockUnit.t Empty_set) := [[ M.var_access (| "out", [Access.Array (InfixOp.sub ~(| InfixOp.add ~(| 224, 31 |), M.var (| "k" |) |))] |) ]] [[ M.var_access (| "fsum", [Access.Array (7); Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt diff --git a/Garden/Circom/Circomlib/translation/circuits/sha256/sha256compression_function.v b/Garden/Circom/Circomlib/translation/circuits/sha256/sha256compression_function.v index c4334ba..0937b3a 100644 --- a/Garden/Circom/Circomlib/translation/circuits/sha256/sha256compression_function.v +++ b/Garden/Circom/Circomlib/translation/circuits/sha256/sha256compression_function.v @@ -55,8 +55,8 @@ Definition sha256K (i : F.t) : M.t F.t := M.function_body [("i", i)] ( (* Var *) do~ M.declare_var "k" [[ [ 64 ] ]] in - do~ M.substitute_var "k" [[ array_with_repeat (0) (64) ]] in - do~ M.substitute_var "k" [[ [ 1116352408; 1899447441; 3049323471; 3921009573; 961987163; 1508970993; 2453635748; 2870763221; 3624381080; 310598401; 607225278; 1426881987; 1925078388; 2162078206; 2614888103; 3248222580; 3835390401; 4022224774; 264347078; 604807628; 770255983; 1249150122; 1555081692; 1996064986; 2554220882; 2821834349; 2952996808; 3210313671; 3336571891; 3584528711; 113926993; 338241895; 666307205; 773529912; 1294757372; 1396182291; 1695183700; 1986661051; 2177026350; 2456956037; 2730485921; 2820302411; 3259730800; 3345764771; 3516065817; 3600352804; 4094571909; 275423344; 430227734; 506948616; 659060556; 883997877; 958139571; 1322822218; 1537002063; 1747873779; 1955562222; 2024104815; 2227730452; 2361852424; 2428436474; 2756734187; 3204031479; 3329325298 ] ]] in + do~ M.substitute_var "k" [] [[ array_with_repeat (0) (64) ]] in + do~ M.substitute_var "k" [] [[ [ 1116352408; 1899447441; 3049323471; 3921009573; 961987163; 1508970993; 2453635748; 2870763221; 3624381080; 310598401; 607225278; 1426881987; 1925078388; 2162078206; 2614888103; 3248222580; 3835390401; 4022224774; 264347078; 604807628; 770255983; 1249150122; 1555081692; 1996064986; 2554220882; 2821834349; 2952996808; 3210313671; 3336571891; 3584528711; 113926993; 338241895; 666307205; 773529912; 1294757372; 1396182291; 1695183700; 1986661051; 2177026350; 2456956037; 2730485921; 2820302411; 3259730800; 3345764771; 3516065817; 3600352804; 4094571909; 275423344; 430227734; 506948616; 659060556; 883997877; 958139571; 1322822218; 1537002063; 1747873779; 1955562222; 2024104815; 2227730452; 2361852424; 2428436474; 2756734187; 3204031479; 3329325298 ] ]] in do~ M.return_ [[ M.var_access (| "k", [Access.Array (M.var (| "i" |))] |) ]] in M.pure BlockUnit.Tt ). @@ -66,120 +66,120 @@ Definition sha256compression (hin inp : F.t) : M.t F.t := M.function_body [("hin", hin); ("inp", inp)] ( (* Var *) do~ M.declare_var "H" [[ [ 8 ] ]] in - do~ M.substitute_var "H" [[ array_with_repeat (0) (8) ]] in + do~ M.substitute_var "H" [] [[ array_with_repeat (0) (8) ]] in (* Var *) do~ M.declare_var "a" [[ ([] : list F.t) ]] in - do~ M.substitute_var "a" [[ 0 ]] in + do~ M.substitute_var "a" [] [[ 0 ]] in (* Var *) do~ M.declare_var "b" [[ ([] : list F.t) ]] in - do~ M.substitute_var "b" [[ 0 ]] in + do~ M.substitute_var "b" [] [[ 0 ]] in (* Var *) do~ M.declare_var "c" [[ ([] : list F.t) ]] in - do~ M.substitute_var "c" [[ 0 ]] in + do~ M.substitute_var "c" [] [[ 0 ]] in (* Var *) do~ M.declare_var "d" [[ ([] : list F.t) ]] in - do~ M.substitute_var "d" [[ 0 ]] in + do~ M.substitute_var "d" [] [[ 0 ]] in (* Var *) do~ M.declare_var "e" [[ ([] : list F.t) ]] in - do~ M.substitute_var "e" [[ 0 ]] in + do~ M.substitute_var "e" [] [[ 0 ]] in (* Var *) do~ M.declare_var "f" [[ ([] : list F.t) ]] in - do~ M.substitute_var "f" [[ 0 ]] in + do~ M.substitute_var "f" [] [[ 0 ]] in (* Var *) do~ M.declare_var "g" [[ ([] : list F.t) ]] in - do~ M.substitute_var "g" [[ 0 ]] in + do~ M.substitute_var "g" [] [[ 0 ]] in (* Var *) do~ M.declare_var "h" [[ ([] : list F.t) ]] in - do~ M.substitute_var "h" [[ 0 ]] in + do~ M.substitute_var "h" [] [[ 0 ]] in (* Var *) do~ M.declare_var "out" [[ [ 256 ] ]] in - do~ M.substitute_var "out" [[ array_with_repeat (0) (256) ]] in + do~ M.substitute_var "out" [] [[ array_with_repeat (0) (256) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 8 |) ]] ( - do~ M.substitute_var "H" [[ 0 ]] in + do~ M.substitute_var "H" [Access.Array (M.var (| "i" |))] [[ 0 ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), 32 |) ]] ( - do~ M.substitute_var "H" [[ InfixOp.add ~(| M.var_access (| "H", [Access.Array (M.var (| "i" |))] |), InfixOp.shiftL ~(| M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| M.var (| "i" |), 32 |), M.var (| "j" |) |))] |), M.var (| "j" |) |) |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "H" [Access.Array (M.var (| "i" |))] [[ InfixOp.add ~(| M.var_access (| "H", [Access.Array (M.var (| "i" |))] |), InfixOp.shiftL ~(| M.var_access (| "hin", [Access.Array (InfixOp.add ~(| InfixOp.mul ~(| M.var (| "i" |), 32 |), M.var (| "j" |) |))] |), M.var (| "j" |) |) |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "a" [[ M.var_access (| "H", [Access.Array (0)] |) ]] in - do~ M.substitute_var "b" [[ M.var_access (| "H", [Access.Array (1)] |) ]] in - do~ M.substitute_var "c" [[ M.var_access (| "H", [Access.Array (2)] |) ]] in - do~ M.substitute_var "d" [[ M.var_access (| "H", [Access.Array (3)] |) ]] in - do~ M.substitute_var "e" [[ M.var_access (| "H", [Access.Array (4)] |) ]] in - do~ M.substitute_var "f" [[ M.var_access (| "H", [Access.Array (5)] |) ]] in - do~ M.substitute_var "g" [[ M.var_access (| "H", [Access.Array (6)] |) ]] in - do~ M.substitute_var "h" [[ M.var_access (| "H", [Access.Array (7)] |) ]] in + do~ M.substitute_var "a" [] [[ M.var_access (| "H", [Access.Array (0)] |) ]] in + do~ M.substitute_var "b" [] [[ M.var_access (| "H", [Access.Array (1)] |) ]] in + do~ M.substitute_var "c" [] [[ M.var_access (| "H", [Access.Array (2)] |) ]] in + do~ M.substitute_var "d" [] [[ M.var_access (| "H", [Access.Array (3)] |) ]] in + do~ M.substitute_var "e" [] [[ M.var_access (| "H", [Access.Array (4)] |) ]] in + do~ M.substitute_var "f" [] [[ M.var_access (| "H", [Access.Array (5)] |) ]] in + do~ M.substitute_var "g" [] [[ M.var_access (| "H", [Access.Array (6)] |) ]] in + do~ M.substitute_var "h" [] [[ M.var_access (| "H", [Access.Array (7)] |) ]] in (* Var *) do~ M.declare_var "w" [[ [ 64 ] ]] in - do~ M.substitute_var "w" [[ array_with_repeat (0) (64) ]] in + do~ M.substitute_var "w" [] [[ array_with_repeat (0) (64) ]] in (* Var *) do~ M.declare_var "T1" [[ ([] : list F.t) ]] in - do~ M.substitute_var "T1" [[ 0 ]] in + do~ M.substitute_var "T1" [] [[ 0 ]] in (* Var *) do~ M.declare_var "T2" [[ ([] : list F.t) ]] in - do~ M.substitute_var "T2" [[ 0 ]] in + do~ M.substitute_var "T2" [] [[ 0 ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 64 |) ]] ( do~ M.if_ [[ InfixOp.lesser ~(| M.var (| "i" |), 16 |) ]] (* then *) ( - do~ M.substitute_var "w" [[ 0 ]] in + do~ M.substitute_var "w" [Access.Array (M.var (| "i" |))] [[ 0 ]] in (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), 32 |) ]] ( - do~ M.substitute_var "w" [[ InfixOp.add ~(| M.var_access (| "w", [Access.Array (M.var (| "i" |))] |), InfixOp.shiftL ~(| M.var_access (| "inp", [Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| M.var (| "i" |), 32 |), 31 |), M.var (| "j" |) |))] |), M.var (| "j" |) |) |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "w" [Access.Array (M.var (| "i" |))] [[ InfixOp.add ~(| M.var_access (| "w", [Access.Array (M.var (| "i" |))] |), InfixOp.shiftL ~(| M.var_access (| "inp", [Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| M.var (| "i" |), 32 |), 31 |), M.var (| "j" |) |))] |), M.var (| "j" |) |) |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "w" [[ InfixOp.bitAnd ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| M.call_function ~(| "ssigma1", [ M.var_access (| "w", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 2 |))] |) ] |), M.var_access (| "w", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 7 |))] |) |), M.call_function ~(| "ssigma0", [ M.var_access (| "w", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 15 |))] |) ] |) |), M.var_access (| "w", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 16 |))] |) |), 4294967295 |) ]] in + do~ M.substitute_var "w" [Access.Array (M.var (| "i" |))] [[ InfixOp.bitAnd ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| M.call_function ~(| "ssigma1", [ M.var_access (| "w", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 2 |))] |) ] |), M.var_access (| "w", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 7 |))] |) |), M.call_function ~(| "ssigma0", [ M.var_access (| "w", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 15 |))] |) ] |) |), M.var_access (| "w", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 16 |))] |) |), 4294967295 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "T1" [[ InfixOp.bitAnd ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| M.var (| "h" |), M.call_function ~(| "bsigma1", [ M.var (| "e" |) ] |) |), M.call_function ~(| "Ch", [ M.var (| "e" |); M.var (| "f" |); M.var (| "g" |) ] |) |), M.call_function ~(| "sha256K", [ M.var (| "i" |) ] |) |), M.var_access (| "w", [Access.Array (M.var (| "i" |))] |) |), 4294967295 |) ]] in - do~ M.substitute_var "T2" [[ InfixOp.bitAnd ~(| InfixOp.add ~(| M.call_function ~(| "bsigma0", [ M.var (| "a" |) ] |), M.call_function ~(| "Maj", [ M.var (| "a" |); M.var (| "b" |); M.var (| "c" |) ] |) |), 4294967295 |) ]] in - do~ M.substitute_var "h" [[ M.var (| "g" |) ]] in - do~ M.substitute_var "g" [[ M.var (| "f" |) ]] in - do~ M.substitute_var "f" [[ M.var (| "e" |) ]] in - do~ M.substitute_var "e" [[ InfixOp.bitAnd ~(| InfixOp.add ~(| M.var (| "d" |), M.var (| "T1" |) |), 4294967295 |) ]] in - do~ M.substitute_var "d" [[ M.var (| "c" |) ]] in - do~ M.substitute_var "c" [[ M.var (| "b" |) ]] in - do~ M.substitute_var "b" [[ M.var (| "a" |) ]] in - do~ M.substitute_var "a" [[ InfixOp.bitAnd ~(| InfixOp.add ~(| M.var (| "T1" |), M.var (| "T2" |) |), 4294967295 |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "T1" [] [[ InfixOp.bitAnd ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| M.var (| "h" |), M.call_function ~(| "bsigma1", [ M.var (| "e" |) ] |) |), M.call_function ~(| "Ch", [ M.var (| "e" |); M.var (| "f" |); M.var (| "g" |) ] |) |), M.call_function ~(| "sha256K", [ M.var (| "i" |) ] |) |), M.var_access (| "w", [Access.Array (M.var (| "i" |))] |) |), 4294967295 |) ]] in + do~ M.substitute_var "T2" [] [[ InfixOp.bitAnd ~(| InfixOp.add ~(| M.call_function ~(| "bsigma0", [ M.var (| "a" |) ] |), M.call_function ~(| "Maj", [ M.var (| "a" |); M.var (| "b" |); M.var (| "c" |) ] |) |), 4294967295 |) ]] in + do~ M.substitute_var "h" [] [[ M.var (| "g" |) ]] in + do~ M.substitute_var "g" [] [[ M.var (| "f" |) ]] in + do~ M.substitute_var "f" [] [[ M.var (| "e" |) ]] in + do~ M.substitute_var "e" [] [[ InfixOp.bitAnd ~(| InfixOp.add ~(| M.var (| "d" |), M.var (| "T1" |) |), 4294967295 |) ]] in + do~ M.substitute_var "d" [] [[ M.var (| "c" |) ]] in + do~ M.substitute_var "c" [] [[ M.var (| "b" |) ]] in + do~ M.substitute_var "b" [] [[ M.var (| "a" |) ]] in + do~ M.substitute_var "a" [] [[ InfixOp.bitAnd ~(| InfixOp.add ~(| M.var (| "T1" |), M.var (| "T2" |) |), 4294967295 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "H" [[ InfixOp.add ~(| M.var_access (| "H", [Access.Array (0)] |), M.var (| "a" |) |) ]] in - do~ M.substitute_var "H" [[ InfixOp.add ~(| M.var_access (| "H", [Access.Array (1)] |), M.var (| "b" |) |) ]] in - do~ M.substitute_var "H" [[ InfixOp.add ~(| M.var_access (| "H", [Access.Array (2)] |), M.var (| "c" |) |) ]] in - do~ M.substitute_var "H" [[ InfixOp.add ~(| M.var_access (| "H", [Access.Array (3)] |), M.var (| "d" |) |) ]] in - do~ M.substitute_var "H" [[ InfixOp.add ~(| M.var_access (| "H", [Access.Array (4)] |), M.var (| "e" |) |) ]] in - do~ M.substitute_var "H" [[ InfixOp.add ~(| M.var_access (| "H", [Access.Array (5)] |), M.var (| "f" |) |) ]] in - do~ M.substitute_var "H" [[ InfixOp.add ~(| M.var_access (| "H", [Access.Array (6)] |), M.var (| "g" |) |) ]] in - do~ M.substitute_var "H" [[ InfixOp.add ~(| M.var_access (| "H", [Access.Array (7)] |), M.var (| "h" |) |) ]] in + do~ M.substitute_var "H" [Access.Array (0)] [[ InfixOp.add ~(| M.var_access (| "H", [Access.Array (0)] |), M.var (| "a" |) |) ]] in + do~ M.substitute_var "H" [Access.Array (1)] [[ InfixOp.add ~(| M.var_access (| "H", [Access.Array (1)] |), M.var (| "b" |) |) ]] in + do~ M.substitute_var "H" [Access.Array (2)] [[ InfixOp.add ~(| M.var_access (| "H", [Access.Array (2)] |), M.var (| "c" |) |) ]] in + do~ M.substitute_var "H" [Access.Array (3)] [[ InfixOp.add ~(| M.var_access (| "H", [Access.Array (3)] |), M.var (| "d" |) |) ]] in + do~ M.substitute_var "H" [Access.Array (4)] [[ InfixOp.add ~(| M.var_access (| "H", [Access.Array (4)] |), M.var (| "e" |) |) ]] in + do~ M.substitute_var "H" [Access.Array (5)] [[ InfixOp.add ~(| M.var_access (| "H", [Access.Array (5)] |), M.var (| "f" |) |) ]] in + do~ M.substitute_var "H" [Access.Array (6)] [[ InfixOp.add ~(| M.var_access (| "H", [Access.Array (6)] |), M.var (| "g" |) |) ]] in + do~ M.substitute_var "H" [Access.Array (7)] [[ InfixOp.add ~(| M.var_access (| "H", [Access.Array (7)] |), M.var (| "h" |) |) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 8 |) ]] ( (* Var *) do~ M.declare_var "j" [[ ([] : list F.t) ]] in - do~ M.substitute_var "j" [[ 0 ]] in + do~ M.substitute_var "j" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "j" |), 32 |) ]] ( - do~ M.substitute_var "out" [[ InfixOp.bitAnd ~(| InfixOp.shiftR ~(| M.var_access (| "H", [Access.Array (M.var (| "i" |))] |), M.var (| "j" |) |), 1 |) ]] in - do~ M.substitute_var "j" [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (InfixOp.sub ~(| InfixOp.add ~(| InfixOp.mul ~(| M.var (| "i" |), 32 |), 31 |), M.var (| "j" |) |))] [[ InfixOp.bitAnd ~(| InfixOp.shiftR ~(| M.var_access (| "H", [Access.Array (M.var (| "i" |))] |), M.var (| "j" |) |), 1 |) ]] in + do~ M.substitute_var "j" [] [[ InfixOp.add ~(| M.var (| "j" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.return_ [[ M.var (| "out" |) ]] in diff --git a/Garden/Circom/Circomlib/translation/circuits/sha256/shift.v b/Garden/Circom/Circomlib/translation/circuits/sha256/shift.v index 484355c..bd53794 100644 --- a/Garden/Circom/Circomlib/translation/circuits/sha256/shift.v +++ b/Garden/Circom/Circomlib/translation/circuits/sha256/shift.v @@ -9,27 +9,33 @@ Module ShRSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End ShRSignals. (* Template body *) Definition ShR (n r : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n); ("r", r)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "n" |) |) ]] ( do~ M.if_ [[ InfixOp.greaterEq ~(| InfixOp.add ~(| M.var (| "i" |), M.var (| "r" |) |), M.var (| "n" |) |) ]] (* then *) ( - do~ M.substitute_var "out" [[ 0 ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |))] [[ 0 ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "out" [[ M.var_access (| "in", [Access.Array (InfixOp.add ~(| M.var (| "i" |), M.var (| "r" |) |))] |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |))] [[ M.var_access (| "in", [Access.Array (InfixOp.add ~(| M.var (| "i" |), M.var (| "r" |) |))] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt diff --git a/Garden/Circom/Circomlib/translation/circuits/sha256/sigma.v b/Garden/Circom/Circomlib/translation/circuits/sha256/sigma.v index 40d207e..fe75bb9 100644 --- a/Garden/Circom/Circomlib/translation/circuits/sha256/sigma.v +++ b/Garden/Circom/Circomlib/translation/circuits/sha256/sigma.v @@ -9,50 +9,56 @@ Module SmallSigmaSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End SmallSigmaSignals. (* Template body *) Definition SmallSigma (ra rb rc : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("ra", ra); ("rb", rb); ("rc", rc)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 32 ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 32 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "k" [[ ([] : list F.t) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in (* Component *) do~ M.declare_component "rota" in - do~ M.substitute_var "rota" [[ M.call_function ~(| "RotR", [ 32; M.var (| "ra" |) ] |) ]] in + do~ M.substitute_var "rota" [] [[ M.call_function ~(| "RotR", [ 32; M.var (| "ra" |) ] |) ]] in (* Component *) do~ M.declare_component "rotb" in - do~ M.substitute_var "rotb" [[ M.call_function ~(| "RotR", [ 32; M.var (| "rb" |) ] |) ]] in + do~ M.substitute_var "rotb" [] [[ M.call_function ~(| "RotR", [ 32; M.var (| "rb" |) ] |) ]] in (* Component *) do~ M.declare_component "shrc" in - do~ M.substitute_var "shrc" [[ M.call_function ~(| "ShR", [ 32; M.var (| "rc" |) ] |) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "shrc" [] [[ M.call_function ~(| "ShR", [ 32; M.var (| "rc" |) ] |) ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "rota" [[ M.var_access (| "in", [Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "rotb" [[ M.var_access (| "in", [Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "shrc" [[ M.var_access (| "in", [Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "rota" [Access.Component "in"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "in", [Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "rotb" [Access.Component "in"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "in", [Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "shrc" [Access.Component "in"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "in", [Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "xor3" in - do~ M.substitute_var "xor3" [[ M.call_function ~(| "Xor3", [ 32 ] |) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "xor3" [] [[ M.call_function ~(| "Xor3", [ 32 ] |) ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "xor3" [[ M.var_access (| "rota", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "xor3" [[ M.var_access (| "rotb", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "xor3" [[ M.var_access (| "shrc", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "xor3" [Access.Component "a"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "rota", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "xor3" [Access.Component "b"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "rotb", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "xor3" [Access.Component "c"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "shrc", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "out" [[ M.var_access (| "xor3", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "k" |))] [[ M.var_access (| "xor3", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt @@ -72,50 +78,56 @@ Module BigSigmaSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End BigSigmaSignals. (* Template body *) Definition BigSigma (ra rb rc : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("ra", ra); ("rb", rb); ("rc", rc)] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 32 ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 32 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "k" [[ ([] : list F.t) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in (* Component *) do~ M.declare_component "rota" in - do~ M.substitute_var "rota" [[ M.call_function ~(| "RotR", [ 32; M.var (| "ra" |) ] |) ]] in + do~ M.substitute_var "rota" [] [[ M.call_function ~(| "RotR", [ 32; M.var (| "ra" |) ] |) ]] in (* Component *) do~ M.declare_component "rotb" in - do~ M.substitute_var "rotb" [[ M.call_function ~(| "RotR", [ 32; M.var (| "rb" |) ] |) ]] in + do~ M.substitute_var "rotb" [] [[ M.call_function ~(| "RotR", [ 32; M.var (| "rb" |) ] |) ]] in (* Component *) do~ M.declare_component "rotc" in - do~ M.substitute_var "rotc" [[ M.call_function ~(| "RotR", [ 32; M.var (| "rc" |) ] |) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "rotc" [] [[ M.call_function ~(| "RotR", [ 32; M.var (| "rc" |) ] |) ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "rota" [[ M.var_access (| "in", [Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "rotb" [[ M.var_access (| "in", [Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "rotc" [[ M.var_access (| "in", [Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "rota" [Access.Component "in"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "in", [Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "rotb" [Access.Component "in"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "in", [Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "rotc" [Access.Component "in"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "in", [Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "xor3" in - do~ M.substitute_var "xor3" [[ M.call_function ~(| "Xor3", [ 32 ] |) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "xor3" [] [[ M.call_function ~(| "Xor3", [ 32 ] |) ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "xor3" [[ M.var_access (| "rota", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "xor3" [[ M.var_access (| "rotb", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "xor3" [[ M.var_access (| "rotc", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "xor3" [Access.Component "a"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "rota", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "xor3" [Access.Component "b"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "rotb", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "xor3" [Access.Component "c"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "rotc", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "out" [[ M.var_access (| "xor3", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "k" |))] [[ M.var_access (| "xor3", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt diff --git a/Garden/Circom/Circomlib/translation/circuits/sha256/sigmaplus.v b/Garden/Circom/Circomlib/translation/circuits/sha256/sigmaplus.v index 88fa9cc..41c5ed2 100644 --- a/Garden/Circom/Circomlib/translation/circuits/sha256/sigmaplus.v +++ b/Garden/Circom/Circomlib/translation/circuits/sha256/sigmaplus.v @@ -15,53 +15,62 @@ Module SigmaPlusSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in2 : P _ in2 "in2" + | in7 : P _ in7 "in7" + | in15 : P _ in15 "in15" + | in16 : P _ in16 "in16" + | out : P _ out "out". + End IsNamed. End SigmaPlusSignals. (* Template body *) Definition SigmaPlus : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in2" [[ [ 32 ] ]] in + do~ M.declare_signal "in2" in (* Signal Input *) - do~ M.declare_signal "in7" [[ [ 32 ] ]] in + do~ M.declare_signal "in7" in (* Signal Input *) - do~ M.declare_signal "in15" [[ [ 32 ] ]] in + do~ M.declare_signal "in15" in (* Signal Input *) - do~ M.declare_signal "in16" [[ [ 32 ] ]] in + do~ M.declare_signal "in16" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 32 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "k" [[ ([] : list F.t) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in (* Component *) do~ M.declare_component "sigma1" in - do~ M.substitute_var "sigma1" [[ M.call_function ~(| "SmallSigma", [ 17; 19; 10 ] |) ]] in + do~ M.substitute_var "sigma1" [] [[ M.call_function ~(| "SmallSigma", [ 17; 19; 10 ] |) ]] in (* Component *) do~ M.declare_component "sigma0" in - do~ M.substitute_var "sigma0" [[ M.call_function ~(| "SmallSigma", [ 7; 18; 3 ] |) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "sigma0" [] [[ M.call_function ~(| "SmallSigma", [ 7; 18; 3 ] |) ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "sigma1" [[ M.var_access (| "in2", [Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sigma0" [[ M.var_access (| "in15", [Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "sigma1" [Access.Component "in"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "in2", [Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sigma0" [Access.Component "in"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "in15", [Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "sum" in - do~ M.substitute_var "sum" [[ M.call_function ~(| "BinSum", [ 32; 4 ] |) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "sum" [] [[ M.call_function ~(| "BinSum", [ 32; 4 ] |) ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "sum" [[ M.var_access (| "sigma1", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sum" [[ M.var_access (| "in7", [Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sum" [[ M.var_access (| "sigma0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sum" [[ M.var_access (| "in16", [Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "sum" [Access.Component "in"; Access.Array (0); Access.Array (M.var (| "k" |))] [[ M.var_access (| "sigma1", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sum" [Access.Component "in"; Access.Array (1); Access.Array (M.var (| "k" |))] [[ M.var_access (| "in7", [Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sum" [Access.Component "in"; Access.Array (2); Access.Array (M.var (| "k" |))] [[ M.var_access (| "sigma0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sum" [Access.Component "in"; Access.Array (3); Access.Array (M.var (| "k" |))] [[ M.var_access (| "in16", [Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "out" [[ M.var_access (| "sum", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "k" |))] [[ M.var_access (| "sum", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt diff --git a/Garden/Circom/Circomlib/translation/circuits/sha256/t1.v b/Garden/Circom/Circomlib/translation/circuits/sha256/t1.v index 9ccce73..167d058 100644 --- a/Garden/Circom/Circomlib/translation/circuits/sha256/t1.v +++ b/Garden/Circom/Circomlib/translation/circuits/sha256/t1.v @@ -19,60 +19,71 @@ Module T1Signals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | h : P _ h "h" + | e : P _ e "e" + | f : P _ f "f" + | g : P _ g "g" + | k : P _ k "k" + | w : P _ w "w" + | out : P _ out "out". + End IsNamed. End T1Signals. (* Template body *) Definition T1 : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "h" [[ [ 32 ] ]] in + do~ M.declare_signal "h" in (* Signal Input *) - do~ M.declare_signal "e" [[ [ 32 ] ]] in + do~ M.declare_signal "e" in (* Signal Input *) - do~ M.declare_signal "f" [[ [ 32 ] ]] in + do~ M.declare_signal "f" in (* Signal Input *) - do~ M.declare_signal "g" [[ [ 32 ] ]] in + do~ M.declare_signal "g" in (* Signal Input *) - do~ M.declare_signal "k" [[ [ 32 ] ]] in + do~ M.declare_signal "k" in (* Signal Input *) - do~ M.declare_signal "w" [[ [ 32 ] ]] in + do~ M.declare_signal "w" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 32 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "ki" [[ ([] : list F.t) ]] in - do~ M.substitute_var "ki" [[ 0 ]] in + do~ M.substitute_var "ki" [] [[ 0 ]] in (* Component *) do~ M.declare_component "ch" in - do~ M.substitute_var "ch" [[ M.call_function ~(| "Ch_t", [ 32 ] |) ]] in + do~ M.substitute_var "ch" [] [[ M.call_function ~(| "Ch_t", [ 32 ] |) ]] in (* Component *) do~ M.declare_component "bigsigma1" in - do~ M.substitute_var "bigsigma1" [[ M.call_function ~(| "BigSigma", [ 6; 11; 25 ] |) ]] in - do~ M.substitute_var "ki" [[ 0 ]] in + do~ M.substitute_var "bigsigma1" [] [[ M.call_function ~(| "BigSigma", [ 6; 11; 25 ] |) ]] in + do~ M.substitute_var "ki" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "ki" |), 32 |) ]] ( - do~ M.substitute_var "bigsigma1" [[ M.var_access (| "e", [Access.Array (M.var (| "ki" |))] |) ]] in - do~ M.substitute_var "ch" [[ M.var_access (| "e", [Access.Array (M.var (| "ki" |))] |) ]] in - do~ M.substitute_var "ch" [[ M.var_access (| "f", [Access.Array (M.var (| "ki" |))] |) ]] in - do~ M.substitute_var "ch" [[ M.var_access (| "g", [Access.Array (M.var (| "ki" |))] |) ]] in - do~ M.substitute_var "ki" [[ InfixOp.add ~(| M.var (| "ki" |), 1 |) ]] in + do~ M.substitute_var "bigsigma1" [Access.Component "in"; Access.Array (M.var (| "ki" |))] [[ M.var_access (| "e", [Access.Array (M.var (| "ki" |))] |) ]] in + do~ M.substitute_var "ch" [Access.Component "a"; Access.Array (M.var (| "ki" |))] [[ M.var_access (| "e", [Access.Array (M.var (| "ki" |))] |) ]] in + do~ M.substitute_var "ch" [Access.Component "b"; Access.Array (M.var (| "ki" |))] [[ M.var_access (| "f", [Access.Array (M.var (| "ki" |))] |) ]] in + do~ M.substitute_var "ch" [Access.Component "c"; Access.Array (M.var (| "ki" |))] [[ M.var_access (| "g", [Access.Array (M.var (| "ki" |))] |) ]] in + do~ M.substitute_var "ki" [] [[ InfixOp.add ~(| M.var (| "ki" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "sum" in - do~ M.substitute_var "sum" [[ M.call_function ~(| "BinSum", [ 32; 5 ] |) ]] in - do~ M.substitute_var "ki" [[ 0 ]] in + do~ M.substitute_var "sum" [] [[ M.call_function ~(| "BinSum", [ 32; 5 ] |) ]] in + do~ M.substitute_var "ki" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "ki" |), 32 |) ]] ( - do~ M.substitute_var "sum" [[ M.var_access (| "h", [Access.Array (M.var (| "ki" |))] |) ]] in - do~ M.substitute_var "sum" [[ M.var_access (| "bigsigma1", [Access.Component "out"; Access.Array (M.var (| "ki" |))] |) ]] in - do~ M.substitute_var "sum" [[ M.var_access (| "ch", [Access.Component "out"; Access.Array (M.var (| "ki" |))] |) ]] in - do~ M.substitute_var "sum" [[ M.var_access (| "k", [Access.Array (M.var (| "ki" |))] |) ]] in - do~ M.substitute_var "sum" [[ M.var_access (| "w", [Access.Array (M.var (| "ki" |))] |) ]] in - do~ M.substitute_var "ki" [[ InfixOp.add ~(| M.var (| "ki" |), 1 |) ]] in + do~ M.substitute_var "sum" [Access.Component "in"; Access.Array (0); Access.Array (M.var (| "ki" |))] [[ M.var_access (| "h", [Access.Array (M.var (| "ki" |))] |) ]] in + do~ M.substitute_var "sum" [Access.Component "in"; Access.Array (1); Access.Array (M.var (| "ki" |))] [[ M.var_access (| "bigsigma1", [Access.Component "out"; Access.Array (M.var (| "ki" |))] |) ]] in + do~ M.substitute_var "sum" [Access.Component "in"; Access.Array (2); Access.Array (M.var (| "ki" |))] [[ M.var_access (| "ch", [Access.Component "out"; Access.Array (M.var (| "ki" |))] |) ]] in + do~ M.substitute_var "sum" [Access.Component "in"; Access.Array (3); Access.Array (M.var (| "ki" |))] [[ M.var_access (| "k", [Access.Array (M.var (| "ki" |))] |) ]] in + do~ M.substitute_var "sum" [Access.Component "in"; Access.Array (4); Access.Array (M.var (| "ki" |))] [[ M.var_access (| "w", [Access.Array (M.var (| "ki" |))] |) ]] in + do~ M.substitute_var "ki" [] [[ InfixOp.add ~(| M.var (| "ki" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "ki" [[ 0 ]] in + do~ M.substitute_var "ki" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "ki" |), 32 |) ]] ( - do~ M.substitute_var "out" [[ M.var_access (| "sum", [Access.Component "out"; Access.Array (M.var (| "ki" |))] |) ]] in - do~ M.substitute_var "ki" [[ InfixOp.add ~(| M.var (| "ki" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "ki" |))] [[ M.var_access (| "sum", [Access.Component "out"; Access.Array (M.var (| "ki" |))] |) ]] in + do~ M.substitute_var "ki" [] [[ InfixOp.add ~(| M.var (| "ki" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt diff --git a/Garden/Circom/Circomlib/translation/circuits/sha256/t2.v b/Garden/Circom/Circomlib/translation/circuits/sha256/t2.v index 8705eed..c6752d8 100644 --- a/Garden/Circom/Circomlib/translation/circuits/sha256/t2.v +++ b/Garden/Circom/Circomlib/translation/circuits/sha256/t2.v @@ -13,51 +13,59 @@ Module T2Signals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | a : P _ a "a" + | b : P _ b "b" + | c : P _ c "c" + | out : P _ out "out". + End IsNamed. End T2Signals. (* Template body *) Definition T2 : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "a" [[ [ 32 ] ]] in + do~ M.declare_signal "a" in (* Signal Input *) - do~ M.declare_signal "b" [[ [ 32 ] ]] in + do~ M.declare_signal "b" in (* Signal Input *) - do~ M.declare_signal "c" [[ [ 32 ] ]] in + do~ M.declare_signal "c" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 32 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "k" [[ ([] : list F.t) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in (* Component *) do~ M.declare_component "bigsigma0" in - do~ M.substitute_var "bigsigma0" [[ M.call_function ~(| "BigSigma", [ 2; 13; 22 ] |) ]] in + do~ M.substitute_var "bigsigma0" [] [[ M.call_function ~(| "BigSigma", [ 2; 13; 22 ] |) ]] in (* Component *) do~ M.declare_component "maj" in - do~ M.substitute_var "maj" [[ M.call_function ~(| "Maj_t", [ 32 ] |) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "maj" [] [[ M.call_function ~(| "Maj_t", [ 32 ] |) ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "bigsigma0" [[ M.var_access (| "a", [Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "maj" [[ M.var_access (| "a", [Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "maj" [[ M.var_access (| "b", [Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "maj" [[ M.var_access (| "c", [Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "bigsigma0" [Access.Component "in"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "a", [Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "maj" [Access.Component "a"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "a", [Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "maj" [Access.Component "b"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "b", [Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "maj" [Access.Component "c"; Access.Array (M.var (| "k" |))] [[ M.var_access (| "c", [Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "sum" in - do~ M.substitute_var "sum" [[ M.call_function ~(| "BinSum", [ 32; 2 ] |) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "sum" [] [[ M.call_function ~(| "BinSum", [ 32; 2 ] |) ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "sum" [[ M.var_access (| "bigsigma0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "sum" [[ M.var_access (| "maj", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "sum" [Access.Component "in"; Access.Array (0); Access.Array (M.var (| "k" |))] [[ M.var_access (| "bigsigma0", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "sum" [Access.Component "in"; Access.Array (1); Access.Array (M.var (| "k" |))] [[ M.var_access (| "maj", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), 32 |) ]] ( - do~ M.substitute_var "out" [[ M.var_access (| "sum", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "k" |))] [[ M.var_access (| "sum", [Access.Component "out"; Access.Array (M.var (| "k" |))] |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt diff --git a/Garden/Circom/Circomlib/translation/circuits/sha256/xor3.v b/Garden/Circom/Circomlib/translation/circuits/sha256/xor3.v index 6eaa133..c21d4d4 100644 --- a/Garden/Circom/Circomlib/translation/circuits/sha256/xor3.v +++ b/Garden/Circom/Circomlib/translation/circuits/sha256/xor3.v @@ -15,28 +15,37 @@ Module Xor3Signals. (* Intermediate *) mid : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | a : P _ a "a" + | b : P _ b "b" + | c : P _ c "c" + | out : P _ out "out" + | mid : P _ mid "mid". + End IsNamed. End Xor3Signals. (* Template body *) Definition Xor3 (n : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("n", n)] ( (* Signal Input *) - do~ M.declare_signal "a" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "a" in (* Signal Input *) - do~ M.declare_signal "b" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "b" in (* Signal Input *) - do~ M.declare_signal "c" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "c" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "out" in (* Signal Intermediate *) - do~ M.declare_signal "mid" [[ [ M.var (| "n" |) ] ]] in + do~ M.declare_signal "mid" in (* Var *) do~ M.declare_var "k" [[ ([] : list F.t) ]] in - do~ M.substitute_var "k" [[ 0 ]] in + do~ M.substitute_var "k" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "k" |), M.var (| "n" |) |) ]] ( - do~ M.substitute_var "mid" [[ InfixOp.mul ~(| M.var_access (| "b", [Access.Array (M.var (| "k" |))] |), M.var_access (| "c", [Access.Array (M.var (| "k" |))] |) |) ]] in - do~ M.substitute_var "out" [[ InfixOp.sub ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.mul ~(| M.var_access (| "a", [Access.Array (M.var (| "k" |))] |), InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| 1, InfixOp.mul ~(| 2, M.var_access (| "b", [Access.Array (M.var (| "k" |))] |) |) |), InfixOp.mul ~(| 2, M.var_access (| "c", [Access.Array (M.var (| "k" |))] |) |) |), InfixOp.mul ~(| 4, M.var_access (| "mid", [Access.Array (M.var (| "k" |))] |) |) |) |), M.var_access (| "b", [Access.Array (M.var (| "k" |))] |) |), M.var_access (| "c", [Access.Array (M.var (| "k" |))] |) |), InfixOp.mul ~(| 2, M.var_access (| "mid", [Access.Array (M.var (| "k" |))] |) |) |) ]] in - do~ M.substitute_var "k" [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in + do~ M.substitute_var "mid" [Access.Array (M.var (| "k" |))] [[ InfixOp.mul ~(| M.var_access (| "b", [Access.Array (M.var (| "k" |))] |), M.var_access (| "c", [Access.Array (M.var (| "k" |))] |) |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "k" |))] [[ InfixOp.sub ~(| InfixOp.add ~(| InfixOp.add ~(| InfixOp.mul ~(| M.var_access (| "a", [Access.Array (M.var (| "k" |))] |), InfixOp.add ~(| InfixOp.sub ~(| InfixOp.sub ~(| 1, InfixOp.mul ~(| 2, M.var_access (| "b", [Access.Array (M.var (| "k" |))] |) |) |), InfixOp.mul ~(| 2, M.var_access (| "c", [Access.Array (M.var (| "k" |))] |) |) |), InfixOp.mul ~(| 4, M.var_access (| "mid", [Access.Array (M.var (| "k" |))] |) |) |) |), M.var_access (| "b", [Access.Array (M.var (| "k" |))] |) |), M.var_access (| "c", [Access.Array (M.var (| "k" |))] |) |), InfixOp.mul ~(| 2, M.var_access (| "mid", [Access.Array (M.var (| "k" |))] |) |) |) ]] in + do~ M.substitute_var "k" [] [[ InfixOp.add ~(| M.var (| "k" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt diff --git a/Garden/Circom/Circomlib/translation/circuits/sign.v b/Garden/Circom/Circomlib/translation/circuits/sign.v index 4cb87cd..9d97159 100644 --- a/Garden/Circom/Circomlib/translation/circuits/sign.v +++ b/Garden/Circom/Circomlib/translation/circuits/sign.v @@ -9,28 +9,34 @@ Module SignSignals. (* Output *) sign : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | sign : P _ sign "sign". + End IsNamed. End SignSignals. (* Template body *) Definition Sign : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 254 ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "sign" [[ ([] : list F.t) ]] in + do~ M.declare_signal "sign" in (* Component *) do~ M.declare_component "comp" in - do~ M.substitute_var "comp" [[ M.call_function ~(| "CompConstant", [ 10944121435919637611123202872628637544274182200208017171849102093287904247808 ] |) ]] in + do~ M.substitute_var "comp" [] [[ M.call_function ~(| "CompConstant", [ 10944121435919637611123202872628637544274182200208017171849102093287904247808 ] |) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 254 |) ]] ( - do~ M.substitute_var "comp" [[ M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "comp" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "sign" [[ M.var_access (| "comp", [Access.Component "out"] |) ]] in + do~ M.substitute_var "sign" [] [[ M.var_access (| "comp", [Access.Component "out"] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/smt/smthash_mimc.v b/Garden/Circom/Circomlib/translation/circuits/smt/smthash_mimc.v index d61bbdc..9354b46 100644 --- a/Garden/Circom/Circomlib/translation/circuits/smt/smthash_mimc.v +++ b/Garden/Circom/Circomlib/translation/circuits/smt/smthash_mimc.v @@ -11,24 +11,31 @@ Module SMTHash1Signals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | key : P _ key "key" + | value : P _ value "value" + | out : P _ out "out". + End IsNamed. End SMTHash1Signals. (* Template body *) Definition SMTHash1 : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "key" [[ ([] : list F.t) ]] in + do~ M.declare_signal "key" in (* Signal Input *) - do~ M.declare_signal "value" [[ ([] : list F.t) ]] in + do~ M.declare_signal "value" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "h" in - do~ M.substitute_var "h" [[ M.call_function ~(| "MultiMiMC7", [ 2; 91 ] |) ]] in - do~ M.substitute_var "h" [[ M.var (| "key" |) ]] in - do~ M.substitute_var "h" [[ M.var (| "value" |) ]] in - do~ M.substitute_var "h" [[ 1 ]] in - do~ M.substitute_var "out" [[ M.var_access (| "h", [Access.Component "out"] |) ]] in + do~ M.substitute_var "h" [] [[ M.call_function ~(| "MultiMiMC7", [ 2; 91 ] |) ]] in + do~ M.substitute_var "h" [Access.Component "in"; Access.Array (0)] [[ M.var (| "key" |) ]] in + do~ M.substitute_var "h" [Access.Component "in"; Access.Array (1)] [[ M.var (| "value" |) ]] in + do~ M.substitute_var "h" [Access.Component "k"] [[ 1 ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "h", [Access.Component "out"] |) ]] in M.pure BlockUnit.Tt ). @@ -48,24 +55,31 @@ Module SMTHash2Signals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | L : P _ L "L" + | R : P _ R "R" + | out : P _ out "out". + End IsNamed. End SMTHash2Signals. (* Template body *) Definition SMTHash2 : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "L" [[ ([] : list F.t) ]] in + do~ M.declare_signal "L" in (* Signal Input *) - do~ M.declare_signal "R" [[ ([] : list F.t) ]] in + do~ M.declare_signal "R" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "h" in - do~ M.substitute_var "h" [[ M.call_function ~(| "MultiMiMC7", [ 2; 91 ] |) ]] in - do~ M.substitute_var "h" [[ M.var (| "L" |) ]] in - do~ M.substitute_var "h" [[ M.var (| "R" |) ]] in - do~ M.substitute_var "h" [[ 0 ]] in - do~ M.substitute_var "out" [[ M.var_access (| "h", [Access.Component "out"] |) ]] in + do~ M.substitute_var "h" [] [[ M.call_function ~(| "MultiMiMC7", [ 2; 91 ] |) ]] in + do~ M.substitute_var "h" [Access.Component "in"; Access.Array (0)] [[ M.var (| "L" |) ]] in + do~ M.substitute_var "h" [Access.Component "in"; Access.Array (1)] [[ M.var (| "R" |) ]] in + do~ M.substitute_var "h" [Access.Component "k"] [[ 0 ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "h", [Access.Component "out"] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/smt/smthash_poseidon.v b/Garden/Circom/Circomlib/translation/circuits/smt/smthash_poseidon.v index b345f3e..626bc79 100644 --- a/Garden/Circom/Circomlib/translation/circuits/smt/smthash_poseidon.v +++ b/Garden/Circom/Circomlib/translation/circuits/smt/smthash_poseidon.v @@ -11,24 +11,31 @@ Module SMTHash1Signals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | key : P _ key "key" + | value : P _ value "value" + | out : P _ out "out". + End IsNamed. End SMTHash1Signals. (* Template body *) Definition SMTHash1 : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "key" [[ ([] : list F.t) ]] in + do~ M.declare_signal "key" in (* Signal Input *) - do~ M.declare_signal "value" [[ ([] : list F.t) ]] in + do~ M.declare_signal "value" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "h" in - do~ M.substitute_var "h" [[ M.call_function ~(| "Poseidon", [ 3 ] |) ]] in - do~ M.substitute_var "h" [[ M.var (| "key" |) ]] in - do~ M.substitute_var "h" [[ M.var (| "value" |) ]] in - do~ M.substitute_var "h" [[ 1 ]] in - do~ M.substitute_var "out" [[ M.var_access (| "h", [Access.Component "out"] |) ]] in + do~ M.substitute_var "h" [] [[ M.call_function ~(| "Poseidon", [ 3 ] |) ]] in + do~ M.substitute_var "h" [Access.Component "inputs"; Access.Array (0)] [[ M.var (| "key" |) ]] in + do~ M.substitute_var "h" [Access.Component "inputs"; Access.Array (1)] [[ M.var (| "value" |) ]] in + do~ M.substitute_var "h" [Access.Component "inputs"; Access.Array (2)] [[ 1 ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "h", [Access.Component "out"] |) ]] in M.pure BlockUnit.Tt ). @@ -48,23 +55,30 @@ Module SMTHash2Signals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | L : P _ L "L" + | R : P _ R "R" + | out : P _ out "out". + End IsNamed. End SMTHash2Signals. (* Template body *) Definition SMTHash2 : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "L" [[ ([] : list F.t) ]] in + do~ M.declare_signal "L" in (* Signal Input *) - do~ M.declare_signal "R" [[ ([] : list F.t) ]] in + do~ M.declare_signal "R" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "h" in - do~ M.substitute_var "h" [[ M.call_function ~(| "Poseidon", [ 2 ] |) ]] in - do~ M.substitute_var "h" [[ M.var (| "L" |) ]] in - do~ M.substitute_var "h" [[ M.var (| "R" |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "h", [Access.Component "out"] |) ]] in + do~ M.substitute_var "h" [] [[ M.call_function ~(| "Poseidon", [ 2 ] |) ]] in + do~ M.substitute_var "h" [Access.Component "inputs"; Access.Array (0)] [[ M.var (| "L" |) ]] in + do~ M.substitute_var "h" [Access.Component "inputs"; Access.Array (1)] [[ M.var (| "R" |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "h", [Access.Component "out"] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/smt/smtlevins.v b/Garden/Circom/Circomlib/translation/circuits/smt/smtlevins.v index e63ec79..1793b95 100644 --- a/Garden/Circom/Circomlib/translation/circuits/smt/smtlevins.v +++ b/Garden/Circom/Circomlib/translation/circuits/smt/smtlevins.v @@ -13,45 +13,53 @@ Module SMTLevInsSignals. (* Intermediate *) done : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | enabled : P _ enabled "enabled" + | siblings : P _ siblings "siblings" + | levIns : P _ levIns "levIns" + | done : P _ done "done". + End IsNamed. End SMTLevInsSignals. (* Template body *) Definition SMTLevIns (nLevels : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("nLevels", nLevels)] ( (* Signal Input *) - do~ M.declare_signal "enabled" [[ ([] : list F.t) ]] in + do~ M.declare_signal "enabled" in (* Signal Input *) - do~ M.declare_signal "siblings" [[ [ M.var (| "nLevels" |) ] ]] in + do~ M.declare_signal "siblings" in (* Signal Output *) - do~ M.declare_signal "levIns" [[ [ M.var (| "nLevels" |) ] ]] in + do~ M.declare_signal "levIns" in (* Signal Intermediate *) - do~ M.declare_signal "done" [[ [ InfixOp.sub ~(| M.var (| "nLevels" |), 1 |) ] ]] in + do~ M.declare_signal "done" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Component *) do~ M.declare_component "isZero" in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "nLevels" |) |) ]] ( - do~ M.substitute_var "isZero" [[ M.call_function ~(| "IsZero", ([] : list F.t) |) ]] in - do~ M.substitute_var "isZero" [[ M.var_access (| "siblings", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "isZero" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "IsZero", ([] : list F.t) |) ]] in + do~ M.substitute_var "isZero" [Access.Array (M.var (| "i" |)); Access.Component "in"] [[ M.var_access (| "siblings", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.equality_constraint [[ InfixOp.mul ~(| InfixOp.sub ~(| M.var_access (| "isZero", [Access.Array (InfixOp.sub ~(| M.var (| "nLevels" |), 1 |)); Access.Component "out"] |), 1 |), M.var (| "enabled" |) |) ]] [[ 0 ]] in - do~ M.substitute_var "levIns" [[ InfixOp.sub ~(| 1, M.var_access (| "isZero", [Access.Array (InfixOp.sub ~(| M.var (| "nLevels" |), 2 |)); Access.Component "out"] |) |) ]] in - do~ M.substitute_var "done" [[ M.var_access (| "levIns", [Access.Array (InfixOp.sub ~(| M.var (| "nLevels" |), 1 |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.sub ~(| M.var (| "nLevels" |), 2 |) ]] in + do~ M.substitute_var "levIns" [Access.Array (InfixOp.sub ~(| M.var (| "nLevels" |), 1 |))] [[ InfixOp.sub ~(| 1, M.var_access (| "isZero", [Access.Array (InfixOp.sub ~(| M.var (| "nLevels" |), 2 |)); Access.Component "out"] |) |) ]] in + do~ M.substitute_var "done" [Access.Array (InfixOp.sub ~(| M.var (| "nLevels" |), 2 |))] [[ M.var_access (| "levIns", [Access.Array (InfixOp.sub ~(| M.var (| "nLevels" |), 1 |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.sub ~(| M.var (| "nLevels" |), 2 |) ]] in do~ M.while [[ InfixOp.greater ~(| M.var (| "i" |), 0 |) ]] ( - do~ M.substitute_var "levIns" [[ InfixOp.mul ~(| InfixOp.sub ~(| 1, M.var_access (| "done", [Access.Array (M.var (| "i" |))] |) |), InfixOp.sub ~(| 1, M.var_access (| "isZero", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"] |) |) |) ]] in - do~ M.substitute_var "done" [[ InfixOp.add ~(| M.var_access (| "levIns", [Access.Array (M.var (| "i" |))] |), M.var_access (| "done", [Access.Array (M.var (| "i" |))] |) |) ]] in - do~ M.substitute_var "i" [[ InfixOp.sub ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "levIns" [Access.Array (M.var (| "i" |))] [[ InfixOp.mul ~(| InfixOp.sub ~(| 1, M.var_access (| "done", [Access.Array (M.var (| "i" |))] |) |), InfixOp.sub ~(| 1, M.var_access (| "isZero", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "out"] |) |) |) ]] in + do~ M.substitute_var "done" [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |))] [[ InfixOp.add ~(| M.var_access (| "levIns", [Access.Array (M.var (| "i" |))] |), M.var_access (| "done", [Access.Array (M.var (| "i" |))] |) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.sub ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "levIns" [[ InfixOp.sub ~(| 1, M.var_access (| "done", [Access.Array (0)] |) |) ]] in + do~ M.substitute_var "levIns" [Access.Array (0)] [[ InfixOp.sub ~(| 1, M.var_access (| "done", [Access.Array (0)] |) |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/smt/smtprocessor.v b/Garden/Circom/Circomlib/translation/circuits/smt/smtprocessor.v index f54037d..7cca989 100644 --- a/Garden/Circom/Circomlib/translation/circuits/smt/smtprocessor.v +++ b/Garden/Circom/Circomlib/translation/circuits/smt/smtprocessor.v @@ -25,101 +25,115 @@ Module SMTProcessorSignals. (* Intermediate *) enabled : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | oldRoot : P _ oldRoot "oldRoot" + | newRoot : P _ newRoot "newRoot" + | siblings : P _ siblings "siblings" + | oldKey : P _ oldKey "oldKey" + | oldValue : P _ oldValue "oldValue" + | isOld0 : P _ isOld0 "isOld0" + | newKey : P _ newKey "newKey" + | newValue : P _ newValue "newValue" + | fnc : P _ fnc "fnc" + | enabled : P _ enabled "enabled". + End IsNamed. End SMTProcessorSignals. (* Template body *) Definition SMTProcessor (nLevels : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("nLevels", nLevels)] ( (* Signal Input *) - do~ M.declare_signal "oldRoot" [[ ([] : list F.t) ]] in + do~ M.declare_signal "oldRoot" in (* Signal Output *) - do~ M.declare_signal "newRoot" [[ ([] : list F.t) ]] in + do~ M.declare_signal "newRoot" in (* Signal Input *) - do~ M.declare_signal "siblings" [[ [ M.var (| "nLevels" |) ] ]] in + do~ M.declare_signal "siblings" in (* Signal Input *) - do~ M.declare_signal "oldKey" [[ ([] : list F.t) ]] in + do~ M.declare_signal "oldKey" in (* Signal Input *) - do~ M.declare_signal "oldValue" [[ ([] : list F.t) ]] in + do~ M.declare_signal "oldValue" in (* Signal Input *) - do~ M.declare_signal "isOld0" [[ ([] : list F.t) ]] in + do~ M.declare_signal "isOld0" in (* Signal Input *) - do~ M.declare_signal "newKey" [[ ([] : list F.t) ]] in + do~ M.declare_signal "newKey" in (* Signal Input *) - do~ M.declare_signal "newValue" [[ ([] : list F.t) ]] in + do~ M.declare_signal "newValue" in (* Signal Input *) - do~ M.declare_signal "fnc" [[ [ 2 ] ]] in + do~ M.declare_signal "fnc" in (* Signal Intermediate *) - do~ M.declare_signal "enabled" [[ ([] : list F.t) ]] in + do~ M.declare_signal "enabled" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in - do~ M.substitute_var "enabled" [[ InfixOp.sub ~(| InfixOp.add ~(| M.var_access (| "fnc", [Access.Array (0)] |), M.var_access (| "fnc", [Access.Array (1)] |) |), InfixOp.mul ~(| M.var_access (| "fnc", [Access.Array (0)] |), M.var_access (| "fnc", [Access.Array (1)] |) |) |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in + do~ M.substitute_var "enabled" [] [[ InfixOp.sub ~(| InfixOp.add ~(| M.var_access (| "fnc", [Access.Array (0)] |), M.var_access (| "fnc", [Access.Array (1)] |) |), InfixOp.mul ~(| M.var_access (| "fnc", [Access.Array (0)] |), M.var_access (| "fnc", [Access.Array (1)] |) |) |) ]] in (* Component *) do~ M.declare_component "hash1Old" in - do~ M.substitute_var "hash1Old" [[ M.call_function ~(| "SMTHash1", ([] : list F.t) |) ]] in - do~ M.substitute_var "hash1Old" [[ M.var (| "oldKey" |) ]] in - do~ M.substitute_var "hash1Old" [[ M.var (| "oldValue" |) ]] in + do~ M.substitute_var "hash1Old" [] [[ M.call_function ~(| "SMTHash1", ([] : list F.t) |) ]] in + do~ M.substitute_var "hash1Old" [Access.Component "key"] [[ M.var (| "oldKey" |) ]] in + do~ M.substitute_var "hash1Old" [Access.Component "value"] [[ M.var (| "oldValue" |) ]] in (* Component *) do~ M.declare_component "hash1New" in - do~ M.substitute_var "hash1New" [[ M.call_function ~(| "SMTHash1", ([] : list F.t) |) ]] in - do~ M.substitute_var "hash1New" [[ M.var (| "newKey" |) ]] in - do~ M.substitute_var "hash1New" [[ M.var (| "newValue" |) ]] in + do~ M.substitute_var "hash1New" [] [[ M.call_function ~(| "SMTHash1", ([] : list F.t) |) ]] in + do~ M.substitute_var "hash1New" [Access.Component "key"] [[ M.var (| "newKey" |) ]] in + do~ M.substitute_var "hash1New" [Access.Component "value"] [[ M.var (| "newValue" |) ]] in (* Component *) do~ M.declare_component "n2bOld" in - do~ M.substitute_var "n2bOld" [[ M.call_function ~(| "Num2Bits_strict", ([] : list F.t) |) ]] in + do~ M.substitute_var "n2bOld" [] [[ M.call_function ~(| "Num2Bits_strict", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "n2bNew" in - do~ M.substitute_var "n2bNew" [[ M.call_function ~(| "Num2Bits_strict", ([] : list F.t) |) ]] in - do~ M.substitute_var "n2bOld" [[ M.var (| "oldKey" |) ]] in - do~ M.substitute_var "n2bNew" [[ M.var (| "newKey" |) ]] in + do~ M.substitute_var "n2bNew" [] [[ M.call_function ~(| "Num2Bits_strict", ([] : list F.t) |) ]] in + do~ M.substitute_var "n2bOld" [Access.Component "in"] [[ M.var (| "oldKey" |) ]] in + do~ M.substitute_var "n2bNew" [Access.Component "in"] [[ M.var (| "newKey" |) ]] in (* Component *) do~ M.declare_component "smtLevIns" in - do~ M.substitute_var "smtLevIns" [[ M.call_function ~(| "SMTLevIns", [ M.var (| "nLevels" |) ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "smtLevIns" [] [[ M.call_function ~(| "SMTLevIns", [ M.var (| "nLevels" |) ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "nLevels" |) |) ]] ( - do~ M.substitute_var "smtLevIns" [[ M.var_access (| "siblings", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "smtLevIns" [Access.Component "siblings"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "siblings", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "smtLevIns" [[ M.var (| "enabled" |) ]] in + do~ M.substitute_var "smtLevIns" [Access.Component "enabled"] [[ M.var (| "enabled" |) ]] in (* Component *) do~ M.declare_component "xors" in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "nLevels" |) |) ]] ( - do~ M.substitute_var "xors" [[ M.call_function ~(| "XOR", ([] : list F.t) |) ]] in - do~ M.substitute_var "xors" [[ M.var_access (| "n2bOld", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "xors" [[ M.var_access (| "n2bNew", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "xors" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "XOR", ([] : list F.t) |) ]] in + do~ M.substitute_var "xors" [Access.Array (M.var (| "i" |)); Access.Component "a"] [[ M.var_access (| "n2bOld", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "xors" [Access.Array (M.var (| "i" |)); Access.Component "b"] [[ M.var_access (| "n2bNew", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "sm" in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "nLevels" |) |) ]] ( - do~ M.substitute_var "sm" [[ M.call_function ~(| "SMTProcessorSM", ([] : list F.t) |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "SMTProcessorSM", ([] : list F.t) |) ]] in do~ M.if_ [[ InfixOp.eq ~(| M.var (| "i" |), 0 |) ]] (* then *) ( - do~ M.substitute_var "sm" [[ M.var (| "enabled" |) ]] in - do~ M.substitute_var "sm" [[ 0 ]] in - do~ M.substitute_var "sm" [[ 0 ]] in - do~ M.substitute_var "sm" [[ 0 ]] in - do~ M.substitute_var "sm" [[ InfixOp.sub ~(| 1, M.var (| "enabled" |) |) ]] in - do~ M.substitute_var "sm" [[ 0 ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "prev_top"] [[ M.var (| "enabled" |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "prev_old0"] [[ 0 ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "prev_bot"] [[ 0 ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "prev_new1"] [[ 0 ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "prev_na"] [[ InfixOp.sub ~(| 1, M.var (| "enabled" |) |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "prev_upd"] [[ 0 ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "sm" [[ M.var_access (| "sm", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "st_top"] |) ]] in - do~ M.substitute_var "sm" [[ M.var_access (| "sm", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "st_old0"] |) ]] in - do~ M.substitute_var "sm" [[ M.var_access (| "sm", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "st_bot"] |) ]] in - do~ M.substitute_var "sm" [[ M.var_access (| "sm", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "st_new1"] |) ]] in - do~ M.substitute_var "sm" [[ M.var_access (| "sm", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "st_na"] |) ]] in - do~ M.substitute_var "sm" [[ M.var_access (| "sm", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "st_upd"] |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "prev_top"] [[ M.var_access (| "sm", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "st_top"] |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "prev_old0"] [[ M.var_access (| "sm", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "st_old0"] |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "prev_bot"] [[ M.var_access (| "sm", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "st_bot"] |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "prev_new1"] [[ M.var_access (| "sm", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "st_new1"] |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "prev_na"] [[ M.var_access (| "sm", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "st_na"] |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "prev_upd"] [[ M.var_access (| "sm", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "st_upd"] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "sm" [[ M.var (| "isOld0" |) ]] in - do~ M.substitute_var "sm" [[ M.var_access (| "xors", [Access.Array (M.var (| "i" |)); Access.Component "out"] |) ]] in - do~ M.substitute_var "sm" [[ M.var_access (| "fnc", [Access.Array (0)] |) ]] in - do~ M.substitute_var "sm" [[ M.var_access (| "fnc", [Access.Array (1)] |) ]] in - do~ M.substitute_var "sm" [[ M.var_access (| "smtLevIns", [Access.Component "levIns"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "is0"] [[ M.var (| "isOld0" |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "xor"] [[ M.var_access (| "xors", [Access.Array (M.var (| "i" |)); Access.Component "out"] |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "fnc"; Access.Array (0)] [[ M.var_access (| "fnc", [Access.Array (0)] |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "fnc"; Access.Array (1)] [[ M.var_access (| "fnc", [Access.Array (1)] |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "levIns"] [[ M.var_access (| "smtLevIns", [Access.Component "levIns"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.equality_constraint @@ -128,55 +142,55 @@ Definition SMTProcessor (nLevels : F.t) : M.t (BlockUnit.t Empty_set) := in (* Component *) do~ M.declare_component "levels" in - do~ M.substitute_var "i" [[ InfixOp.sub ~(| M.var (| "nLevels" |), 1 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.sub ~(| M.var (| "nLevels" |), 1 |) ]] in do~ M.while [[ InfixOp.notEq ~(| M.var (| "i" |), PrefixOp.sub ~(| 1 |) |) ]] ( - do~ M.substitute_var "levels" [[ M.call_function ~(| "SMTProcessorLevel", ([] : list F.t) |) ]] in - do~ M.substitute_var "levels" [[ M.var_access (| "sm", [Access.Array (M.var (| "i" |)); Access.Component "st_top"] |) ]] in - do~ M.substitute_var "levels" [[ M.var_access (| "sm", [Access.Array (M.var (| "i" |)); Access.Component "st_old0"] |) ]] in - do~ M.substitute_var "levels" [[ M.var_access (| "sm", [Access.Array (M.var (| "i" |)); Access.Component "st_bot"] |) ]] in - do~ M.substitute_var "levels" [[ M.var_access (| "sm", [Access.Array (M.var (| "i" |)); Access.Component "st_new1"] |) ]] in - do~ M.substitute_var "levels" [[ M.var_access (| "sm", [Access.Array (M.var (| "i" |)); Access.Component "st_na"] |) ]] in - do~ M.substitute_var "levels" [[ M.var_access (| "sm", [Access.Array (M.var (| "i" |)); Access.Component "st_upd"] |) ]] in - do~ M.substitute_var "levels" [[ M.var_access (| "siblings", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "levels" [[ M.var_access (| "hash1Old", [Access.Component "out"] |) ]] in - do~ M.substitute_var "levels" [[ M.var_access (| "hash1New", [Access.Component "out"] |) ]] in - do~ M.substitute_var "levels" [[ M.var_access (| "n2bNew", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "SMTProcessorLevel", ([] : list F.t) |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "st_top"] [[ M.var_access (| "sm", [Access.Array (M.var (| "i" |)); Access.Component "st_top"] |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "st_old0"] [[ M.var_access (| "sm", [Access.Array (M.var (| "i" |)); Access.Component "st_old0"] |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "st_bot"] [[ M.var_access (| "sm", [Access.Array (M.var (| "i" |)); Access.Component "st_bot"] |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "st_new1"] [[ M.var_access (| "sm", [Access.Array (M.var (| "i" |)); Access.Component "st_new1"] |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "st_na"] [[ M.var_access (| "sm", [Access.Array (M.var (| "i" |)); Access.Component "st_na"] |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "st_upd"] [[ M.var_access (| "sm", [Access.Array (M.var (| "i" |)); Access.Component "st_upd"] |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "sibling"] [[ M.var_access (| "siblings", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "old1leaf"] [[ M.var_access (| "hash1Old", [Access.Component "out"] |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "new1leaf"] [[ M.var_access (| "hash1New", [Access.Component "out"] |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "newlrbit"] [[ M.var_access (| "n2bNew", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in do~ M.if_ [[ InfixOp.eq ~(| M.var (| "i" |), InfixOp.sub ~(| M.var (| "nLevels" |), 1 |) |) ]] (* then *) ( - do~ M.substitute_var "levels" [[ 0 ]] in - do~ M.substitute_var "levels" [[ 0 ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "oldChild"] [[ 0 ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "newChild"] [[ 0 ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "levels" [[ M.var_access (| "levels", [Access.Array (InfixOp.add ~(| M.var (| "i" |), 1 |)); Access.Component "oldRoot"] |) ]] in - do~ M.substitute_var "levels" [[ M.var_access (| "levels", [Access.Array (InfixOp.add ~(| M.var (| "i" |), 1 |)); Access.Component "newRoot"] |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "oldChild"] [[ M.var_access (| "levels", [Access.Array (InfixOp.add ~(| M.var (| "i" |), 1 |)); Access.Component "oldRoot"] |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "newChild"] [[ M.var_access (| "levels", [Access.Array (InfixOp.add ~(| M.var (| "i" |), 1 |)); Access.Component "newRoot"] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ InfixOp.sub ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.sub ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "topSwitcher" in - do~ M.substitute_var "topSwitcher" [[ M.call_function ~(| "Switcher", ([] : list F.t) |) ]] in - do~ M.substitute_var "topSwitcher" [[ InfixOp.mul ~(| M.var_access (| "fnc", [Access.Array (0)] |), M.var_access (| "fnc", [Access.Array (1)] |) |) ]] in - do~ M.substitute_var "topSwitcher" [[ M.var_access (| "levels", [Access.Array (0); Access.Component "oldRoot"] |) ]] in - do~ M.substitute_var "topSwitcher" [[ M.var_access (| "levels", [Access.Array (0); Access.Component "newRoot"] |) ]] in + do~ M.substitute_var "topSwitcher" [] [[ M.call_function ~(| "Switcher", ([] : list F.t) |) ]] in + do~ M.substitute_var "topSwitcher" [Access.Component "sel"] [[ InfixOp.mul ~(| M.var_access (| "fnc", [Access.Array (0)] |), M.var_access (| "fnc", [Access.Array (1)] |) |) ]] in + do~ M.substitute_var "topSwitcher" [Access.Component "L"] [[ M.var_access (| "levels", [Access.Array (0); Access.Component "oldRoot"] |) ]] in + do~ M.substitute_var "topSwitcher" [Access.Component "R"] [[ M.var_access (| "levels", [Access.Array (0); Access.Component "newRoot"] |) ]] in (* Component *) do~ M.declare_component "checkOldInput" in - do~ M.substitute_var "checkOldInput" [[ M.call_function ~(| "ForceEqualIfEnabled", ([] : list F.t) |) ]] in - do~ M.substitute_var "checkOldInput" [[ M.var (| "enabled" |) ]] in - do~ M.substitute_var "checkOldInput" [[ M.var (| "oldRoot" |) ]] in - do~ M.substitute_var "checkOldInput" [[ M.var_access (| "topSwitcher", [Access.Component "outL"] |) ]] in - do~ M.substitute_var "newRoot" [[ InfixOp.add ~(| InfixOp.mul ~(| M.var (| "enabled" |), InfixOp.sub ~(| M.var_access (| "topSwitcher", [Access.Component "outR"] |), M.var (| "oldRoot" |) |) |), M.var (| "oldRoot" |) |) ]] in + do~ M.substitute_var "checkOldInput" [] [[ M.call_function ~(| "ForceEqualIfEnabled", ([] : list F.t) |) ]] in + do~ M.substitute_var "checkOldInput" [Access.Component "enabled"] [[ M.var (| "enabled" |) ]] in + do~ M.substitute_var "checkOldInput" [Access.Component "in"; Access.Array (0)] [[ M.var (| "oldRoot" |) ]] in + do~ M.substitute_var "checkOldInput" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "topSwitcher", [Access.Component "outL"] |) ]] in + do~ M.substitute_var "newRoot" [] [[ InfixOp.add ~(| InfixOp.mul ~(| M.var (| "enabled" |), InfixOp.sub ~(| M.var_access (| "topSwitcher", [Access.Component "outR"] |), M.var (| "oldRoot" |) |) |), M.var (| "oldRoot" |) |) ]] in (* Component *) do~ M.declare_component "areKeyEquals" in - do~ M.substitute_var "areKeyEquals" [[ M.call_function ~(| "IsEqual", ([] : list F.t) |) ]] in - do~ M.substitute_var "areKeyEquals" [[ M.var (| "oldKey" |) ]] in - do~ M.substitute_var "areKeyEquals" [[ M.var (| "newKey" |) ]] in + do~ M.substitute_var "areKeyEquals" [] [[ M.call_function ~(| "IsEqual", ([] : list F.t) |) ]] in + do~ M.substitute_var "areKeyEquals" [Access.Component "in"; Access.Array (0)] [[ M.var (| "oldKey" |) ]] in + do~ M.substitute_var "areKeyEquals" [Access.Component "in"; Access.Array (1)] [[ M.var (| "newKey" |) ]] in (* Component *) do~ M.declare_component "keysOk" in - do~ M.substitute_var "keysOk" [[ M.call_function ~(| "MultiAND", [ 3 ] |) ]] in - do~ M.substitute_var "keysOk" [[ InfixOp.sub ~(| 1, M.var_access (| "fnc", [Access.Array (0)] |) |) ]] in - do~ M.substitute_var "keysOk" [[ M.var_access (| "fnc", [Access.Array (1)] |) ]] in - do~ M.substitute_var "keysOk" [[ InfixOp.sub ~(| 1, M.var_access (| "areKeyEquals", [Access.Component "out"] |) |) ]] in + do~ M.substitute_var "keysOk" [] [[ M.call_function ~(| "MultiAND", [ 3 ] |) ]] in + do~ M.substitute_var "keysOk" [Access.Component "in"; Access.Array (0)] [[ InfixOp.sub ~(| 1, M.var_access (| "fnc", [Access.Array (0)] |) |) ]] in + do~ M.substitute_var "keysOk" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "fnc", [Access.Array (1)] |) ]] in + do~ M.substitute_var "keysOk" [Access.Component "in"; Access.Array (2)] [[ InfixOp.sub ~(| 1, M.var_access (| "areKeyEquals", [Access.Component "out"] |) |) ]] in do~ M.equality_constraint [[ M.var_access (| "keysOk", [Access.Component "out"] |) ]] [[ 0 ]] diff --git a/Garden/Circom/Circomlib/translation/circuits/smt/smtprocessorlevel.v b/Garden/Circom/Circomlib/translation/circuits/smt/smtprocessorlevel.v index 17cf4a8..7ff1baf 100644 --- a/Garden/Circom/Circomlib/translation/circuits/smt/smtprocessorlevel.v +++ b/Garden/Circom/Circomlib/translation/circuits/smt/smtprocessorlevel.v @@ -35,69 +35,88 @@ Module SMTProcessorLevelSignals. (* Intermediate *) aux : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | st_top : P _ st_top "st_top" + | st_old0 : P _ st_old0 "st_old0" + | st_bot : P _ st_bot "st_bot" + | st_new1 : P _ st_new1 "st_new1" + | st_na : P _ st_na "st_na" + | st_upd : P _ st_upd "st_upd" + | oldRoot : P _ oldRoot "oldRoot" + | newRoot : P _ newRoot "newRoot" + | sibling : P _ sibling "sibling" + | old1leaf : P _ old1leaf "old1leaf" + | new1leaf : P _ new1leaf "new1leaf" + | newlrbit : P _ newlrbit "newlrbit" + | oldChild : P _ oldChild "oldChild" + | newChild : P _ newChild "newChild" + | aux : P _ aux "aux". + End IsNamed. End SMTProcessorLevelSignals. (* Template body *) Definition SMTProcessorLevel : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "st_top" [[ ([] : list F.t) ]] in + do~ M.declare_signal "st_top" in (* Signal Input *) - do~ M.declare_signal "st_old0" [[ ([] : list F.t) ]] in + do~ M.declare_signal "st_old0" in (* Signal Input *) - do~ M.declare_signal "st_bot" [[ ([] : list F.t) ]] in + do~ M.declare_signal "st_bot" in (* Signal Input *) - do~ M.declare_signal "st_new1" [[ ([] : list F.t) ]] in + do~ M.declare_signal "st_new1" in (* Signal Input *) - do~ M.declare_signal "st_na" [[ ([] : list F.t) ]] in + do~ M.declare_signal "st_na" in (* Signal Input *) - do~ M.declare_signal "st_upd" [[ ([] : list F.t) ]] in + do~ M.declare_signal "st_upd" in (* Signal Output *) - do~ M.declare_signal "oldRoot" [[ ([] : list F.t) ]] in + do~ M.declare_signal "oldRoot" in (* Signal Output *) - do~ M.declare_signal "newRoot" [[ ([] : list F.t) ]] in + do~ M.declare_signal "newRoot" in (* Signal Input *) - do~ M.declare_signal "sibling" [[ ([] : list F.t) ]] in + do~ M.declare_signal "sibling" in (* Signal Input *) - do~ M.declare_signal "old1leaf" [[ ([] : list F.t) ]] in + do~ M.declare_signal "old1leaf" in (* Signal Input *) - do~ M.declare_signal "new1leaf" [[ ([] : list F.t) ]] in + do~ M.declare_signal "new1leaf" in (* Signal Input *) - do~ M.declare_signal "newlrbit" [[ ([] : list F.t) ]] in + do~ M.declare_signal "newlrbit" in (* Signal Input *) - do~ M.declare_signal "oldChild" [[ ([] : list F.t) ]] in + do~ M.declare_signal "oldChild" in (* Signal Input *) - do~ M.declare_signal "newChild" [[ ([] : list F.t) ]] in + do~ M.declare_signal "newChild" in (* Signal Intermediate *) - do~ M.declare_signal "aux" [[ [ 4 ] ]] in + do~ M.declare_signal "aux" in (* Component *) do~ M.declare_component "oldProofHash" in - do~ M.substitute_var "oldProofHash" [[ M.call_function ~(| "SMTHash2", ([] : list F.t) |) ]] in + do~ M.substitute_var "oldProofHash" [] [[ M.call_function ~(| "SMTHash2", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "newProofHash" in - do~ M.substitute_var "newProofHash" [[ M.call_function ~(| "SMTHash2", ([] : list F.t) |) ]] in + do~ M.substitute_var "newProofHash" [] [[ M.call_function ~(| "SMTHash2", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "oldSwitcher" in - do~ M.substitute_var "oldSwitcher" [[ M.call_function ~(| "Switcher", ([] : list F.t) |) ]] in + do~ M.substitute_var "oldSwitcher" [] [[ M.call_function ~(| "Switcher", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "newSwitcher" in - do~ M.substitute_var "newSwitcher" [[ M.call_function ~(| "Switcher", ([] : list F.t) |) ]] in - do~ M.substitute_var "oldSwitcher" [[ M.var (| "oldChild" |) ]] in - do~ M.substitute_var "oldSwitcher" [[ M.var (| "sibling" |) ]] in - do~ M.substitute_var "oldSwitcher" [[ M.var (| "newlrbit" |) ]] in - do~ M.substitute_var "oldProofHash" [[ M.var_access (| "oldSwitcher", [Access.Component "outL"] |) ]] in - do~ M.substitute_var "oldProofHash" [[ M.var_access (| "oldSwitcher", [Access.Component "outR"] |) ]] in - do~ M.substitute_var "aux" [[ InfixOp.mul ~(| M.var (| "old1leaf" |), InfixOp.add ~(| InfixOp.add ~(| M.var (| "st_bot" |), M.var (| "st_new1" |) |), M.var (| "st_upd" |) |) |) ]] in - do~ M.substitute_var "oldRoot" [[ InfixOp.add ~(| M.var_access (| "aux", [Access.Array (0)] |), InfixOp.mul ~(| M.var_access (| "oldProofHash", [Access.Component "out"] |), M.var (| "st_top" |) |) |) ]] in - do~ M.substitute_var "aux" [[ InfixOp.mul ~(| M.var (| "newChild" |), InfixOp.add ~(| M.var (| "st_top" |), M.var (| "st_bot" |) |) |) ]] in - do~ M.substitute_var "newSwitcher" [[ InfixOp.add ~(| M.var_access (| "aux", [Access.Array (1)] |), InfixOp.mul ~(| M.var (| "new1leaf" |), M.var (| "st_new1" |) |) |) ]] in - do~ M.substitute_var "aux" [[ InfixOp.mul ~(| M.var (| "sibling" |), M.var (| "st_top" |) |) ]] in - do~ M.substitute_var "newSwitcher" [[ InfixOp.add ~(| M.var_access (| "aux", [Access.Array (2)] |), InfixOp.mul ~(| M.var (| "old1leaf" |), M.var (| "st_new1" |) |) |) ]] in - do~ M.substitute_var "newSwitcher" [[ M.var (| "newlrbit" |) ]] in - do~ M.substitute_var "newProofHash" [[ M.var_access (| "newSwitcher", [Access.Component "outL"] |) ]] in - do~ M.substitute_var "newProofHash" [[ M.var_access (| "newSwitcher", [Access.Component "outR"] |) ]] in - do~ M.substitute_var "aux" [[ InfixOp.mul ~(| M.var_access (| "newProofHash", [Access.Component "out"] |), InfixOp.add ~(| InfixOp.add ~(| M.var (| "st_top" |), M.var (| "st_bot" |) |), M.var (| "st_new1" |) |) |) ]] in - do~ M.substitute_var "newRoot" [[ InfixOp.add ~(| M.var_access (| "aux", [Access.Array (3)] |), InfixOp.mul ~(| M.var (| "new1leaf" |), InfixOp.add ~(| M.var (| "st_old0" |), M.var (| "st_upd" |) |) |) |) ]] in + do~ M.substitute_var "newSwitcher" [] [[ M.call_function ~(| "Switcher", ([] : list F.t) |) ]] in + do~ M.substitute_var "oldSwitcher" [Access.Component "L"] [[ M.var (| "oldChild" |) ]] in + do~ M.substitute_var "oldSwitcher" [Access.Component "R"] [[ M.var (| "sibling" |) ]] in + do~ M.substitute_var "oldSwitcher" [Access.Component "sel"] [[ M.var (| "newlrbit" |) ]] in + do~ M.substitute_var "oldProofHash" [Access.Component "L"] [[ M.var_access (| "oldSwitcher", [Access.Component "outL"] |) ]] in + do~ M.substitute_var "oldProofHash" [Access.Component "R"] [[ M.var_access (| "oldSwitcher", [Access.Component "outR"] |) ]] in + do~ M.substitute_var "aux" [Access.Array (0)] [[ InfixOp.mul ~(| M.var (| "old1leaf" |), InfixOp.add ~(| InfixOp.add ~(| M.var (| "st_bot" |), M.var (| "st_new1" |) |), M.var (| "st_upd" |) |) |) ]] in + do~ M.substitute_var "oldRoot" [] [[ InfixOp.add ~(| M.var_access (| "aux", [Access.Array (0)] |), InfixOp.mul ~(| M.var_access (| "oldProofHash", [Access.Component "out"] |), M.var (| "st_top" |) |) |) ]] in + do~ M.substitute_var "aux" [Access.Array (1)] [[ InfixOp.mul ~(| M.var (| "newChild" |), InfixOp.add ~(| M.var (| "st_top" |), M.var (| "st_bot" |) |) |) ]] in + do~ M.substitute_var "newSwitcher" [Access.Component "L"] [[ InfixOp.add ~(| M.var_access (| "aux", [Access.Array (1)] |), InfixOp.mul ~(| M.var (| "new1leaf" |), M.var (| "st_new1" |) |) |) ]] in + do~ M.substitute_var "aux" [Access.Array (2)] [[ InfixOp.mul ~(| M.var (| "sibling" |), M.var (| "st_top" |) |) ]] in + do~ M.substitute_var "newSwitcher" [Access.Component "R"] [[ InfixOp.add ~(| M.var_access (| "aux", [Access.Array (2)] |), InfixOp.mul ~(| M.var (| "old1leaf" |), M.var (| "st_new1" |) |) |) ]] in + do~ M.substitute_var "newSwitcher" [Access.Component "sel"] [[ M.var (| "newlrbit" |) ]] in + do~ M.substitute_var "newProofHash" [Access.Component "L"] [[ M.var_access (| "newSwitcher", [Access.Component "outL"] |) ]] in + do~ M.substitute_var "newProofHash" [Access.Component "R"] [[ M.var_access (| "newSwitcher", [Access.Component "outR"] |) ]] in + do~ M.substitute_var "aux" [Access.Array (3)] [[ InfixOp.mul ~(| M.var_access (| "newProofHash", [Access.Component "out"] |), InfixOp.add ~(| InfixOp.add ~(| M.var (| "st_top" |), M.var (| "st_bot" |) |), M.var (| "st_new1" |) |) |) ]] in + do~ M.substitute_var "newRoot" [] [[ InfixOp.add ~(| M.var_access (| "aux", [Access.Array (3)] |), InfixOp.mul ~(| M.var (| "new1leaf" |), InfixOp.add ~(| M.var (| "st_old0" |), M.var (| "st_upd" |) |) |) |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/smt/smtprocessorsm.v b/Garden/Circom/Circomlib/translation/circuits/smt/smtprocessorsm.v index 599b1f3..b071bf1 100644 --- a/Garden/Circom/Circomlib/translation/circuits/smt/smtprocessorsm.v +++ b/Garden/Circom/Circomlib/translation/circuits/smt/smtprocessorsm.v @@ -41,55 +41,77 @@ Module SMTProcessorSMSignals. (* Intermediate *) aux2 : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | xor : P _ xor "xor" + | is0 : P _ is0 "is0" + | levIns : P _ levIns "levIns" + | fnc : P _ fnc "fnc" + | prev_top : P _ prev_top "prev_top" + | prev_old0 : P _ prev_old0 "prev_old0" + | prev_bot : P _ prev_bot "prev_bot" + | prev_new1 : P _ prev_new1 "prev_new1" + | prev_na : P _ prev_na "prev_na" + | prev_upd : P _ prev_upd "prev_upd" + | st_top : P _ st_top "st_top" + | st_old0 : P _ st_old0 "st_old0" + | st_bot : P _ st_bot "st_bot" + | st_new1 : P _ st_new1 "st_new1" + | st_na : P _ st_na "st_na" + | st_upd : P _ st_upd "st_upd" + | aux1 : P _ aux1 "aux1" + | aux2 : P _ aux2 "aux2". + End IsNamed. End SMTProcessorSMSignals. (* Template body *) Definition SMTProcessorSM : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "xor" [[ ([] : list F.t) ]] in + do~ M.declare_signal "xor" in (* Signal Input *) - do~ M.declare_signal "is0" [[ ([] : list F.t) ]] in + do~ M.declare_signal "is0" in (* Signal Input *) - do~ M.declare_signal "levIns" [[ ([] : list F.t) ]] in + do~ M.declare_signal "levIns" in (* Signal Input *) - do~ M.declare_signal "fnc" [[ [ 2 ] ]] in + do~ M.declare_signal "fnc" in (* Signal Input *) - do~ M.declare_signal "prev_top" [[ ([] : list F.t) ]] in + do~ M.declare_signal "prev_top" in (* Signal Input *) - do~ M.declare_signal "prev_old0" [[ ([] : list F.t) ]] in + do~ M.declare_signal "prev_old0" in (* Signal Input *) - do~ M.declare_signal "prev_bot" [[ ([] : list F.t) ]] in + do~ M.declare_signal "prev_bot" in (* Signal Input *) - do~ M.declare_signal "prev_new1" [[ ([] : list F.t) ]] in + do~ M.declare_signal "prev_new1" in (* Signal Input *) - do~ M.declare_signal "prev_na" [[ ([] : list F.t) ]] in + do~ M.declare_signal "prev_na" in (* Signal Input *) - do~ M.declare_signal "prev_upd" [[ ([] : list F.t) ]] in + do~ M.declare_signal "prev_upd" in (* Signal Output *) - do~ M.declare_signal "st_top" [[ ([] : list F.t) ]] in + do~ M.declare_signal "st_top" in (* Signal Output *) - do~ M.declare_signal "st_old0" [[ ([] : list F.t) ]] in + do~ M.declare_signal "st_old0" in (* Signal Output *) - do~ M.declare_signal "st_bot" [[ ([] : list F.t) ]] in + do~ M.declare_signal "st_bot" in (* Signal Output *) - do~ M.declare_signal "st_new1" [[ ([] : list F.t) ]] in + do~ M.declare_signal "st_new1" in (* Signal Output *) - do~ M.declare_signal "st_na" [[ ([] : list F.t) ]] in + do~ M.declare_signal "st_na" in (* Signal Output *) - do~ M.declare_signal "st_upd" [[ ([] : list F.t) ]] in + do~ M.declare_signal "st_upd" in (* Signal Intermediate *) - do~ M.declare_signal "aux1" [[ ([] : list F.t) ]] in + do~ M.declare_signal "aux1" in (* Signal Intermediate *) - do~ M.declare_signal "aux2" [[ ([] : list F.t) ]] in - do~ M.substitute_var "aux1" [[ InfixOp.mul ~(| M.var (| "prev_top" |), M.var (| "levIns" |) |) ]] in - do~ M.substitute_var "aux2" [[ InfixOp.mul ~(| M.var (| "aux1" |), M.var_access (| "fnc", [Access.Array (0)] |) |) ]] in - do~ M.substitute_var "st_top" [[ InfixOp.sub ~(| M.var (| "prev_top" |), M.var (| "aux1" |) |) ]] in - do~ M.substitute_var "st_old0" [[ InfixOp.mul ~(| M.var (| "aux2" |), M.var (| "is0" |) |) ]] in - do~ M.substitute_var "st_new1" [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| M.var (| "aux2" |), M.var (| "st_old0" |) |), M.var (| "prev_bot" |) |), M.var (| "xor" |) |) ]] in - do~ M.substitute_var "st_bot" [[ InfixOp.mul ~(| InfixOp.sub ~(| 1, M.var (| "xor" |) |), InfixOp.add ~(| InfixOp.sub ~(| M.var (| "aux2" |), M.var (| "st_old0" |) |), M.var (| "prev_bot" |) |) |) ]] in - do~ M.substitute_var "st_upd" [[ InfixOp.sub ~(| M.var (| "aux1" |), M.var (| "aux2" |) |) ]] in - do~ M.substitute_var "st_na" [[ InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| M.var (| "prev_new1" |), M.var (| "prev_old0" |) |), M.var (| "prev_na" |) |), M.var (| "prev_upd" |) |) ]] in + do~ M.declare_signal "aux2" in + do~ M.substitute_var "aux1" [] [[ InfixOp.mul ~(| M.var (| "prev_top" |), M.var (| "levIns" |) |) ]] in + do~ M.substitute_var "aux2" [] [[ InfixOp.mul ~(| M.var (| "aux1" |), M.var_access (| "fnc", [Access.Array (0)] |) |) ]] in + do~ M.substitute_var "st_top" [] [[ InfixOp.sub ~(| M.var (| "prev_top" |), M.var (| "aux1" |) |) ]] in + do~ M.substitute_var "st_old0" [] [[ InfixOp.mul ~(| M.var (| "aux2" |), M.var (| "is0" |) |) ]] in + do~ M.substitute_var "st_new1" [] [[ InfixOp.mul ~(| InfixOp.add ~(| InfixOp.sub ~(| M.var (| "aux2" |), M.var (| "st_old0" |) |), M.var (| "prev_bot" |) |), M.var (| "xor" |) |) ]] in + do~ M.substitute_var "st_bot" [] [[ InfixOp.mul ~(| InfixOp.sub ~(| 1, M.var (| "xor" |) |), InfixOp.add ~(| InfixOp.sub ~(| M.var (| "aux2" |), M.var (| "st_old0" |) |), M.var (| "prev_bot" |) |) |) ]] in + do~ M.substitute_var "st_upd" [] [[ InfixOp.sub ~(| M.var (| "aux1" |), M.var (| "aux2" |) |) ]] in + do~ M.substitute_var "st_na" [] [[ InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| M.var (| "prev_new1" |), M.var (| "prev_old0" |) |), M.var (| "prev_na" |) |), M.var (| "prev_upd" |) |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/smt/smtverifier.v b/Garden/Circom/Circomlib/translation/circuits/smt/smtverifier.v index 6ea9654..06351f5 100644 --- a/Garden/Circom/Circomlib/translation/circuits/smt/smtverifier.v +++ b/Garden/Circom/Circomlib/translation/circuits/smt/smtverifier.v @@ -23,84 +23,97 @@ Module SMTVerifierSignals. (* Input *) fnc : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | enabled : P _ enabled "enabled" + | root : P _ root "root" + | siblings : P _ siblings "siblings" + | oldKey : P _ oldKey "oldKey" + | oldValue : P _ oldValue "oldValue" + | isOld0 : P _ isOld0 "isOld0" + | key : P _ key "key" + | value : P _ value "value" + | fnc : P _ fnc "fnc". + End IsNamed. End SMTVerifierSignals. (* Template body *) Definition SMTVerifier (nLevels : F.t) : M.t (BlockUnit.t Empty_set) := M.template_body [("nLevels", nLevels)] ( (* Signal Input *) - do~ M.declare_signal "enabled" [[ ([] : list F.t) ]] in + do~ M.declare_signal "enabled" in (* Signal Input *) - do~ M.declare_signal "root" [[ ([] : list F.t) ]] in + do~ M.declare_signal "root" in (* Signal Input *) - do~ M.declare_signal "siblings" [[ [ M.var (| "nLevels" |) ] ]] in + do~ M.declare_signal "siblings" in (* Signal Input *) - do~ M.declare_signal "oldKey" [[ ([] : list F.t) ]] in + do~ M.declare_signal "oldKey" in (* Signal Input *) - do~ M.declare_signal "oldValue" [[ ([] : list F.t) ]] in + do~ M.declare_signal "oldValue" in (* Signal Input *) - do~ M.declare_signal "isOld0" [[ ([] : list F.t) ]] in + do~ M.declare_signal "isOld0" in (* Signal Input *) - do~ M.declare_signal "key" [[ ([] : list F.t) ]] in + do~ M.declare_signal "key" in (* Signal Input *) - do~ M.declare_signal "value" [[ ([] : list F.t) ]] in + do~ M.declare_signal "value" in (* Signal Input *) - do~ M.declare_signal "fnc" [[ ([] : list F.t) ]] in + do~ M.declare_signal "fnc" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Component *) do~ M.declare_component "hash1Old" in - do~ M.substitute_var "hash1Old" [[ M.call_function ~(| "SMTHash1", ([] : list F.t) |) ]] in - do~ M.substitute_var "hash1Old" [[ M.var (| "oldKey" |) ]] in - do~ M.substitute_var "hash1Old" [[ M.var (| "oldValue" |) ]] in + do~ M.substitute_var "hash1Old" [] [[ M.call_function ~(| "SMTHash1", ([] : list F.t) |) ]] in + do~ M.substitute_var "hash1Old" [Access.Component "key"] [[ M.var (| "oldKey" |) ]] in + do~ M.substitute_var "hash1Old" [Access.Component "value"] [[ M.var (| "oldValue" |) ]] in (* Component *) do~ M.declare_component "hash1New" in - do~ M.substitute_var "hash1New" [[ M.call_function ~(| "SMTHash1", ([] : list F.t) |) ]] in - do~ M.substitute_var "hash1New" [[ M.var (| "key" |) ]] in - do~ M.substitute_var "hash1New" [[ M.var (| "value" |) ]] in + do~ M.substitute_var "hash1New" [] [[ M.call_function ~(| "SMTHash1", ([] : list F.t) |) ]] in + do~ M.substitute_var "hash1New" [Access.Component "key"] [[ M.var (| "key" |) ]] in + do~ M.substitute_var "hash1New" [Access.Component "value"] [[ M.var (| "value" |) ]] in (* Component *) do~ M.declare_component "n2bOld" in - do~ M.substitute_var "n2bOld" [[ M.call_function ~(| "Num2Bits_strict", ([] : list F.t) |) ]] in + do~ M.substitute_var "n2bOld" [] [[ M.call_function ~(| "Num2Bits_strict", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "n2bNew" in - do~ M.substitute_var "n2bNew" [[ M.call_function ~(| "Num2Bits_strict", ([] : list F.t) |) ]] in - do~ M.substitute_var "n2bOld" [[ M.var (| "oldKey" |) ]] in - do~ M.substitute_var "n2bNew" [[ M.var (| "key" |) ]] in + do~ M.substitute_var "n2bNew" [] [[ M.call_function ~(| "Num2Bits_strict", ([] : list F.t) |) ]] in + do~ M.substitute_var "n2bOld" [Access.Component "in"] [[ M.var (| "oldKey" |) ]] in + do~ M.substitute_var "n2bNew" [Access.Component "in"] [[ M.var (| "key" |) ]] in (* Component *) do~ M.declare_component "smtLevIns" in - do~ M.substitute_var "smtLevIns" [[ M.call_function ~(| "SMTLevIns", [ M.var (| "nLevels" |) ] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "smtLevIns" [] [[ M.call_function ~(| "SMTLevIns", [ M.var (| "nLevels" |) ] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "nLevels" |) |) ]] ( - do~ M.substitute_var "smtLevIns" [[ M.var_access (| "siblings", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "smtLevIns" [Access.Component "siblings"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "siblings", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "smtLevIns" [[ M.var (| "enabled" |) ]] in + do~ M.substitute_var "smtLevIns" [Access.Component "enabled"] [[ M.var (| "enabled" |) ]] in (* Component *) do~ M.declare_component "sm" in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), M.var (| "nLevels" |) |) ]] ( - do~ M.substitute_var "sm" [[ M.call_function ~(| "SMTVerifierSM", ([] : list F.t) |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "SMTVerifierSM", ([] : list F.t) |) ]] in do~ M.if_ [[ InfixOp.eq ~(| M.var (| "i" |), 0 |) ]] (* then *) ( - do~ M.substitute_var "sm" [[ M.var (| "enabled" |) ]] in - do~ M.substitute_var "sm" [[ 0 ]] in - do~ M.substitute_var "sm" [[ 0 ]] in - do~ M.substitute_var "sm" [[ 0 ]] in - do~ M.substitute_var "sm" [[ InfixOp.sub ~(| 1, M.var (| "enabled" |) |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "prev_top"] [[ M.var (| "enabled" |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "prev_i0"] [[ 0 ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "prev_inew"] [[ 0 ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "prev_iold"] [[ 0 ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "prev_na"] [[ InfixOp.sub ~(| 1, M.var (| "enabled" |) |) ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "sm" [[ M.var_access (| "sm", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "st_top"] |) ]] in - do~ M.substitute_var "sm" [[ M.var_access (| "sm", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "st_i0"] |) ]] in - do~ M.substitute_var "sm" [[ M.var_access (| "sm", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "st_inew"] |) ]] in - do~ M.substitute_var "sm" [[ M.var_access (| "sm", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "st_iold"] |) ]] in - do~ M.substitute_var "sm" [[ M.var_access (| "sm", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "st_na"] |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "prev_top"] [[ M.var_access (| "sm", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "st_top"] |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "prev_i0"] [[ M.var_access (| "sm", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "st_i0"] |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "prev_inew"] [[ M.var_access (| "sm", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "st_inew"] |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "prev_iold"] [[ M.var_access (| "sm", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "st_iold"] |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "prev_na"] [[ M.var_access (| "sm", [Access.Array (InfixOp.sub ~(| M.var (| "i" |), 1 |)); Access.Component "st_na"] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "sm" [[ M.var (| "isOld0" |) ]] in - do~ M.substitute_var "sm" [[ M.var (| "fnc" |) ]] in - do~ M.substitute_var "sm" [[ M.var_access (| "smtLevIns", [Access.Component "levIns"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "is0"] [[ M.var (| "isOld0" |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "fnc"] [[ M.var (| "fnc" |) ]] in + do~ M.substitute_var "sm" [Access.Array (M.var (| "i" |)); Access.Component "levIns"] [[ M.var_access (| "smtLevIns", [Access.Component "levIns"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.equality_constraint @@ -109,50 +122,50 @@ Definition SMTVerifier (nLevels : F.t) : M.t (BlockUnit.t Empty_set) := in (* Component *) do~ M.declare_component "levels" in - do~ M.substitute_var "i" [[ InfixOp.sub ~(| M.var (| "nLevels" |), 1 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.sub ~(| M.var (| "nLevels" |), 1 |) ]] in do~ M.while [[ InfixOp.notEq ~(| M.var (| "i" |), PrefixOp.sub ~(| 1 |) |) ]] ( - do~ M.substitute_var "levels" [[ M.call_function ~(| "SMTVerifierLevel", ([] : list F.t) |) ]] in - do~ M.substitute_var "levels" [[ M.var_access (| "sm", [Access.Array (M.var (| "i" |)); Access.Component "st_top"] |) ]] in - do~ M.substitute_var "levels" [[ M.var_access (| "sm", [Access.Array (M.var (| "i" |)); Access.Component "st_i0"] |) ]] in - do~ M.substitute_var "levels" [[ M.var_access (| "sm", [Access.Array (M.var (| "i" |)); Access.Component "st_inew"] |) ]] in - do~ M.substitute_var "levels" [[ M.var_access (| "sm", [Access.Array (M.var (| "i" |)); Access.Component "st_iold"] |) ]] in - do~ M.substitute_var "levels" [[ M.var_access (| "sm", [Access.Array (M.var (| "i" |)); Access.Component "st_na"] |) ]] in - do~ M.substitute_var "levels" [[ M.var_access (| "siblings", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "levels" [[ M.var_access (| "hash1Old", [Access.Component "out"] |) ]] in - do~ M.substitute_var "levels" [[ M.var_access (| "hash1New", [Access.Component "out"] |) ]] in - do~ M.substitute_var "levels" [[ M.var_access (| "n2bNew", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |))] [[ M.call_function ~(| "SMTVerifierLevel", ([] : list F.t) |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "st_top"] [[ M.var_access (| "sm", [Access.Array (M.var (| "i" |)); Access.Component "st_top"] |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "st_i0"] [[ M.var_access (| "sm", [Access.Array (M.var (| "i" |)); Access.Component "st_i0"] |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "st_inew"] [[ M.var_access (| "sm", [Access.Array (M.var (| "i" |)); Access.Component "st_inew"] |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "st_iold"] [[ M.var_access (| "sm", [Access.Array (M.var (| "i" |)); Access.Component "st_iold"] |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "st_na"] [[ M.var_access (| "sm", [Access.Array (M.var (| "i" |)); Access.Component "st_na"] |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "sibling"] [[ M.var_access (| "siblings", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "old1leaf"] [[ M.var_access (| "hash1Old", [Access.Component "out"] |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "new1leaf"] [[ M.var_access (| "hash1New", [Access.Component "out"] |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "lrbit"] [[ M.var_access (| "n2bNew", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in do~ M.if_ [[ InfixOp.eq ~(| M.var (| "i" |), InfixOp.sub ~(| M.var (| "nLevels" |), 1 |) |) ]] (* then *) ( - do~ M.substitute_var "levels" [[ 0 ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "child"] [[ 0 ]] in M.pure BlockUnit.Tt ) (* else *) ( - do~ M.substitute_var "levels" [[ M.var_access (| "levels", [Access.Array (InfixOp.add ~(| M.var (| "i" |), 1 |)); Access.Component "root"] |) ]] in + do~ M.substitute_var "levels" [Access.Array (M.var (| "i" |)); Access.Component "child"] [[ M.var_access (| "levels", [Access.Array (InfixOp.add ~(| M.var (| "i" |), 1 |)); Access.Component "root"] |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ InfixOp.sub ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.sub ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in (* Component *) do~ M.declare_component "areKeyEquals" in - do~ M.substitute_var "areKeyEquals" [[ M.call_function ~(| "IsEqual", ([] : list F.t) |) ]] in - do~ M.substitute_var "areKeyEquals" [[ M.var (| "oldKey" |) ]] in - do~ M.substitute_var "areKeyEquals" [[ M.var (| "key" |) ]] in + do~ M.substitute_var "areKeyEquals" [] [[ M.call_function ~(| "IsEqual", ([] : list F.t) |) ]] in + do~ M.substitute_var "areKeyEquals" [Access.Component "in"; Access.Array (0)] [[ M.var (| "oldKey" |) ]] in + do~ M.substitute_var "areKeyEquals" [Access.Component "in"; Access.Array (1)] [[ M.var (| "key" |) ]] in (* Component *) do~ M.declare_component "keysOk" in - do~ M.substitute_var "keysOk" [[ M.call_function ~(| "MultiAND", [ 4 ] |) ]] in - do~ M.substitute_var "keysOk" [[ M.var (| "fnc" |) ]] in - do~ M.substitute_var "keysOk" [[ InfixOp.sub ~(| 1, M.var (| "isOld0" |) |) ]] in - do~ M.substitute_var "keysOk" [[ M.var_access (| "areKeyEquals", [Access.Component "out"] |) ]] in - do~ M.substitute_var "keysOk" [[ M.var (| "enabled" |) ]] in + do~ M.substitute_var "keysOk" [] [[ M.call_function ~(| "MultiAND", [ 4 ] |) ]] in + do~ M.substitute_var "keysOk" [Access.Component "in"; Access.Array (0)] [[ M.var (| "fnc" |) ]] in + do~ M.substitute_var "keysOk" [Access.Component "in"; Access.Array (1)] [[ InfixOp.sub ~(| 1, M.var (| "isOld0" |) |) ]] in + do~ M.substitute_var "keysOk" [Access.Component "in"; Access.Array (2)] [[ M.var_access (| "areKeyEquals", [Access.Component "out"] |) ]] in + do~ M.substitute_var "keysOk" [Access.Component "in"; Access.Array (3)] [[ M.var (| "enabled" |) ]] in do~ M.equality_constraint [[ M.var_access (| "keysOk", [Access.Component "out"] |) ]] [[ 0 ]] in (* Component *) do~ M.declare_component "checkRoot" in - do~ M.substitute_var "checkRoot" [[ M.call_function ~(| "ForceEqualIfEnabled", ([] : list F.t) |) ]] in - do~ M.substitute_var "checkRoot" [[ M.var (| "enabled" |) ]] in - do~ M.substitute_var "checkRoot" [[ M.var_access (| "levels", [Access.Array (0); Access.Component "root"] |) ]] in - do~ M.substitute_var "checkRoot" [[ M.var (| "root" |) ]] in + do~ M.substitute_var "checkRoot" [] [[ M.call_function ~(| "ForceEqualIfEnabled", ([] : list F.t) |) ]] in + do~ M.substitute_var "checkRoot" [Access.Component "enabled"] [[ M.var (| "enabled" |) ]] in + do~ M.substitute_var "checkRoot" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "levels", [Access.Array (0); Access.Component "root"] |) ]] in + do~ M.substitute_var "checkRoot" [Access.Component "in"; Access.Array (1)] [[ M.var (| "root" |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/smt/smtverifierlevel.v b/Garden/Circom/Circomlib/translation/circuits/smt/smtverifierlevel.v index d928d93..8cab6be 100644 --- a/Garden/Circom/Circomlib/translation/circuits/smt/smtverifierlevel.v +++ b/Garden/Circom/Circomlib/translation/circuits/smt/smtverifierlevel.v @@ -29,49 +29,65 @@ Module SMTVerifierLevelSignals. (* Intermediate *) aux : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | st_top : P _ st_top "st_top" + | st_i0 : P _ st_i0 "st_i0" + | st_iold : P _ st_iold "st_iold" + | st_inew : P _ st_inew "st_inew" + | st_na : P _ st_na "st_na" + | root : P _ root "root" + | sibling : P _ sibling "sibling" + | old1leaf : P _ old1leaf "old1leaf" + | new1leaf : P _ new1leaf "new1leaf" + | lrbit : P _ lrbit "lrbit" + | child : P _ child "child" + | aux : P _ aux "aux". + End IsNamed. End SMTVerifierLevelSignals. (* Template body *) Definition SMTVerifierLevel : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "st_top" [[ ([] : list F.t) ]] in + do~ M.declare_signal "st_top" in (* Signal Input *) - do~ M.declare_signal "st_i0" [[ ([] : list F.t) ]] in + do~ M.declare_signal "st_i0" in (* Signal Input *) - do~ M.declare_signal "st_iold" [[ ([] : list F.t) ]] in + do~ M.declare_signal "st_iold" in (* Signal Input *) - do~ M.declare_signal "st_inew" [[ ([] : list F.t) ]] in + do~ M.declare_signal "st_inew" in (* Signal Input *) - do~ M.declare_signal "st_na" [[ ([] : list F.t) ]] in + do~ M.declare_signal "st_na" in (* Signal Output *) - do~ M.declare_signal "root" [[ ([] : list F.t) ]] in + do~ M.declare_signal "root" in (* Signal Input *) - do~ M.declare_signal "sibling" [[ ([] : list F.t) ]] in + do~ M.declare_signal "sibling" in (* Signal Input *) - do~ M.declare_signal "old1leaf" [[ ([] : list F.t) ]] in + do~ M.declare_signal "old1leaf" in (* Signal Input *) - do~ M.declare_signal "new1leaf" [[ ([] : list F.t) ]] in + do~ M.declare_signal "new1leaf" in (* Signal Input *) - do~ M.declare_signal "lrbit" [[ ([] : list F.t) ]] in + do~ M.declare_signal "lrbit" in (* Signal Input *) - do~ M.declare_signal "child" [[ ([] : list F.t) ]] in + do~ M.declare_signal "child" in (* Signal Intermediate *) - do~ M.declare_signal "aux" [[ [ 2 ] ]] in + do~ M.declare_signal "aux" in (* Component *) do~ M.declare_component "proofHash" in - do~ M.substitute_var "proofHash" [[ M.call_function ~(| "SMTHash2", ([] : list F.t) |) ]] in + do~ M.substitute_var "proofHash" [] [[ M.call_function ~(| "SMTHash2", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "switcher" in - do~ M.substitute_var "switcher" [[ M.call_function ~(| "Switcher", ([] : list F.t) |) ]] in - do~ M.substitute_var "switcher" [[ M.var (| "child" |) ]] in - do~ M.substitute_var "switcher" [[ M.var (| "sibling" |) ]] in - do~ M.substitute_var "switcher" [[ M.var (| "lrbit" |) ]] in - do~ M.substitute_var "proofHash" [[ M.var_access (| "switcher", [Access.Component "outL"] |) ]] in - do~ M.substitute_var "proofHash" [[ M.var_access (| "switcher", [Access.Component "outR"] |) ]] in - do~ M.substitute_var "aux" [[ InfixOp.mul ~(| M.var_access (| "proofHash", [Access.Component "out"] |), M.var (| "st_top" |) |) ]] in - do~ M.substitute_var "aux" [[ InfixOp.mul ~(| M.var (| "old1leaf" |), M.var (| "st_iold" |) |) ]] in - do~ M.substitute_var "root" [[ InfixOp.add ~(| InfixOp.add ~(| M.var_access (| "aux", [Access.Array (0)] |), M.var_access (| "aux", [Access.Array (1)] |) |), InfixOp.mul ~(| M.var (| "new1leaf" |), M.var (| "st_inew" |) |) |) ]] in + do~ M.substitute_var "switcher" [] [[ M.call_function ~(| "Switcher", ([] : list F.t) |) ]] in + do~ M.substitute_var "switcher" [Access.Component "L"] [[ M.var (| "child" |) ]] in + do~ M.substitute_var "switcher" [Access.Component "R"] [[ M.var (| "sibling" |) ]] in + do~ M.substitute_var "switcher" [Access.Component "sel"] [[ M.var (| "lrbit" |) ]] in + do~ M.substitute_var "proofHash" [Access.Component "L"] [[ M.var_access (| "switcher", [Access.Component "outL"] |) ]] in + do~ M.substitute_var "proofHash" [Access.Component "R"] [[ M.var_access (| "switcher", [Access.Component "outR"] |) ]] in + do~ M.substitute_var "aux" [Access.Array (0)] [[ InfixOp.mul ~(| M.var_access (| "proofHash", [Access.Component "out"] |), M.var (| "st_top" |) |) ]] in + do~ M.substitute_var "aux" [Access.Array (1)] [[ InfixOp.mul ~(| M.var (| "old1leaf" |), M.var (| "st_iold" |) |) ]] in + do~ M.substitute_var "root" [] [[ InfixOp.add ~(| InfixOp.add ~(| M.var_access (| "aux", [Access.Array (0)] |), M.var_access (| "aux", [Access.Array (1)] |) |), InfixOp.mul ~(| M.var (| "new1leaf" |), M.var (| "st_inew" |) |) |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/smt/smtverifiersm.v b/Garden/Circom/Circomlib/translation/circuits/smt/smtverifiersm.v index aa3519d..ae981b9 100644 --- a/Garden/Circom/Circomlib/translation/circuits/smt/smtverifiersm.v +++ b/Garden/Circom/Circomlib/translation/circuits/smt/smtverifiersm.v @@ -35,48 +35,67 @@ Module SMTVerifierSMSignals. (* Intermediate *) prev_top_lev_ins_fnc : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | is0 : P _ is0 "is0" + | levIns : P _ levIns "levIns" + | fnc : P _ fnc "fnc" + | prev_top : P _ prev_top "prev_top" + | prev_i0 : P _ prev_i0 "prev_i0" + | prev_iold : P _ prev_iold "prev_iold" + | prev_inew : P _ prev_inew "prev_inew" + | prev_na : P _ prev_na "prev_na" + | st_top : P _ st_top "st_top" + | st_i0 : P _ st_i0 "st_i0" + | st_iold : P _ st_iold "st_iold" + | st_inew : P _ st_inew "st_inew" + | st_na : P _ st_na "st_na" + | prev_top_lev_ins : P _ prev_top_lev_ins "prev_top_lev_ins" + | prev_top_lev_ins_fnc : P _ prev_top_lev_ins_fnc "prev_top_lev_ins_fnc". + End IsNamed. End SMTVerifierSMSignals. (* Template body *) Definition SMTVerifierSM : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "is0" [[ ([] : list F.t) ]] in + do~ M.declare_signal "is0" in (* Signal Input *) - do~ M.declare_signal "levIns" [[ ([] : list F.t) ]] in + do~ M.declare_signal "levIns" in (* Signal Input *) - do~ M.declare_signal "fnc" [[ ([] : list F.t) ]] in + do~ M.declare_signal "fnc" in (* Signal Input *) - do~ M.declare_signal "prev_top" [[ ([] : list F.t) ]] in + do~ M.declare_signal "prev_top" in (* Signal Input *) - do~ M.declare_signal "prev_i0" [[ ([] : list F.t) ]] in + do~ M.declare_signal "prev_i0" in (* Signal Input *) - do~ M.declare_signal "prev_iold" [[ ([] : list F.t) ]] in + do~ M.declare_signal "prev_iold" in (* Signal Input *) - do~ M.declare_signal "prev_inew" [[ ([] : list F.t) ]] in + do~ M.declare_signal "prev_inew" in (* Signal Input *) - do~ M.declare_signal "prev_na" [[ ([] : list F.t) ]] in + do~ M.declare_signal "prev_na" in (* Signal Output *) - do~ M.declare_signal "st_top" [[ ([] : list F.t) ]] in + do~ M.declare_signal "st_top" in (* Signal Output *) - do~ M.declare_signal "st_i0" [[ ([] : list F.t) ]] in + do~ M.declare_signal "st_i0" in (* Signal Output *) - do~ M.declare_signal "st_iold" [[ ([] : list F.t) ]] in + do~ M.declare_signal "st_iold" in (* Signal Output *) - do~ M.declare_signal "st_inew" [[ ([] : list F.t) ]] in + do~ M.declare_signal "st_inew" in (* Signal Output *) - do~ M.declare_signal "st_na" [[ ([] : list F.t) ]] in + do~ M.declare_signal "st_na" in (* Signal Intermediate *) - do~ M.declare_signal "prev_top_lev_ins" [[ ([] : list F.t) ]] in + do~ M.declare_signal "prev_top_lev_ins" in (* Signal Intermediate *) - do~ M.declare_signal "prev_top_lev_ins_fnc" [[ ([] : list F.t) ]] in - do~ M.substitute_var "prev_top_lev_ins" [[ InfixOp.mul ~(| M.var (| "prev_top" |), M.var (| "levIns" |) |) ]] in - do~ M.substitute_var "prev_top_lev_ins_fnc" [[ InfixOp.mul ~(| M.var (| "prev_top_lev_ins" |), M.var (| "fnc" |) |) ]] in - do~ M.substitute_var "st_top" [[ InfixOp.sub ~(| M.var (| "prev_top" |), M.var (| "prev_top_lev_ins" |) |) ]] in - do~ M.substitute_var "st_inew" [[ InfixOp.sub ~(| M.var (| "prev_top_lev_ins" |), M.var (| "prev_top_lev_ins_fnc" |) |) ]] in - do~ M.substitute_var "st_iold" [[ InfixOp.mul ~(| M.var (| "prev_top_lev_ins_fnc" |), InfixOp.sub ~(| 1, M.var (| "is0" |) |) |) ]] in - do~ M.substitute_var "st_i0" [[ InfixOp.mul ~(| M.var (| "prev_top_lev_ins" |), M.var (| "is0" |) |) ]] in - do~ M.substitute_var "st_na" [[ InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| M.var (| "prev_na" |), M.var (| "prev_inew" |) |), M.var (| "prev_iold" |) |), M.var (| "prev_i0" |) |) ]] in + do~ M.declare_signal "prev_top_lev_ins_fnc" in + do~ M.substitute_var "prev_top_lev_ins" [] [[ InfixOp.mul ~(| M.var (| "prev_top" |), M.var (| "levIns" |) |) ]] in + do~ M.substitute_var "prev_top_lev_ins_fnc" [] [[ InfixOp.mul ~(| M.var (| "prev_top_lev_ins" |), M.var (| "fnc" |) |) ]] in + do~ M.substitute_var "st_top" [] [[ InfixOp.sub ~(| M.var (| "prev_top" |), M.var (| "prev_top_lev_ins" |) |) ]] in + do~ M.substitute_var "st_inew" [] [[ InfixOp.sub ~(| M.var (| "prev_top_lev_ins" |), M.var (| "prev_top_lev_ins_fnc" |) |) ]] in + do~ M.substitute_var "st_iold" [] [[ InfixOp.mul ~(| M.var (| "prev_top_lev_ins_fnc" |), InfixOp.sub ~(| 1, M.var (| "is0" |) |) |) ]] in + do~ M.substitute_var "st_i0" [] [[ InfixOp.mul ~(| M.var (| "prev_top_lev_ins" |), M.var (| "is0" |) |) ]] in + do~ M.substitute_var "st_na" [] [[ InfixOp.add ~(| InfixOp.add ~(| InfixOp.add ~(| M.var (| "prev_na" |), M.var (| "prev_inew" |) |), M.var (| "prev_iold" |) |), M.var (| "prev_i0" |) |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/circuits/switcher.v b/Garden/Circom/Circomlib/translation/circuits/switcher.v index 9295dda..2cdfe2f 100644 --- a/Garden/Circom/Circomlib/translation/circuits/switcher.v +++ b/Garden/Circom/Circomlib/translation/circuits/switcher.v @@ -17,26 +17,36 @@ Module SwitcherSignals. (* Intermediate *) aux : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | sel : P _ sel "sel" + | L : P _ L "L" + | R : P _ R "R" + | outL : P _ outL "outL" + | outR : P _ outR "outR" + | aux : P _ aux "aux". + End IsNamed. End SwitcherSignals. (* Template body *) Definition Switcher : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "sel" [[ ([] : list F.t) ]] in + do~ M.declare_signal "sel" in (* Signal Input *) - do~ M.declare_signal "L" [[ ([] : list F.t) ]] in + do~ M.declare_signal "L" in (* Signal Input *) - do~ M.declare_signal "R" [[ ([] : list F.t) ]] in + do~ M.declare_signal "R" in (* Signal Output *) - do~ M.declare_signal "outL" [[ ([] : list F.t) ]] in + do~ M.declare_signal "outL" in (* Signal Output *) - do~ M.declare_signal "outR" [[ ([] : list F.t) ]] in + do~ M.declare_signal "outR" in (* Signal Intermediate *) - do~ M.declare_signal "aux" [[ ([] : list F.t) ]] in - do~ M.substitute_var "aux" [[ InfixOp.mul ~(| InfixOp.sub ~(| M.var (| "R" |), M.var (| "L" |) |), M.var (| "sel" |) |) ]] in - do~ M.substitute_var "outL" [[ InfixOp.add ~(| M.var (| "aux" |), M.var (| "L" |) |) ]] in - do~ M.substitute_var "outR" [[ InfixOp.add ~(| PrefixOp.sub ~(| M.var (| "aux" |) |), M.var (| "R" |) |) ]] in + do~ M.declare_signal "aux" in + do~ M.substitute_var "aux" [] [[ InfixOp.mul ~(| InfixOp.sub ~(| M.var (| "R" |), M.var (| "L" |) |), M.var (| "sel" |) |) ]] in + do~ M.substitute_var "outL" [] [[ InfixOp.add ~(| M.var (| "aux" |), M.var (| "L" |) |) ]] in + do~ M.substitute_var "outR" [] [[ InfixOp.add ~(| PrefixOp.sub ~(| M.var (| "aux" |) |), M.var (| "R" |) |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/test/circuits/binsub_test.v b/Garden/Circom/Circomlib/translation/test/circuits/binsub_test.v index 5be2375..671ddbf 100644 --- a/Garden/Circom/Circomlib/translation/test/circuits/binsub_test.v +++ b/Garden/Circom/Circomlib/translation/test/circuits/binsub_test.v @@ -11,48 +11,55 @@ Module ASignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | a : P _ a "a" + | b : P _ b "b" + | out : P _ out "out". + End IsNamed. End ASignals. (* Template body *) Definition A : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "a" [[ ([] : list F.t) ]] in + do~ M.declare_signal "a" in (* Signal Input *) - do~ M.declare_signal "b" [[ ([] : list F.t) ]] in + do~ M.declare_signal "b" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Component *) do~ M.declare_component "n2ba" in - do~ M.substitute_var "n2ba" [[ M.call_function ~(| "Num2Bits", [ 16 ] |) ]] in + do~ M.substitute_var "n2ba" [] [[ M.call_function ~(| "Num2Bits", [ 16 ] |) ]] in (* Component *) do~ M.declare_component "n2bb" in - do~ M.substitute_var "n2bb" [[ M.call_function ~(| "Num2Bits", [ 16 ] |) ]] in + do~ M.substitute_var "n2bb" [] [[ M.call_function ~(| "Num2Bits", [ 16 ] |) ]] in (* Component *) do~ M.declare_component "sub" in - do~ M.substitute_var "sub" [[ M.call_function ~(| "BinSub", [ 16 ] |) ]] in + do~ M.substitute_var "sub" [] [[ M.call_function ~(| "BinSub", [ 16 ] |) ]] in (* Component *) do~ M.declare_component "b2n" in - do~ M.substitute_var "b2n" [[ M.call_function ~(| "Bits2Num", [ 16 ] |) ]] in - do~ M.substitute_var "n2ba" [[ M.var (| "a" |) ]] in - do~ M.substitute_var "n2bb" [[ M.var (| "b" |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "b2n" [] [[ M.call_function ~(| "Bits2Num", [ 16 ] |) ]] in + do~ M.substitute_var "n2ba" [Access.Component "in"] [[ M.var (| "a" |) ]] in + do~ M.substitute_var "n2bb" [Access.Component "in"] [[ M.var (| "b" |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 16 |) ]] ( - do~ M.substitute_var "sub" [[ M.var_access (| "n2ba", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "sub" [[ M.var_access (| "n2bb", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "sub" [Access.Component "in"; Access.Array (0); Access.Array (M.var (| "i" |))] [[ M.var_access (| "n2ba", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "sub" [Access.Component "in"; Access.Array (1); Access.Array (M.var (| "i" |))] [[ M.var_access (| "n2bb", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 16 |) ]] ( - do~ M.substitute_var "b2n" [[ M.var_access (| "sub", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "b2n" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "sub", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "b2n", [Access.Component "out"] |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "b2n", [Access.Component "out"] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/test/circuits/constants_test.v b/Garden/Circom/Circomlib/translation/test/circuits/constants_test.v index bb57334..0cc2db6 100644 --- a/Garden/Circom/Circomlib/translation/test/circuits/constants_test.v +++ b/Garden/Circom/Circomlib/translation/test/circuits/constants_test.v @@ -7,29 +7,34 @@ Module ASignals. (* Input *) in_ : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in". + End IsNamed. End ASignals. (* Template body *) Definition A : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ ([] : list F.t) ]] in + do~ M.declare_signal "in" in (* Component *) do~ M.declare_component "h0" in - do~ M.substitute_var "h0" [[ M.call_function ~(| "K", [ 8 ] |) ]] in + do~ M.substitute_var "h0" [] [[ M.call_function ~(| "K", [ 8 ] |) ]] in (* Var *) do~ M.declare_var "lc" [[ ([] : list F.t) ]] in - do~ M.substitute_var "lc" [[ 0 ]] in + do~ M.substitute_var "lc" [] [[ 0 ]] in (* Var *) do~ M.declare_var "e" [[ ([] : list F.t) ]] in - do~ M.substitute_var "e" [[ 1 ]] in + do~ M.substitute_var "e" [] [[ 1 ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 32 |) ]] ( - do~ M.substitute_var "lc" [[ InfixOp.add ~(| M.var (| "lc" |), InfixOp.mul ~(| M.var (| "e" |), M.var_access (| "h0", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) |) |) ]] in - do~ M.substitute_var "e" [[ InfixOp.mul ~(| M.var (| "e" |), 2 |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "lc" [] [[ InfixOp.add ~(| M.var (| "lc" |), InfixOp.mul ~(| M.var (| "e" |), M.var_access (| "h0", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) |) |) ]] in + do~ M.substitute_var "e" [] [[ InfixOp.mul ~(| M.var (| "e" |), 2 |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.equality_constraint diff --git a/Garden/Circom/Circomlib/translation/test/circuits/escalarmul_min_test.v b/Garden/Circom/Circomlib/translation/test/circuits/escalarmul_min_test.v index 777aff0..febf76a 100644 --- a/Garden/Circom/Circomlib/translation/test/circuits/escalarmul_min_test.v +++ b/Garden/Circom/Circomlib/translation/test/circuits/escalarmul_min_test.v @@ -9,35 +9,41 @@ Module MainSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End MainSignals. (* Template body *) Definition Main : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 256 ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Var *) do~ M.declare_var "base" [[ [ 2 ] ]] in - do~ M.substitute_var "base" [[ array_with_repeat (0) (2) ]] in - do~ M.substitute_var "base" [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in + do~ M.substitute_var "base" [] [[ array_with_repeat (0) (2) ]] in + do~ M.substitute_var "base" [] [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in (* Component *) do~ M.declare_component "escalarMul" in - do~ M.substitute_var "escalarMul" [[ M.call_function ~(| "EscalarMul", [ 256; M.var (| "base" |) ] |) ]] in - do~ M.substitute_var "escalarMul" [[ 0 ]] in - do~ M.substitute_var "escalarMul" [[ 1 ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "escalarMul" [] [[ M.call_function ~(| "EscalarMul", [ 256; M.var (| "base" |) ] |) ]] in + do~ M.substitute_var "escalarMul" [Access.Component "inp"; Access.Array (0)] [[ 0 ]] in + do~ M.substitute_var "escalarMul" [Access.Component "inp"; Access.Array (1)] [[ 1 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 256 |) ]] ( - do~ M.substitute_var "escalarMul" [[ M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "escalarMul" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "escalarMul", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "escalarMul", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ M.var_access (| "escalarMul", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ M.var_access (| "escalarMul", [Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/test/circuits/escalarmul_test.v b/Garden/Circom/Circomlib/translation/test/circuits/escalarmul_test.v index c684cf2..a5064b1 100644 --- a/Garden/Circom/Circomlib/translation/test/circuits/escalarmul_test.v +++ b/Garden/Circom/Circomlib/translation/test/circuits/escalarmul_test.v @@ -9,39 +9,45 @@ Module MainSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End MainSignals. (* Template body *) Definition Main : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ ([] : list F.t) ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "base" [[ [ 2 ] ]] in - do~ M.substitute_var "base" [[ array_with_repeat (0) (2) ]] in - do~ M.substitute_var "base" [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in + do~ M.substitute_var "base" [] [[ array_with_repeat (0) (2) ]] in + do~ M.substitute_var "base" [] [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in (* Component *) do~ M.declare_component "n2b" in - do~ M.substitute_var "n2b" [[ M.call_function ~(| "Num2Bits", [ 253 ] |) ]] in + do~ M.substitute_var "n2b" [] [[ M.call_function ~(| "Num2Bits", [ 253 ] |) ]] in (* Component *) do~ M.declare_component "escalarMul" in - do~ M.substitute_var "escalarMul" [[ M.call_function ~(| "EscalarMul", [ 253; M.var (| "base" |) ] |) ]] in - do~ M.substitute_var "escalarMul" [[ 0 ]] in - do~ M.substitute_var "escalarMul" [[ 1 ]] in + do~ M.substitute_var "escalarMul" [] [[ M.call_function ~(| "EscalarMul", [ 253; M.var (| "base" |) ] |) ]] in + do~ M.substitute_var "escalarMul" [Access.Component "inp"; Access.Array (0)] [[ 0 ]] in + do~ M.substitute_var "escalarMul" [Access.Component "inp"; Access.Array (1)] [[ 1 ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in - do~ M.substitute_var "n2b" [[ M.var (| "in" |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in + do~ M.substitute_var "n2b" [Access.Component "in"] [[ M.var (| "in" |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 253 |) ]] ( - do~ M.substitute_var "escalarMul" [[ M.var_access (| "n2b", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "escalarMul" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "n2b", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "escalarMul", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "escalarMul", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ M.var_access (| "escalarMul", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ M.var_access (| "escalarMul", [Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/test/circuits/escalarmul_test_min.v b/Garden/Circom/Circomlib/translation/test/circuits/escalarmul_test_min.v index 777aff0..febf76a 100644 --- a/Garden/Circom/Circomlib/translation/test/circuits/escalarmul_test_min.v +++ b/Garden/Circom/Circomlib/translation/test/circuits/escalarmul_test_min.v @@ -9,35 +9,41 @@ Module MainSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End MainSignals. (* Template body *) Definition Main : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 256 ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Var *) do~ M.declare_var "base" [[ [ 2 ] ]] in - do~ M.substitute_var "base" [[ array_with_repeat (0) (2) ]] in - do~ M.substitute_var "base" [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in + do~ M.substitute_var "base" [] [[ array_with_repeat (0) (2) ]] in + do~ M.substitute_var "base" [] [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in (* Component *) do~ M.declare_component "escalarMul" in - do~ M.substitute_var "escalarMul" [[ M.call_function ~(| "EscalarMul", [ 256; M.var (| "base" |) ] |) ]] in - do~ M.substitute_var "escalarMul" [[ 0 ]] in - do~ M.substitute_var "escalarMul" [[ 1 ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "escalarMul" [] [[ M.call_function ~(| "EscalarMul", [ 256; M.var (| "base" |) ] |) ]] in + do~ M.substitute_var "escalarMul" [Access.Component "inp"; Access.Array (0)] [[ 0 ]] in + do~ M.substitute_var "escalarMul" [Access.Component "inp"; Access.Array (1)] [[ 1 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 256 |) ]] ( - do~ M.substitute_var "escalarMul" [[ M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "escalarMul" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "in", [Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "escalarMul", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "escalarMul", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ M.var_access (| "escalarMul", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ M.var_access (| "escalarMul", [Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/test/circuits/escalarmulany_test.v b/Garden/Circom/Circomlib/translation/test/circuits/escalarmulany_test.v index 8fa2b10..854f053 100644 --- a/Garden/Circom/Circomlib/translation/test/circuits/escalarmulany_test.v +++ b/Garden/Circom/Circomlib/translation/test/circuits/escalarmulany_test.v @@ -11,37 +11,44 @@ Module MainSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | e : P _ e "e" + | p : P _ p "p" + | out : P _ out "out". + End IsNamed. End MainSignals. (* Template body *) Definition Main : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "e" [[ ([] : list F.t) ]] in + do~ M.declare_signal "e" in (* Signal Input *) - do~ M.declare_signal "p" [[ [ 2 ] ]] in + do~ M.declare_signal "p" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "n2b" in - do~ M.substitute_var "n2b" [[ M.call_function ~(| "Num2Bits", [ 253 ] |) ]] in + do~ M.substitute_var "n2b" [] [[ M.call_function ~(| "Num2Bits", [ 253 ] |) ]] in (* Component *) do~ M.declare_component "escalarMulAny" in - do~ M.substitute_var "escalarMulAny" [[ M.call_function ~(| "EscalarMulAny", [ 253 ] |) ]] in - do~ M.substitute_var "escalarMulAny" [[ M.var_access (| "p", [Access.Array (0)] |) ]] in - do~ M.substitute_var "escalarMulAny" [[ M.var_access (| "p", [Access.Array (1)] |) ]] in + do~ M.substitute_var "escalarMulAny" [] [[ M.call_function ~(| "EscalarMulAny", [ 253 ] |) ]] in + do~ M.substitute_var "escalarMulAny" [Access.Component "p"; Access.Array (0)] [[ M.var_access (| "p", [Access.Array (0)] |) ]] in + do~ M.substitute_var "escalarMulAny" [Access.Component "p"; Access.Array (1)] [[ M.var_access (| "p", [Access.Array (1)] |) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in - do~ M.substitute_var "n2b" [[ M.var (| "e" |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in + do~ M.substitute_var "n2b" [Access.Component "in"] [[ M.var (| "e" |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 253 |) ]] ( - do~ M.substitute_var "escalarMulAny" [[ M.var_access (| "n2b", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "escalarMulAny" [Access.Component "e"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "n2b", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "escalarMulAny", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "escalarMulAny", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ M.var_access (| "escalarMulAny", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ M.var_access (| "escalarMulAny", [Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/test/circuits/escalarmulfix_test.v b/Garden/Circom/Circomlib/translation/test/circuits/escalarmulfix_test.v index e5348ff..17cee71 100644 --- a/Garden/Circom/Circomlib/translation/test/circuits/escalarmulfix_test.v +++ b/Garden/Circom/Circomlib/translation/test/circuits/escalarmulfix_test.v @@ -9,37 +9,43 @@ Module MainSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | e : P _ e "e" + | out : P _ out "out". + End IsNamed. End MainSignals. (* Template body *) Definition Main : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "e" [[ ([] : list F.t) ]] in + do~ M.declare_signal "e" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "base" [[ [ 2 ] ]] in - do~ M.substitute_var "base" [[ array_with_repeat (0) (2) ]] in - do~ M.substitute_var "base" [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in + do~ M.substitute_var "base" [] [[ array_with_repeat (0) (2) ]] in + do~ M.substitute_var "base" [] [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in (* Component *) do~ M.declare_component "n2b" in - do~ M.substitute_var "n2b" [[ M.call_function ~(| "Num2Bits", [ 253 ] |) ]] in + do~ M.substitute_var "n2b" [] [[ M.call_function ~(| "Num2Bits", [ 253 ] |) ]] in (* Component *) do~ M.declare_component "escalarMul" in - do~ M.substitute_var "escalarMul" [[ M.call_function ~(| "EscalarMulFix", [ 253; M.var (| "base" |) ] |) ]] in + do~ M.substitute_var "escalarMul" [] [[ M.call_function ~(| "EscalarMulFix", [ 253; M.var (| "base" |) ] |) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in - do~ M.substitute_var "n2b" [[ M.var (| "e" |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in + do~ M.substitute_var "n2b" [Access.Component "in"] [[ M.var (| "e" |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 253 |) ]] ( - do~ M.substitute_var "escalarMul" [[ M.var_access (| "n2b", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "escalarMul" [Access.Component "e"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "n2b", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "escalarMul", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "escalarMul", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ M.var_access (| "escalarMul", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ M.var_access (| "escalarMul", [Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/test/circuits/escalarmulw4table.v b/Garden/Circom/Circomlib/translation/test/circuits/escalarmulw4table.v index 8bf06d6..417d441 100644 --- a/Garden/Circom/Circomlib/translation/test/circuits/escalarmulw4table.v +++ b/Garden/Circom/Circomlib/translation/test/circuits/escalarmulw4table.v @@ -7,28 +7,33 @@ Module MainSignals. (* Output *) out : list (list F.t); }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | out : P _ out "out". + End IsNamed. End MainSignals. (* Template body *) Definition Main : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Output *) - do~ M.declare_signal "out" [[ [ 16; 2 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "base" [[ [ 2 ] ]] in - do~ M.substitute_var "base" [[ array_with_repeat (0) (2) ]] in - do~ M.substitute_var "base" [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in + do~ M.substitute_var "base" [] [[ array_with_repeat (0) (2) ]] in + do~ M.substitute_var "base" [] [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in (* Var *) do~ M.declare_var "escalarMul" [[ [ 16; 2 ] ]] in - do~ M.substitute_var "escalarMul" [[ array_with_repeat (array_with_repeat (0) (2)) (16) ]] in - do~ M.substitute_var "escalarMul" [[ M.call_function ~(| "EscalarMulW4Table", [ M.var (| "base" |); 0 ] |) ]] in + do~ M.substitute_var "escalarMul" [] [[ array_with_repeat (array_with_repeat (0) (2)) (16) ]] in + do~ M.substitute_var "escalarMul" [] [[ M.call_function ~(| "EscalarMulW4Table", [ M.var (| "base" |); 0 ] |) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 16 |) ]] ( - do~ M.substitute_var "out" [[ M.var_access (| "escalarMul", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "escalarMul", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |)); Access.Array (0)] [[ M.var_access (| "escalarMul", [Access.Array (M.var (| "i" |)); Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |)); Access.Array (1)] [[ M.var_access (| "escalarMul", [Access.Array (M.var (| "i" |)); Access.Array (1)] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt diff --git a/Garden/Circom/Circomlib/translation/test/circuits/escalarmulw4table_test.v b/Garden/Circom/Circomlib/translation/test/circuits/escalarmulw4table_test.v index dd84436..3998add 100644 --- a/Garden/Circom/Circomlib/translation/test/circuits/escalarmulw4table_test.v +++ b/Garden/Circom/Circomlib/translation/test/circuits/escalarmulw4table_test.v @@ -9,30 +9,36 @@ Module MainSignals. (* Output *) out : list (list F.t); }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End MainSignals. (* Template body *) Definition Main : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ ([] : list F.t) ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 16; 2 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "base" [[ [ 2 ] ]] in - do~ M.substitute_var "base" [[ array_with_repeat (0) (2) ]] in - do~ M.substitute_var "base" [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in + do~ M.substitute_var "base" [] [[ array_with_repeat (0) (2) ]] in + do~ M.substitute_var "base" [] [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in (* Var *) do~ M.declare_var "escalarMul" [[ [ 16; 2 ] ]] in - do~ M.substitute_var "escalarMul" [[ array_with_repeat (array_with_repeat (0) (2)) (16) ]] in - do~ M.substitute_var "escalarMul" [[ M.call_function ~(| "EscalarMulW4Table", [ M.var (| "base" |); 0 ] |) ]] in + do~ M.substitute_var "escalarMul" [] [[ array_with_repeat (array_with_repeat (0) (2)) (16) ]] in + do~ M.substitute_var "escalarMul" [] [[ M.call_function ~(| "EscalarMulW4Table", [ M.var (| "base" |); 0 ] |) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 16 |) ]] ( - do~ M.substitute_var "out" [[ InfixOp.mul ~(| M.var_access (| "escalarMul", [Access.Array (M.var (| "i" |)); Access.Array (0)] |), M.var (| "in" |) |) ]] in - do~ M.substitute_var "out" [[ InfixOp.mul ~(| M.var_access (| "escalarMul", [Access.Array (M.var (| "i" |)); Access.Array (1)] |), M.var (| "in" |) |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |)); Access.Array (0)] [[ InfixOp.mul ~(| M.var_access (| "escalarMul", [Access.Array (M.var (| "i" |)); Access.Array (0)] |), M.var (| "in" |) |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |)); Access.Array (1)] [[ InfixOp.mul ~(| M.var_access (| "escalarMul", [Access.Array (M.var (| "i" |)); Access.Array (1)] |), M.var (| "in" |) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt diff --git a/Garden/Circom/Circomlib/translation/test/circuits/escalarmulw4table_test3.v b/Garden/Circom/Circomlib/translation/test/circuits/escalarmulw4table_test3.v index f073747..ccbe98b 100644 --- a/Garden/Circom/Circomlib/translation/test/circuits/escalarmulw4table_test3.v +++ b/Garden/Circom/Circomlib/translation/test/circuits/escalarmulw4table_test3.v @@ -9,30 +9,36 @@ Module MainSignals. (* Output *) out : list (list F.t); }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End MainSignals. (* Template body *) Definition Main : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ ([] : list F.t) ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 16; 2 ] ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "base" [[ [ 2 ] ]] in - do~ M.substitute_var "base" [[ array_with_repeat (0) (2) ]] in - do~ M.substitute_var "base" [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in + do~ M.substitute_var "base" [] [[ array_with_repeat (0) (2) ]] in + do~ M.substitute_var "base" [] [[ [ 5299619240641551281634865583518297030282874472190772894086521144482721001553; 16950150798460657717958625567821834550301663161624707787222815936182638968203 ] ]] in (* Var *) do~ M.declare_var "escalarMul" [[ [ 16; 2 ] ]] in - do~ M.substitute_var "escalarMul" [[ array_with_repeat (array_with_repeat (0) (2)) (16) ]] in - do~ M.substitute_var "escalarMul" [[ M.call_function ~(| "EscalarMulW4Table", [ M.var (| "base" |); 3 ] |) ]] in + do~ M.substitute_var "escalarMul" [] [[ array_with_repeat (array_with_repeat (0) (2)) (16) ]] in + do~ M.substitute_var "escalarMul" [] [[ M.call_function ~(| "EscalarMulW4Table", [ M.var (| "base" |); 3 ] |) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 16 |) ]] ( - do~ M.substitute_var "out" [[ InfixOp.mul ~(| M.var_access (| "escalarMul", [Access.Array (M.var (| "i" |)); Access.Array (0)] |), M.var (| "in" |) |) ]] in - do~ M.substitute_var "out" [[ InfixOp.mul ~(| M.var_access (| "escalarMul", [Access.Array (M.var (| "i" |)); Access.Array (1)] |), M.var (| "in" |) |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |)); Access.Array (0)] [[ InfixOp.mul ~(| M.var_access (| "escalarMul", [Access.Array (M.var (| "i" |)); Access.Array (0)] |), M.var (| "in" |) |) ]] in + do~ M.substitute_var "out" [Access.Array (M.var (| "i" |)); Access.Array (1)] [[ InfixOp.mul ~(| M.var_access (| "escalarMul", [Access.Array (M.var (| "i" |)); Access.Array (1)] |), M.var (| "in" |) |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in M.pure BlockUnit.Tt diff --git a/Garden/Circom/Circomlib/translation/test/circuits/mux1_1.v b/Garden/Circom/Circomlib/translation/test/circuits/mux1_1.v index 687b02a..90777fe 100644 --- a/Garden/Circom/Circomlib/translation/test/circuits/mux1_1.v +++ b/Garden/Circom/Circomlib/translation/test/circuits/mux1_1.v @@ -7,6 +7,11 @@ Module ConstantsSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | out : P _ out "out". + End IsNamed. End ConstantsSignals. (* Template body *) @@ -14,11 +19,11 @@ Definition Constants : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in - do~ M.substitute_var "out" [[ 37 ]] in - do~ M.substitute_var "out" [[ 47 ]] in + do~ M.declare_signal "out" in + do~ M.substitute_var "out" [Access.Array (0)] [[ 37 ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ 47 ]] in M.pure BlockUnit.Tt ). @@ -36,6 +41,12 @@ Module MainSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | selector : P _ selector "selector" + | out : P _ out "out". + End IsNamed. End MainSignals. (* Template body *) @@ -43,29 +54,29 @@ Definition Main : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Signal Input *) - do~ M.declare_signal "selector" [[ ([] : list F.t) ]] in + do~ M.declare_signal "selector" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "mux" in - do~ M.substitute_var "mux" [[ M.call_function ~(| "Mux1", ([] : list F.t) |) ]] in + do~ M.substitute_var "mux" [] [[ M.call_function ~(| "Mux1", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "n2b" in - do~ M.substitute_var "n2b" [[ M.call_function ~(| "Num2Bits", [ 1 ] |) ]] in + do~ M.substitute_var "n2b" [] [[ M.call_function ~(| "Num2Bits", [ 1 ] |) ]] in (* Component *) do~ M.declare_component "cst" in - do~ M.substitute_var "cst" [[ M.call_function ~(| "Constants", ([] : list F.t) |) ]] in - do~ M.substitute_var "n2b" [[ M.var (| "selector" |) ]] in - do~ M.substitute_var "mux" [[ M.var_access (| "n2b", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "cst" [] [[ M.call_function ~(| "Constants", ([] : list F.t) |) ]] in + do~ M.substitute_var "n2b" [Access.Component "in"] [[ M.var (| "selector" |) ]] in + do~ M.substitute_var "mux" [Access.Component "s"] [[ M.var_access (| "n2b", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 2 |) ]] ( - do~ M.substitute_var "mux" [[ M.var_access (| "cst", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "cst", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "mux", [Access.Component "out"] |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "mux", [Access.Component "out"] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/test/circuits/mux2_1.v b/Garden/Circom/Circomlib/translation/test/circuits/mux2_1.v index 10dd7ed..65453ec 100644 --- a/Garden/Circom/Circomlib/translation/test/circuits/mux2_1.v +++ b/Garden/Circom/Circomlib/translation/test/circuits/mux2_1.v @@ -7,6 +7,11 @@ Module ConstantsSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | out : P _ out "out". + End IsNamed. End ConstantsSignals. (* Template body *) @@ -14,13 +19,13 @@ Definition Constants : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 4 ] ]] in - do~ M.substitute_var "out" [[ 37 ]] in - do~ M.substitute_var "out" [[ 47 ]] in - do~ M.substitute_var "out" [[ 53 ]] in - do~ M.substitute_var "out" [[ 71 ]] in + do~ M.declare_signal "out" in + do~ M.substitute_var "out" [Access.Array (0)] [[ 37 ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ 47 ]] in + do~ M.substitute_var "out" [Access.Array (2)] [[ 53 ]] in + do~ M.substitute_var "out" [Access.Array (3)] [[ 71 ]] in M.pure BlockUnit.Tt ). @@ -38,6 +43,12 @@ Module MainSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | selector : P _ selector "selector" + | out : P _ out "out". + End IsNamed. End MainSignals. (* Template body *) @@ -45,34 +56,34 @@ Definition Main : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Signal Input *) - do~ M.declare_signal "selector" [[ ([] : list F.t) ]] in + do~ M.declare_signal "selector" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "mux" in - do~ M.substitute_var "mux" [[ M.call_function ~(| "Mux2", ([] : list F.t) |) ]] in + do~ M.substitute_var "mux" [] [[ M.call_function ~(| "Mux2", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "n2b" in - do~ M.substitute_var "n2b" [[ M.call_function ~(| "Num2Bits", [ 2 ] |) ]] in + do~ M.substitute_var "n2b" [] [[ M.call_function ~(| "Num2Bits", [ 2 ] |) ]] in (* Component *) do~ M.declare_component "cst" in - do~ M.substitute_var "cst" [[ M.call_function ~(| "Constants", ([] : list F.t) |) ]] in - do~ M.substitute_var "n2b" [[ M.var (| "selector" |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "cst" [] [[ M.call_function ~(| "Constants", ([] : list F.t) |) ]] in + do~ M.substitute_var "n2b" [Access.Component "in"] [[ M.var (| "selector" |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 2 |) ]] ( - do~ M.substitute_var "mux" [[ M.var_access (| "n2b", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mux" [Access.Component "s"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "n2b", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 4 |) ]] ( - do~ M.substitute_var "mux" [[ M.var_access (| "cst", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "cst", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "mux", [Access.Component "out"] |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "mux", [Access.Component "out"] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/test/circuits/mux3_1.v b/Garden/Circom/Circomlib/translation/test/circuits/mux3_1.v index 648a13a..9bccdd0 100644 --- a/Garden/Circom/Circomlib/translation/test/circuits/mux3_1.v +++ b/Garden/Circom/Circomlib/translation/test/circuits/mux3_1.v @@ -7,6 +7,11 @@ Module ConstantsSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | out : P _ out "out". + End IsNamed. End ConstantsSignals. (* Template body *) @@ -14,17 +19,17 @@ Definition Constants : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 8 ] ]] in - do~ M.substitute_var "out" [[ 37 ]] in - do~ M.substitute_var "out" [[ 47 ]] in - do~ M.substitute_var "out" [[ 53 ]] in - do~ M.substitute_var "out" [[ 71 ]] in - do~ M.substitute_var "out" [[ 89 ]] in - do~ M.substitute_var "out" [[ 107 ]] in - do~ M.substitute_var "out" [[ 163 ]] in - do~ M.substitute_var "out" [[ 191 ]] in + do~ M.declare_signal "out" in + do~ M.substitute_var "out" [Access.Array (0)] [[ 37 ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ 47 ]] in + do~ M.substitute_var "out" [Access.Array (2)] [[ 53 ]] in + do~ M.substitute_var "out" [Access.Array (3)] [[ 71 ]] in + do~ M.substitute_var "out" [Access.Array (4)] [[ 89 ]] in + do~ M.substitute_var "out" [Access.Array (5)] [[ 107 ]] in + do~ M.substitute_var "out" [Access.Array (6)] [[ 163 ]] in + do~ M.substitute_var "out" [Access.Array (7)] [[ 191 ]] in M.pure BlockUnit.Tt ). @@ -42,6 +47,12 @@ Module MainSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | selector : P _ selector "selector" + | out : P _ out "out". + End IsNamed. End MainSignals. (* Template body *) @@ -49,34 +60,34 @@ Definition Main : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Signal Input *) - do~ M.declare_signal "selector" [[ ([] : list F.t) ]] in + do~ M.declare_signal "selector" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "mux" in - do~ M.substitute_var "mux" [[ M.call_function ~(| "Mux3", ([] : list F.t) |) ]] in + do~ M.substitute_var "mux" [] [[ M.call_function ~(| "Mux3", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "n2b" in - do~ M.substitute_var "n2b" [[ M.call_function ~(| "Num2Bits", [ 3 ] |) ]] in + do~ M.substitute_var "n2b" [] [[ M.call_function ~(| "Num2Bits", [ 3 ] |) ]] in (* Component *) do~ M.declare_component "cst" in - do~ M.substitute_var "cst" [[ M.call_function ~(| "Constants", ([] : list F.t) |) ]] in - do~ M.substitute_var "n2b" [[ M.var (| "selector" |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "cst" [] [[ M.call_function ~(| "Constants", ([] : list F.t) |) ]] in + do~ M.substitute_var "n2b" [Access.Component "in"] [[ M.var (| "selector" |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 3 |) ]] ( - do~ M.substitute_var "mux" [[ M.var_access (| "n2b", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mux" [Access.Component "s"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "n2b", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 8 |) ]] ( - do~ M.substitute_var "mux" [[ M.var_access (| "cst", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "cst", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "mux", [Access.Component "out"] |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "mux", [Access.Component "out"] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/test/circuits/mux4_1.v b/Garden/Circom/Circomlib/translation/test/circuits/mux4_1.v index 3ed6f0d..abc9b43 100644 --- a/Garden/Circom/Circomlib/translation/test/circuits/mux4_1.v +++ b/Garden/Circom/Circomlib/translation/test/circuits/mux4_1.v @@ -7,6 +7,11 @@ Module ConstantsSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | out : P _ out "out". + End IsNamed. End ConstantsSignals. (* Template body *) @@ -14,25 +19,25 @@ Definition Constants : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 16 ] ]] in - do~ M.substitute_var "out" [[ 123 ]] in - do~ M.substitute_var "out" [[ 456 ]] in - do~ M.substitute_var "out" [[ 789 ]] in - do~ M.substitute_var "out" [[ 12 ]] in - do~ M.substitute_var "out" [[ 111 ]] in - do~ M.substitute_var "out" [[ 222 ]] in - do~ M.substitute_var "out" [[ 333 ]] in - do~ M.substitute_var "out" [[ 4546 ]] in - do~ M.substitute_var "out" [[ 134523 ]] in - do~ M.substitute_var "out" [[ 44356 ]] in - do~ M.substitute_var "out" [[ 15623 ]] in - do~ M.substitute_var "out" [[ 4566 ]] in - do~ M.substitute_var "out" [[ 1223 ]] in - do~ M.substitute_var "out" [[ 4546 ]] in - do~ M.substitute_var "out" [[ 4256 ]] in - do~ M.substitute_var "out" [[ 4456 ]] in + do~ M.declare_signal "out" in + do~ M.substitute_var "out" [Access.Array (0)] [[ 123 ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ 456 ]] in + do~ M.substitute_var "out" [Access.Array (2)] [[ 789 ]] in + do~ M.substitute_var "out" [Access.Array (3)] [[ 12 ]] in + do~ M.substitute_var "out" [Access.Array (4)] [[ 111 ]] in + do~ M.substitute_var "out" [Access.Array (5)] [[ 222 ]] in + do~ M.substitute_var "out" [Access.Array (6)] [[ 333 ]] in + do~ M.substitute_var "out" [Access.Array (7)] [[ 4546 ]] in + do~ M.substitute_var "out" [Access.Array (8)] [[ 134523 ]] in + do~ M.substitute_var "out" [Access.Array (9)] [[ 44356 ]] in + do~ M.substitute_var "out" [Access.Array (10)] [[ 15623 ]] in + do~ M.substitute_var "out" [Access.Array (11)] [[ 4566 ]] in + do~ M.substitute_var "out" [Access.Array (12)] [[ 1223 ]] in + do~ M.substitute_var "out" [Access.Array (13)] [[ 4546 ]] in + do~ M.substitute_var "out" [Access.Array (14)] [[ 4256 ]] in + do~ M.substitute_var "out" [Access.Array (15)] [[ 4456 ]] in M.pure BlockUnit.Tt ). @@ -50,6 +55,12 @@ Module MainSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | selector : P _ selector "selector" + | out : P _ out "out". + End IsNamed. End MainSignals. (* Template body *) @@ -57,34 +68,34 @@ Definition Main : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Signal Input *) - do~ M.declare_signal "selector" [[ ([] : list F.t) ]] in + do~ M.declare_signal "selector" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "mux" in - do~ M.substitute_var "mux" [[ M.call_function ~(| "Mux4", ([] : list F.t) |) ]] in + do~ M.substitute_var "mux" [] [[ M.call_function ~(| "Mux4", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "n2b" in - do~ M.substitute_var "n2b" [[ M.call_function ~(| "Num2Bits", [ 4 ] |) ]] in + do~ M.substitute_var "n2b" [] [[ M.call_function ~(| "Num2Bits", [ 4 ] |) ]] in (* Component *) do~ M.declare_component "cst" in - do~ M.substitute_var "cst" [[ M.call_function ~(| "Constants", ([] : list F.t) |) ]] in - do~ M.substitute_var "n2b" [[ M.var (| "selector" |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "cst" [] [[ M.call_function ~(| "Constants", ([] : list F.t) |) ]] in + do~ M.substitute_var "n2b" [Access.Component "in"] [[ M.var (| "selector" |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 4 |) ]] ( - do~ M.substitute_var "mux" [[ M.var_access (| "n2b", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mux" [Access.Component "s"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "n2b", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 16 |) ]] ( - do~ M.substitute_var "mux" [[ M.var_access (| "cst", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "mux" [Access.Component "c"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "cst", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "mux", [Access.Component "out"] |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "mux", [Access.Component "out"] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/test/circuits/pedersen2_test.v b/Garden/Circom/Circomlib/translation/test/circuits/pedersen2_test.v index a578835..7b38185 100644 --- a/Garden/Circom/Circomlib/translation/test/circuits/pedersen2_test.v +++ b/Garden/Circom/Circomlib/translation/test/circuits/pedersen2_test.v @@ -9,39 +9,45 @@ Module MainSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End MainSignals. (* Template body *) Definition Main : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ ([] : list F.t) ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "pedersen" in - do~ M.substitute_var "pedersen" [[ M.call_function ~(| "Pedersen", [ 256 ] |) ]] in + do~ M.substitute_var "pedersen" [] [[ M.call_function ~(| "Pedersen", [ 256 ] |) ]] in (* Component *) do~ M.declare_component "n2b" in - do~ M.substitute_var "n2b" [[ M.call_function ~(| "Num2Bits", [ 253 ] |) ]] in + do~ M.substitute_var "n2b" [] [[ M.call_function ~(| "Num2Bits", [ 253 ] |) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in - do~ M.substitute_var "n2b" [[ M.var (| "in" |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in + do~ M.substitute_var "n2b" [Access.Component "in"] [[ M.var (| "in" |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 253 |) ]] ( - do~ M.substitute_var "pedersen" [[ M.var_access (| "n2b", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "pedersen" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "n2b", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ 253 ]] in + do~ M.substitute_var "i" [] [[ 253 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 256 |) ]] ( - do~ M.substitute_var "pedersen" [[ 0 ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "pedersen" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ 0 ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "pedersen", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "pedersen", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ M.var_access (| "pedersen", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ M.var_access (| "pedersen", [Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/test/circuits/pedersen_test.v b/Garden/Circom/Circomlib/translation/test/circuits/pedersen_test.v index e095bbb..ca0744c 100644 --- a/Garden/Circom/Circomlib/translation/test/circuits/pedersen_test.v +++ b/Garden/Circom/Circomlib/translation/test/circuits/pedersen_test.v @@ -9,36 +9,42 @@ Module MainSignals. (* Output *) out : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in" + | out : P _ out "out". + End IsNamed. End MainSignals. (* Template body *) Definition Main : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 2 ] ]] in + do~ M.declare_signal "in" in (* Signal Output *) - do~ M.declare_signal "out" [[ [ 2 ] ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "pedersen" in - do~ M.substitute_var "pedersen" [[ M.call_function ~(| "Pedersen", [ InfixOp.mul ~(| 250, 2 |) ] |) ]] in + do~ M.substitute_var "pedersen" [] [[ M.call_function ~(| "Pedersen", [ InfixOp.mul ~(| 250, 2 |) ] |) ]] in (* Component *) do~ M.declare_component "n2b" in - do~ M.substitute_var "n2b" [[ M.call_function ~(| "Num2Bits", [ 250 ] |) ]] in - do~ M.substitute_var "n2b" [[ M.call_function ~(| "Num2Bits", [ 250 ] |) ]] in + do~ M.substitute_var "n2b" [Access.Array (0)] [[ M.call_function ~(| "Num2Bits", [ 250 ] |) ]] in + do~ M.substitute_var "n2b" [Access.Array (1)] [[ M.call_function ~(| "Num2Bits", [ 250 ] |) ]] in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in - do~ M.substitute_var "n2b" [[ M.var_access (| "in", [Access.Array (0)] |) ]] in - do~ M.substitute_var "n2b" [[ M.var_access (| "in", [Access.Array (1)] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in + do~ M.substitute_var "n2b" [Access.Array (0); Access.Component "in"] [[ M.var_access (| "in", [Access.Array (0)] |) ]] in + do~ M.substitute_var "n2b" [Access.Array (1); Access.Component "in"] [[ M.var_access (| "in", [Access.Array (1)] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 250 |) ]] ( - do~ M.substitute_var "pedersen" [[ M.var_access (| "n2b", [Access.Array (0); Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "pedersen" [[ M.var_access (| "n2b", [Access.Array (1); Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "pedersen" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "n2b", [Access.Array (0); Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "pedersen" [Access.Component "in"; Access.Array (InfixOp.add ~(| 250, M.var (| "i" |) |))] [[ M.var_access (| "n2b", [Access.Array (1); Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "pedersen", [Access.Component "out"; Access.Array (0)] |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "pedersen", [Access.Component "out"; Access.Array (1)] |) ]] in + do~ M.substitute_var "out" [Access.Array (0)] [[ M.var_access (| "pedersen", [Access.Component "out"; Access.Array (0)] |) ]] in + do~ M.substitute_var "out" [Access.Array (1)] [[ M.var_access (| "pedersen", [Access.Component "out"; Access.Array (1)] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/test/circuits/pointbits_loopback.v b/Garden/Circom/Circomlib/translation/test/circuits/pointbits_loopback.v index b342aef..b458c7f 100644 --- a/Garden/Circom/Circomlib/translation/test/circuits/pointbits_loopback.v +++ b/Garden/Circom/Circomlib/translation/test/circuits/pointbits_loopback.v @@ -7,28 +7,33 @@ Module MainSignals. (* Input *) in_ : list F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | in_ : P _ in_ "in". + End IsNamed. End MainSignals. (* Template body *) Definition Main : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "in" [[ [ 2 ] ]] in + do~ M.declare_signal "in" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Component *) do~ M.declare_component "p2b" in - do~ M.substitute_var "p2b" [[ M.call_function ~(| "Point2Bits_Strict", ([] : list F.t) |) ]] in + do~ M.substitute_var "p2b" [] [[ M.call_function ~(| "Point2Bits_Strict", ([] : list F.t) |) ]] in (* Component *) do~ M.declare_component "b2p" in - do~ M.substitute_var "b2p" [[ M.call_function ~(| "Bits2Point_Strict", ([] : list F.t) |) ]] in - do~ M.substitute_var "p2b" [[ M.var_access (| "in", [Access.Array (0)] |) ]] in - do~ M.substitute_var "p2b" [[ M.var_access (| "in", [Access.Array (1)] |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "b2p" [] [[ M.call_function ~(| "Bits2Point_Strict", ([] : list F.t) |) ]] in + do~ M.substitute_var "p2b" [Access.Component "in"; Access.Array (0)] [[ M.var_access (| "in", [Access.Array (0)] |) ]] in + do~ M.substitute_var "p2b" [Access.Component "in"; Access.Array (1)] [[ M.var_access (| "in", [Access.Array (1)] |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 256 |) ]] ( - do~ M.substitute_var "b2p" [[ M.var_access (| "p2b", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "b2p" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "p2b", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in do~ M.equality_constraint diff --git a/Garden/Circom/Circomlib/translation/test/circuits/sha256_2_test.v b/Garden/Circom/Circomlib/translation/test/circuits/sha256_2_test.v index 783890b..5279cc5 100644 --- a/Garden/Circom/Circomlib/translation/test/circuits/sha256_2_test.v +++ b/Garden/Circom/Circomlib/translation/test/circuits/sha256_2_test.v @@ -11,23 +11,30 @@ Module MainSignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | a : P _ a "a" + | b : P _ b "b" + | out : P _ out "out". + End IsNamed. End MainSignals. (* Template body *) Definition Main : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "a" [[ ([] : list F.t) ]] in + do~ M.declare_signal "a" in (* Signal Input *) - do~ M.declare_signal "b" [[ ([] : list F.t) ]] in + do~ M.declare_signal "b" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Component *) do~ M.declare_component "sha256_2" in - do~ M.substitute_var "sha256_2" [[ M.call_function ~(| "Sha256_2", ([] : list F.t) |) ]] in - do~ M.substitute_var "sha256_2" [[ M.var (| "a" |) ]] in - do~ M.substitute_var "sha256_2" [[ M.var (| "b" |) ]] in - do~ M.substitute_var "out" [[ M.var_access (| "sha256_2", [Access.Component "out"] |) ]] in + do~ M.substitute_var "sha256_2" [] [[ M.call_function ~(| "Sha256_2", ([] : list F.t) |) ]] in + do~ M.substitute_var "sha256_2" [Access.Component "a"] [[ M.var (| "a" |) ]] in + do~ M.substitute_var "sha256_2" [Access.Component "b"] [[ M.var (| "b" |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "sha256_2", [Access.Component "out"] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Circom/Circomlib/translation/test/circuits/sum_test.v b/Garden/Circom/Circomlib/translation/test/circuits/sum_test.v index 8930001..7417f09 100644 --- a/Garden/Circom/Circomlib/translation/test/circuits/sum_test.v +++ b/Garden/Circom/Circomlib/translation/test/circuits/sum_test.v @@ -11,48 +11,55 @@ Module ASignals. (* Output *) out : F.t; }. + + Module IsNamed. + Inductive P : forall (A : Set), (t -> A) -> string -> Prop := + | a : P _ a "a" + | b : P _ b "b" + | out : P _ out "out". + End IsNamed. End ASignals. (* Template body *) Definition A : M.t (BlockUnit.t Empty_set) := M.template_body [] ( (* Signal Input *) - do~ M.declare_signal "a" [[ ([] : list F.t) ]] in + do~ M.declare_signal "a" in (* Signal Input *) - do~ M.declare_signal "b" [[ ([] : list F.t) ]] in + do~ M.declare_signal "b" in (* Signal Output *) - do~ M.declare_signal "out" [[ ([] : list F.t) ]] in + do~ M.declare_signal "out" in (* Var *) do~ M.declare_var "i" [[ ([] : list F.t) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in (* Component *) do~ M.declare_component "n2ba" in - do~ M.substitute_var "n2ba" [[ M.call_function ~(| "Num2Bits", [ 32 ] |) ]] in + do~ M.substitute_var "n2ba" [] [[ M.call_function ~(| "Num2Bits", [ 32 ] |) ]] in (* Component *) do~ M.declare_component "n2bb" in - do~ M.substitute_var "n2bb" [[ M.call_function ~(| "Num2Bits", [ 32 ] |) ]] in + do~ M.substitute_var "n2bb" [] [[ M.call_function ~(| "Num2Bits", [ 32 ] |) ]] in (* Component *) do~ M.declare_component "sum" in - do~ M.substitute_var "sum" [[ M.call_function ~(| "BinSum", [ 32; 2 ] |) ]] in + do~ M.substitute_var "sum" [] [[ M.call_function ~(| "BinSum", [ 32; 2 ] |) ]] in (* Component *) do~ M.declare_component "b2n" in - do~ M.substitute_var "b2n" [[ M.call_function ~(| "Bits2Num", [ 32 ] |) ]] in - do~ M.substitute_var "n2ba" [[ M.var (| "a" |) ]] in - do~ M.substitute_var "n2bb" [[ M.var (| "b" |) ]] in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "b2n" [] [[ M.call_function ~(| "Bits2Num", [ 32 ] |) ]] in + do~ M.substitute_var "n2ba" [Access.Component "in"] [[ M.var (| "a" |) ]] in + do~ M.substitute_var "n2bb" [Access.Component "in"] [[ M.var (| "b" |) ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 32 |) ]] ( - do~ M.substitute_var "sum" [[ M.var_access (| "n2ba", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "sum" [[ M.var_access (| "n2bb", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "sum" [Access.Component "in"; Access.Array (0); Access.Array (M.var (| "i" |))] [[ M.var_access (| "n2ba", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "sum" [Access.Component "in"; Access.Array (1); Access.Array (M.var (| "i" |))] [[ M.var_access (| "n2bb", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "i" [[ 0 ]] in + do~ M.substitute_var "i" [] [[ 0 ]] in do~ M.while [[ InfixOp.lesser ~(| M.var (| "i" |), 32 |) ]] ( - do~ M.substitute_var "b2n" [[ M.var_access (| "sum", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in - do~ M.substitute_var "i" [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in + do~ M.substitute_var "b2n" [Access.Component "in"; Access.Array (M.var (| "i" |))] [[ M.var_access (| "sum", [Access.Component "out"; Access.Array (M.var (| "i" |))] |) ]] in + do~ M.substitute_var "i" [] [[ InfixOp.add ~(| M.var (| "i" |), 1 |) ]] in M.pure BlockUnit.Tt ) in - do~ M.substitute_var "out" [[ M.var_access (| "b2n", [Access.Component "out"] |) ]] in + do~ M.substitute_var "out" [] [[ M.var_access (| "b2n", [Access.Component "out"] |) ]] in M.pure BlockUnit.Tt ). diff --git a/Garden/Garden.v b/Garden/Garden.v index d1b7455..4e07877 100644 --- a/Garden/Garden.v +++ b/Garden/Garden.v @@ -62,7 +62,7 @@ Module Primitive. | OpenScope : t unit | CloseScope : t unit | DeclareVar {A : Set} (name : string) (value : A) : t unit - | DeclareSignal (name : string) (dimensions : list F.t) : t unit + | DeclareSignal (name : string) : t unit | DeclareComponent (name : string) : t unit | SubstituteVar {A : Set} (name : string) (value : A) : t unit | GetVarAccess {A : Set} (name : string) (accesses : list Access.t) : t A @@ -176,11 +176,9 @@ Module M. Primitive (Primitive.DeclareVar name (init_value_dimensions dimensions)) (fun _ => Pure BlockUnit.Tt)). - Definition declare_signal {R : Set} (name : string) (dimensions : t (list F.t)) : - t (BlockUnit.t R) := - let_ dimensions (fun dimensions => - Primitive (Primitive.DeclareSignal name dimensions) (fun _ => - Pure BlockUnit.Tt)). + Definition declare_signal {R : Set} (name : string) : t (BlockUnit.t R) := + Primitive (Primitive.DeclareSignal name) (fun _ => + Pure BlockUnit.Tt). Definition declare_component {R : Set} (name : string) : t (BlockUnit.t R) := Primitive (Primitive.DeclareComponent name) (fun _ => @@ -565,6 +563,20 @@ Module Scopes. end. End Scopes. +Module DeclaredSignal. + (** A declared signal to appear is the current scope with other named variables *) + Inductive t : Set := + | Make. +End DeclaredSignal. + +Module SignalsNaming. + Definition t (Signals : Set) : Type := + forall (A : Set), (Signals -> A) -> string -> Prop. + + Definition unit : t unit := + fun _ _ _ => False. +End SignalsNaming. + Module GetVarAccessArrays. Inductive t {Element : Set} : forall {Container : Set}, Container -> list Access.t -> Element -> Prop := @@ -582,11 +594,11 @@ Module GetVarAccessArrays. End GetVarAccessArrays. Module Run. - Reserved Notation "{{ p , signals , scopes_in ⏩ e 🔽 output ⏩ scopes_out , P_prover , P_verifier }}". + Reserved Notation "{{ signals_naming , p , signals , scopes_in ⏩ e 🔽 output ⏩ scopes_out , P_prover , P_verifier }}". Inductive t {Signals A : Set} (* constant inputs *) - (p : Z) (signals : Signals) + (signals_naming : SignalsNaming.t Signals) (p : Z) (signals : Signals) (* outputs *) (scopes_out : Scopes.t) (output : A) : forall @@ -595,17 +607,17 @@ Module Run. (P_prover P_verifier : Prop), Prop := | Pure : - {{ p, signals, scopes_out ⏩ + {{ _, p, signals, scopes_out ⏩ M.Pure output 🔽 output ⏩ scopes_out, True, True }} | PrimitiveOpenScope (k : unit -> M.t A) (scopes_in : Scopes.t) (P_prover P_verifier : Prop) : - {{ p, signals, Scope.empty :: scopes_in ⏩ + {{ _, p, signals, Scope.empty :: scopes_in ⏩ k tt 🔽 output ⏩ scopes_out, P_prover, P_verifier }} -> - {{ p, signals, scopes_in ⏩ + {{ _, p, signals, scopes_in ⏩ M.Primitive Primitive.OpenScope k 🔽 output ⏩ scopes_out, P_prover, P_verifier }} | PrimitiveCloseScope @@ -613,20 +625,20 @@ Module Run. (scope_in : Scope.t) (scopes_in : Scopes.t) (P_prover P_verifier : Prop) : - {{ p, signals, scopes_in ⏩ + {{ _, p, signals, scopes_in ⏩ k tt 🔽 output ⏩ scopes_out, P_prover, P_verifier }} -> - {{ p, signals, scope_in :: scopes_in ⏩ + {{ _, p, signals, scope_in :: scopes_in ⏩ M.Primitive Primitive.CloseScope k 🔽 output ⏩ scopes_out, P_prover, P_verifier }} | PrimitiveGetPrime (k : Z -> M.t A) (scopes_in : Scopes.t) (P_prover P_verifier : Prop) : - {{ p, signals, scopes_in ⏩ + {{ _, p, signals, scopes_in ⏩ k p 🔽 output ⏩ scopes_out, P_prover, P_verifier }} -> - {{ p, signals, scopes_in ⏩ + {{ _, p, signals, scopes_in ⏩ M.Primitive Primitive.GetPrime k 🔽 output ⏩ scopes_out, P_prover, P_verifier }} | PrimitiveDeclareVar {B : Set} @@ -636,10 +648,10 @@ Module Run. (scope_in : Scope.t) (scopes_in : Scopes.t) (P_prover P_verifier : Prop) : - {{ p, signals, Scope.declare scope_in name value :: scopes_in ⏩ + {{ _, p, signals, Scope.declare scope_in name value :: scopes_in ⏩ k tt 🔽 output ⏩ scopes_out, P_prover, P_verifier }} -> - {{ p, signals, scope_in :: scopes_in ⏩ + {{ _, p, signals, scope_in :: scopes_in ⏩ M.Primitive (Primitive.DeclareVar name value) k 🔽 output ⏩ scopes_out, P_prover, P_verifier }} | PrimitiveSubstituteVar {B : Set} @@ -649,10 +661,10 @@ Module Run. (scopes_in scopes_inter : Scopes.t) (P_prover P_verifier : Prop) : Scopes.set scopes_in name value = inl scopes_inter -> - {{ p, signals, scopes_inter ⏩ + {{ _, p, signals, scopes_inter ⏩ k tt 🔽 output ⏩ scopes_out, P_prover, P_verifier }} -> - {{ p, signals, scopes_in ⏩ + {{ _, p, signals, scopes_in ⏩ M.Primitive (Primitive.SubstituteVar name value) k 🔽 output ⏩ scopes_out, P_prover, P_verifier }} | PrimitiveGetVarAccess {Container Element : Set} @@ -664,10 +676,39 @@ Module Run. (P_prover P_verifier : Prop) : Scopes.get scopes_in name = inl (existS Container container) -> GetVarAccessArrays.t container accesses element -> - {{ p, signals, scopes_in ⏩ + {{ _, p, signals, scopes_in ⏩ + k element 🔽 output + ⏩ scopes_out, P_prover, P_verifier }} -> + {{ _, p, signals, scopes_in ⏩ + M.Primitive (Primitive.GetVarAccess name accesses) k 🔽 output + ⏩ scopes_out, P_prover, P_verifier }} + | PrimitiveDeclareSignal + (name : string) + (k : unit -> M.t A) + (scope_in : Scope.t) + (scopes_in : Scopes.t) + (P_prover P_verifier : Prop) : + {{ _, p, signals, Scope.declare scope_in name DeclaredSignal.Make :: scopes_in ⏩ + k tt 🔽 output + ⏩ scopes_out, P_prover, P_verifier }} -> + {{ _, p, signals, scope_in :: scopes_in ⏩ + M.Primitive (Primitive.DeclareSignal name) k 🔽 output + ⏩ scopes_out, P_prover, P_verifier }} + | PrimitiveGetVarAccessSignal {Container Element : Set} + (name : string) + (accesses : list Access.t) + (k : Element -> M.t A) + (element : Element) + (projection : Signals -> Container) + (scopes_in : Scopes.t) + (P_prover P_verifier : Prop) : + Scopes.get scopes_in name = inl (existS DeclaredSignal.t DeclaredSignal.Make) -> + signals_naming _ projection name -> + GetVarAccessArrays.t (projection signals) accesses element -> + {{ _, p, signals, scopes_in ⏩ k element 🔽 output ⏩ scopes_out, P_prover, P_verifier }} -> - {{ p, signals, scopes_in ⏩ + {{ _, p, signals, scopes_in ⏩ M.Primitive (Primitive.GetVarAccess name accesses) k 🔽 output ⏩ scopes_out, P_prover, P_verifier }} | LoopNext {Out : Set} @@ -676,13 +717,13 @@ Module Run. (scopes_in scopes_inter : Scopes.t) (P_prover_first P_verifier_first : Prop) (P_prover_second P_verifier_second : Prop) : - {{ p, signals, scopes_in ⏩ + {{ _, p, signals, scopes_in ⏩ body 🔽 None ⏩ scopes_inter, P_prover_first, P_verifier_first }} -> - {{ p, signals, scopes_inter ⏩ + {{ _, p, signals, scopes_inter ⏩ M.Loop body k 🔽 output ⏩ scopes_out, P_prover_second, P_verifier_second }} -> - {{ p, signals, scopes_in ⏩ + {{ _, p, signals, scopes_in ⏩ M.Loop body k 🔽 output ⏩ scopes_out, P_prover_first /\ P_prover_second, P_verifier_first /\ P_verifier_second }} | LoopStop {Out : Set} @@ -692,13 +733,13 @@ Module Run. (scopes_in scopes_inter : Scopes.t) (P_prover_first P_verifier_first : Prop) (P_prover_second P_verifier_second : Prop) : - {{ p, signals, scopes_in ⏩ + {{ _, p, signals, scopes_in ⏩ body 🔽 Some output_inter ⏩ scopes_inter, P_prover_first, P_verifier_first }} -> - {{ p, signals, scopes_inter ⏩ + {{ _, p, signals, scopes_inter ⏩ k output_inter 🔽 output ⏩ scopes_out, P_prover_second, P_verifier_second }} -> - {{ p, signals, scopes_in ⏩ + {{ _, p, signals, scopes_in ⏩ M.Loop body k 🔽 output ⏩ scopes_out, P_prover_first /\ P_prover_second, P_verifier_first /\ P_verifier_second }} | Let {B : Set} @@ -708,13 +749,13 @@ Module Run. (scopes_in scopes_inter : Scopes.t) (P_prover_first P_verifier_first : Prop) (P_prover_second P_verifier_second : Prop) : - {{ p, signals, scopes_in ⏩ + {{ _, p, signals, scopes_in ⏩ e 🔽 output_inter ⏩ scopes_inter, P_prover_first, P_verifier_first }} -> - {{ p, signals, scopes_inter ⏩ + {{ _, p, signals, scopes_inter ⏩ k output_inter 🔽 output ⏩ scopes_out, P_prover_second, P_verifier_second }} -> - {{ p, signals, scopes_in ⏩ + {{ _, p, signals, scopes_in ⏩ M.Let e k 🔽 output ⏩ scopes_out, P_prover_first /\ P_prover_second, P_verifier_first /\ P_verifier_second }} | Call {B : Set} @@ -723,13 +764,13 @@ Module Run. (output_inter : B) (scopes_in : Scopes.t) (P_prover P_verifier : Prop) : - {{ p, tt, Scopes.empty ⏩ + {{ SignalsNaming.unit, p, tt, Scopes.empty ⏩ e 🔽 output_inter ⏩ Scopes.empty, True, True }} -> - {{ p, signals, scopes_in ⏩ + {{ _, p, signals, scopes_in ⏩ k output_inter 🔽 output ⏩ scopes_out, P_prover, P_verifier }} -> - {{ p, signals, scopes_in ⏩ + {{ _, p, signals, scopes_in ⏩ M.Call e k 🔽 output ⏩ scopes_out, P_prover, P_verifier }} | Equiv @@ -737,21 +778,21 @@ Module Run. (e : M.t A) (P_prover P_verifier : Prop) (P_prover' P_verifier' : Prop) : - {{ p, signals, scopes_in ⏩ + {{ _, p, signals, scopes_in ⏩ e 🔽 output ⏩ scopes_out, P_prover, P_verifier }} -> (P_prover <-> P_prover') -> (P_verifier <-> P_verifier') -> - {{ p, signals, scopes_in ⏩ + {{ _, p, signals, scopes_in ⏩ e 🔽 output ⏩ scopes_out, P_prover', P_verifier' }} - where "{{ p , signals , scopes_in ⏩ e 🔽 output ⏩ scopes_out , P_prover , P_verifier }}" := - (t p signals scopes_out output scopes_in e P_prover P_verifier). + where "{{ signals_naming , p , signals , scopes_in ⏩ e 🔽 output ⏩ scopes_out , P_prover , P_verifier }}" := + (t signals_naming p signals scopes_out output scopes_in e P_prover P_verifier). (** We had to split the [Loop] primitive into both [LoopNext] and [LoopStop] to avoid a "non-strictly positive" error *) - Lemma Loop {Signals A Out : Set} (p : Z) + Lemma Loop {Signals A Out : Set} (signals_naming : SignalsNaming.t Signals) (p : Z) (body : M.t (option Out)) (k : Out -> M.t A) (output : A) @@ -760,20 +801,20 @@ Module Run. (signals : Signals) (P_prover_first P_verifier_first : Prop) (P_prover_second P_verifier_second : Prop) : - {{ p, signals, scopes_in ⏩ + {{ signals_naming, p, signals, scopes_in ⏩ body 🔽 output_inter ⏩ scopes_inter, P_prover_first, P_verifier_first }} -> match output_inter with | None => - {{ p, signals, scopes_inter ⏩ + {{ signals_naming, p, signals, scopes_inter ⏩ M.Loop body k 🔽 output ⏩ scopes_out, P_prover_second, P_verifier_second }} | Some output_inter => - {{ p, signals, scopes_inter ⏩ + {{ signals_naming, p, signals, scopes_inter ⏩ k output_inter 🔽 output ⏩ scopes_out, P_prover_second, P_verifier_second }} end -> - {{ p, signals, scopes_in ⏩ + {{ signals_naming, p, signals, scopes_in ⏩ M.Loop body k 🔽 output ⏩ scopes_out, P_prover_first /\ P_prover_second, P_verifier_first /\ P_verifier_second }}. Proof. @@ -792,7 +833,10 @@ Ltac run_deterministic := apply Run.PrimitiveCloseScope || apply Run.PrimitiveDeclareVar || (eapply Run.PrimitiveSubstituteVar; try reflexivity) || - (eapply Run.PrimitiveGetVarAccess; try now repeat constructor) || + (eapply Run.PrimitiveGetVarAccess; [reflexivity | now repeat constructor |]) || + eapply Run.PrimitiveDeclareSignal || + (eapply Run.PrimitiveGetVarAccessSignal; + [reflexivity | now constructor | now repeat econstructor |]) || eapply Run.PrimitiveGetPrime || eapply Run.Loop || eapply Run.Let || diff --git a/scripts/coq_of_circom.py b/scripts/coq_of_circom.py index d2c4f48..4500b5d 100644 --- a/scripts/coq_of_circom.py +++ b/scripts/coq_of_circom.py @@ -6,7 +6,10 @@ from typing import Any, Tuple def indent(text: str) -> str: - return "\n".join(" " + line for line in text.split("\n")) + return "\n".join( + " " + line if line.strip() != "" else "" + for line in text.split("\n") + ) def escape_coq_name(name: str) -> str: reserved_names = [ @@ -353,7 +356,7 @@ def to_coq_statement(node) -> str: elif xtype == "AnonymousComponent": declare_function = "M.declare_anonymous_component" elif "Signal" in xtype: - declare_function = "M.declare_signal" + return "do~ M.declare_signal \"" + declaration["name"] + "\" in" elif xtype == "Bus": declare_function = "M.declare_bus" else: @@ -368,6 +371,7 @@ def to_coq_statement(node) -> str: substitution = node["Substitution"] return \ "do~ M.substitute_var \"" + substitution["var"] + "\" " + \ + "[" + "; ".join(to_coq_access(access) for access in substitution["access"]) + "] " + \ "[[ " + to_coq_expression(substitution["rhe"]) + " ]] in" if "MultSubstitution" in node: mult_substitution = node["MultSubstitution"] @@ -488,7 +492,18 @@ def to_coq_definition(node) -> str: for signal in signals ) ) + "\n" + - "}." + "}." + "\n" + + "\n" + + "Module IsNamed.\n" + \ + indent( + "Inductive P : forall (A : Set), (t -> A) -> string -> Prop :=\n" + \ + "\n".join( + "| " + escape_coq_name(signal[0]) + " : P _ " + + escape_coq_name(signal[0]) + " \"" + signal[0] + "\"" + for signal in signals + ) + "." + ) + "\n" + + "End IsNamed." ) + "\n" + \ "End " + template["name"] + "Signals.\n" + \ "\n" + \