123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277(*****************************************************************************)(* *)(* MIT License *)(* Copyright (c) 2022 Nomadic Labs <contact@nomadic-labs.com> *)(* *)(* Permission is hereby granted, free of charge, to any person obtaining a *)(* copy of this software and associated documentation files (the "Software"),*)(* to deal in the Software without restriction, including without limitation *)(* the rights to use, copy, modify, merge, publish, distribute, sublicense, *)(* and/or sell copies of the Software, and to permit persons to whom the *)(* Software is furnished to do so, subject to the following conditions: *)(* *)(* The above copyright notice and this permission notice shall be included *)(* in all copies or substantial portions of the Software. *)(* *)(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*)(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *)(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *)(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*)(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *)(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *)(* DEALINGS IN THE SOFTWARE. *)(* *)(*****************************************************************************)moduleS=Csir.ScalarmoduletypeNUM=sigtypescalartype'areprtype'atvalcustom:?qc:S.t->?ql:S.t->?qr:S.t->?qo:S.t->?qm:S.t->?qx2b:S.t->?qx5a:S.t->scalarrepr->scalarrepr->scalarreprtvalassert_custom:?qc:S.t->?ql:S.t->?qr:S.t->?qo:S.t->?qm:S.t->scalarrepr->scalarrepr->scalarrepr->unitreprtvaladd:?qc:S.t->?ql:S.t->?qr:S.t->scalarrepr->scalarrepr->scalarreprtvaladd_constant:?ql:S.t->S.t->scalarrepr->scalarreprtvalmul:?qm:S.t->scalarrepr->scalarrepr->scalarreprtvaldiv:?den_coeff:S.t->scalarrepr->scalarrepr->scalarreprtvalpow5:scalarrepr->scalarreprtvalis_zero:scalarrepr->boolreprtvalis_not_zero:scalarrepr->boolreprtvalassert_nonzero:scalarrepr->unitreprtvalassert_bool:scalarrepr->unitreprtendmoduletypeBOOL=sigtypescalartype'areprtype'atvalband:boolrepr->boolrepr->boolreprtvalxor:boolrepr->boolrepr->boolreprtvalbor:boolrepr->boolrepr->boolreprtvalbor_lookup:boolrepr->boolrepr->boolreprtvalbnot:boolrepr->boolreprtvalifthenelse:boolrepr->'arepr->'arepr->'areprtvalswap:boolrepr->'arepr->'arepr->('a*'a)reprtvalassert_true:boolrepr->unitreprtvalassert_false:boolrepr->unitreprtvalconstant_bool:bool->boolreprtvalband_list:boolreprlist->boolreprtendmoduletypeCOMMON=sigtypescalartypeinput_kind=[`InputCom|`Public|`Private]typetrace_kind=[input_kind|`NoInput]type'areprtype'atvalret:'a->'atval(let*):'at->('a->'bt)->'btval(>*):unitreprt->'at->'at(* Add a boolean check *)valwith_bool_check:boolreprt->unitreprt(* Retrieve the boolean representing the conjunction of all previous implicit
checks.
WARNING: This will "reset" the implicit check accumulator.
*)valget_checks_wire:boolreprtmoduleInput:sigtype'ainputvalscalar:S.t->scalarinputvalto_scalar:scalarinput->S.tvalbool:bool->boolinputvalto_bool:boolinput->boolvalunit:unitinputvalpair:'ainput->'binput->('a*'b)inputvalto_pair:('a*'b)input->'ainput*'binputvallist:'ainputlist->'alistinputvalto_list:'alistinput->'ainputlistvalwith_implicit_bool_check:('arepr->boolreprt)->'ainput->'ainputvalwith_assertion:('arepr->unitreprt)->'ainput->'ainputtype'at='ainputendtype'bopen_input_comvalserialize:'aInput.t->S.tarrayvalinput:?kind:input_kind->'aInput.t->'areprtvalnew_input_com:unitreprtvalbegin_input_com:'b->'bopen_input_comval(|:):('crepr->'d)open_input_com->'cInput.t->'dopen_input_comvalend_input_com:'aopen_input_com->'atvaleq:'arepr->'arepr->boolvalfoldM:('a->'b->'at)->'a->'blist->'atvalpair:'arepr->'brepr->('a*'b)reprvalof_pair:('a*'b)repr->'arepr*'breprvalto_list:'areprlist->'alistreprvalof_list:'alistrepr->'areprlistvalunit:unitreprvalscalar_of_bool:boolrepr->scalarreprvalunsafe_bool_of_scalar:scalarrepr->boolreprvalassert_equal:'arepr->'arepr->unitreprtvalequal:'arepr->'arepr->boolreprtvalconstant_scalar:S.t->scalarreprt(** Returns a list of Boolean variables representing the little endian
bit decomposition of the given scalar (with the least significant bit
on the head). *)valbits_of_scalar:?shift:Z.t->nb_bits:int->scalarrepr->boollistreprtvalwith_label:label:string->'at->'atmoduleNum:NUMwithtypescalar=scalarandtype'arepr='areprandtype'at='atmoduleBool:BOOLwithtypescalar=scalarandtype'arepr='areprandtype'at='atmoduleEcc:sigvalweierstrass_add:(scalar*scalar)repr->(scalar*scalar)repr->(scalar*scalar)reprtvaledwards_add:(scalar*scalar)repr->(scalar*scalar)repr->(scalar*scalar)reprtvaledwards_cond_add:(scalar*scalar)repr->(scalar*scalar)repr->boolrepr->(scalar*scalar)reprtendmodulePoseidon:sigvalposeidon128_full_round:matrix:S.tarrayarray->k:S.tarray->variant:Variants.t->scalarrepr*scalarrepr*scalarrepr->scalarlistreprtvalposeidon128_four_partial_rounds:matrix:S.tarrayarray->ks:S.tarrayarray->variant:Variants.t->scalarrepr*scalarrepr*scalarrepr->scalarlistreprtendmoduleAnemoi:sigvalanemoi_round:kx:S.t->ky:S.t->scalarrepr*scalarrepr->(scalar*scalar)reprtvalanemoi_double_round:kx1:S.t->ky1:S.t->kx2:S.t->ky2:S.t->scalarrepr*scalarrepr->(scalar*scalar)reprtvalanemoi_custom:kx1:S.t->ky1:S.t->kx2:S.t->ky2:S.t->scalarrepr*scalarrepr->(scalar*scalar)reprtendvalhd:'alistrepr->'areprtend