1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003(******************************************************************************)(* ASLRef *)(******************************************************************************)(*
* SPDX-FileCopyrightText: Copyright 2022-2023 Arm Limited and/or its affiliates <open-source-office@arm.com>
* SPDX-License-Identifier: BSD-3-Clause
*)(******************************************************************************)(* Disclaimer: *)(* This material covers both ASLv0 (viz, the existing ASL pseudocode language *)(* which appears in the Arm Architecture Reference Manual) and ASLv1, a new, *)(* experimental, and as yet unreleased version of ASL. *)(* This material is work in progress, more precisely at pre-Alpha quality as *)(* per Arm’s quality standards. *)(* In particular, this means that it would be premature to base any *)(* production tool development on this material. *)(* However, any feedback, question, query and feature request would be most *)(* welcome; those can be sent to Arm’s Architecture Formal Team Lead *)(* Jade Alglave <jade.alglave@arm.com>, or by raising issues or PRs to the *)(* herdtools7 github repository. *)(******************************************************************************)(** Provide some instrumentation backends for {!Interpreter} and {!Typing}. *)moduleSemanticsRule=structtypet=|ELit|Call|ATC|EExprList|EExprListM|ESideEffectFreeExpr|EVar|Binop|BinopAnd|BinopOr|BinopImpl|Unop|ECondSimple|ECond|ESlice|ECall|EGetArray|EGetEnumArray|ESliceError|ERecord|EGetBitField|EGetBitFields|EGetTupleItem|EConcat|ETuple|EArray|EEnumArray|EArbitrary|EPattern|LEDiscard|LEVar|LEMultiAssign|LEUndefIdentV0|LEUndefIdentV1|LESlice|LESetArray|LESetEnumArray|LESetField|LESetFields|LEDestructuring|Slices|Slice|PAll|PAny|PGeq|PLeq|PNot|PRange|PSingle|PMask|PTuple|LDDiscard|LDVar|LDTuple|SPass|SAssignCall|SAssign|SReturn|SSeq|SCall|SCond|SCase|SAssert|SWhile|SRepeat|SFor|SThrow|STry|SDecl|SPrint|FUndefIdent|FPrimitive|FBadArity|FCall|Block|Loop|For|Catch|CatchNamed|CatchOtherwise|CatchNone|CatchNoThrow|Spec|FindCatcher|RethrowImplicit|ReadValueFrom|BuildGlobalEnv|IsConstraintSat|AssignArgsletto_string:t->string=function|ELit->"ELit"|Call->"Call"|ATC->"CTC"|EExprList->"EExprList"|EExprListM->"EExprListM"|ESideEffectFreeExpr->"ESideEffectFreeExpr"|EVar->"EVar"|Binop->"Binop"|BinopAnd->"BinopAnd"|BinopOr->"BinopOr"|BinopImpl->"BinopImpl"|Unop->"Unop"|ECond->"ECond"|ESlice->"ESlice"|ECall->"ECall"|ERecord->"ERecord"|EGetBitField->"EGetBitField"|EGetBitFields->"EGetBitFields"|EGetTupleItem->"EGetTupleItem"|EConcat->"EConcat"|ETuple->"ETuple"|EArray->"EArray"|EEnumArray->"EEnumArray"|ECondSimple->"ECondSimple"|EGetArray->"EGetArray"|EGetEnumArray->"EGetEnumArray"|ESliceError->"ESliceError"|EArbitrary->"EArbitrary"|EPattern->"EPattern"|LEDiscard->"LEDiscard"|LEVar->"LEVar"|LEMultiAssign->"LEMultiAssign"|LESlice->"LESlice"|LESetArray->"LESetArray"|LESetEnumArray->"LESetEnumArray"|LESetField->"LESetField"|LESetFields->"LESetFields"|LEDestructuring->"LEDestructuring"|LEUndefIdentV0->"LEUndefIdentV0"|LEUndefIdentV1->"LEUndefIdentV1"|Slices->"Slices"|Slice->"Slice"|PAll->"PAll"|PAny->"PAny"|PGeq->"PGeq"|PLeq->"PLeq"|PNot->"PNot"|PRange->"PRange"|PSingle->"PSingle"|PMask->"PMask"|PTuple->"PTuple"|LDDiscard->"LDDiscard"|LDVar->"LDVar"|LDTuple->"LDTuple"|SPass->"SPass"|SAssignCall->"SAssignCall"|SAssign->"SAssign"|SReturn->"SReturn"|SSeq->"SThen"|SCall->"SCall"|SCond->"SCond"|SCase->"SCase"|SAssert->"SAssert"|SWhile->"SWhile"|SRepeat->"SRepeat"|SFor->"SFor"|SThrow->"SThrow"|STry->"STry"|SDecl->"SDecl"|SPrint->"SPrint"|FUndefIdent->"FUndefIdent"|FPrimitive->"FPrimitive"|FBadArity->"FBadArity"|FCall->"FCall"|Block->"Block"|Loop->"Loop"|For->"For"|Catch->"Catch"|CatchNamed->"CatchNamed"|CatchOtherwise->"CatchOtherwise"|CatchNone->"CatchNone"|CatchNoThrow->"CatchNoThrow"|Spec->"Spec"|FindCatcher->"FindCatcher"|RethrowImplicit->"RethrowImplicit"|ReadValueFrom->"ReadValueFrom"|BuildGlobalEnv->"BuildGlobalEnv"|IsConstraintSat->"IsConstraintSat"|AssignArgs->"AssignArgs"letppfr=to_stringr|>Format.pp_print_stringfletall=[ELit;Call;ATC;EExprList;EExprListM;ESideEffectFreeExpr;EVar;Binop;BinopAnd;BinopOr;BinopImpl;Unop;ECondSimple;ECond;ESlice;ECall;EGetArray;EGetEnumArray;ESliceError;ERecord;EGetBitField;EGetBitFields;EGetTupleItem;EConcat;ETuple;EArray;EEnumArray;EArbitrary;EPattern;LEDiscard;LEVar;LEMultiAssign;LEUndefIdentV0;LEUndefIdentV1;LESlice;LESetArray;LESetEnumArray;LESetField;LESetFields;LEDestructuring;Slices;Slice;PAll;PAny;PGeq;PLeq;PNot;PRange;PSingle;PMask;PTuple;LDDiscard;LDVar;LDTuple;SPass;SAssignCall;SAssign;SReturn;SSeq;SCall;SCond;SCase;SAssert;SWhile;SRepeat;SFor;SThrow;STry;SDecl;SPrint;FUndefIdent;FPrimitive;FBadArity;FCall;Block;Loop;For;Catch;CatchNamed;CatchOtherwise;CatchNone;CatchNoThrow;Spec;FindCatcher;RethrowImplicit;ReadValueFrom;BuildGlobalEnv;IsConstraintSat;AssignArgs;]letall_nb=List.lengthallletindex=lettbl:(t,int)Hashtbl.t=Hashtbl.createall_nbinlet()=List.iteri(funir->Hashtbl.addtblri)allinHashtbl.findtblletof_string=lettbl:(string,t)Hashtbl.t=Hashtbl.createall_nbinlet()=List.iter(funr->Hashtbl.addtbl(to_stringr|>String.lowercase_ascii)r)allinfuns->Hashtbl.findtbl(String.lowercase_asciis)endtypesemantics_rule=SemanticsRule.tmoduleSemanticsCmp:Set.OrderedTypewithtypet=semantics_rule=structtypet=semantics_ruleletcompare=compareendmoduleTypingRule=structtypet=|BuiltinSingularType|BuiltinAggregateType|BuiltinSingularOrAggregate|NamedType|AnonymousType|SingularType|AggregateType|NonPrimitiveType|PrimitiveType|Structure|Canonical|Domain|Subtype|StructuralSubtypeSatisfaction|DomainSubtypeSatisfaction|SubtypeSatisfaction|TypeSatisfaction|TypeClash|LowestCommonAncestor|ApplyUnopType|ApplyBinopTypes|ELit|ATC|EVar|Binop|Unop|ECondSimple|ECond|ESlice|ECall|ESetter|EGetArray|ESliceError|ERecord|EGetRecordField|EGetBitField|EGetBadField|EGetBadBitField|EGetBadRecordField|EGetBitFieldNested|EGetBitFieldTyped|EGetTupleItem|EGetFields|EConcat|ETuple|EArbitrary|EPattern|LEDiscard|LEVar|LEUndefIdentV0|LEUndefIdentV1|LEDestructuring|LESlice|LESetArray|LESetStructuredField|LESetBadBitField|LESetBitField|LESetBadField|LESetFields|LEConcat|Slice|PAll|PAny|PGeq|PLeq|PNot|PRange|PSingle|PMask|PTuple|LDDiscard|LDVar|LDTuple|LDUninitialisedVar|LDUninitialisedTyped|SPass|SAssignCall|SAssign|SReturn|SSeq|SCall|SCond|SCase|SAssert|SWhile|SRepeat|SFor|SThrow|STry|SDecl|SPrint|SPragma|FUndefIdent|FPrimitive|FBadArity|FindCheckDeduce|AnnotateCall|AnnotateCallArgTyped|Block|Loop|For|Catcher|Subprogram|DeclareOneFunc|DeclareGlobalStorage|DeclareTypeDecl|Specification|TString|TReal|TBool|TNamed|TInt|TBits|TTuple|TArray|TEnumDecl|TStructuredDecl|TNonDecl|TBitField|TBitFields|ReduceSlicesToCall|TypeOfArrayLength|TypecheckDecl|CheckGlobalPragma|AnnotateAndDeclareFunc|AnnotateFuncSig|CheckSetterHasGetter|AddNewFunc|SubprogramForName|HasArgClash|GetUndeclaredDefining|AnnotateOneParam|AnnotateParams|ArgsAsParams|AnnotateArgs|StaticEval|ReduceConstants|Normalize|RenameTyEqs|TypeCheckMutuallyRec|DeclareSubprograms|AnnotateLimitExpr|CheckATC|CheckSlicesInWidth|DisjointSlicesToPositions|BitfieldSliceToPositions|CheckPositionsInWidth|ShouldReduceToCall|IsSymbolicallyEvaluable|CheckSymbolicallyEvaluable|ShouldRememberImmutableExpression|AddImmutableExpression|SymIntSetSubset|SymDomIsSubset|ApproxConstraint|ApproxConstraints|LEBitSlice|AddLocalImmutableExpr|AddGlobalImmutableExpr|DeclareConst|AddGlobalStorage|LookupConstant|TypeOf|LookupImmutableExpr|WithEmptyLocal|IsGlobalUndefined|IsLocalUndefined|IsUndefined|IsSubprogram|CheckVarNotInEnv|CheckVarNotInGEnv|CheckDisjointSlices|ControlFlowFromStmt|AnnotateConstraintBinop|ConstraintBinop|ConstraintMod|ConstraintPow|ApplyBinopExtremities|PossibleExtremitiesLeft|PossibleExtremitiesRight|ControlFlowSeq|ControlFlowJoin|CheckCommonBitfieldsAlign|AnnotateFieldInit|AnnotateGetArray|AnnotateSetArray|GetBitvectorWidth|GetBitvectorConstWidthletto_string:t->string=function|BuiltinSingularType->"BuiltinSingularType"|BuiltinAggregateType->"BuiltinAggregateType"|BuiltinSingularOrAggregate->"BuiltinSingularOrAggregate"|NamedType->"NamedType"|AnonymousType->"AnonymousType"|SingularType->"SingularType"|AggregateType->"AggregateType"|NonPrimitiveType->"NonPrimitiveType"|PrimitiveType->"PrimitiveType"|Canonical->"Canonical"|Domain->"Domain"|Structure->"Structure"|Subtype->"Subtype"|StructuralSubtypeSatisfaction->"StructuralSubtypeSatisfaction"|DomainSubtypeSatisfaction->"DomainSubtypeSatisfaction"|SubtypeSatisfaction->"SubtypeSatisfaction"|TypeSatisfaction->"TypeSatisfaction"|TypeClash->"TypeClash"|ApplyUnopType->"ApplyUnopType"|ApplyBinopTypes->"ApplyBinopTypes"|LowestCommonAncestor->"LowestCommonAncestor"|ELit->"ELit"|ATC->"ATC"|EVar->"EVar"|Binop->"Binop"|Unop->"Unop"|ECond->"ECond"|ESlice->"ESlice"|ECall->"ECall"|ESetter->"ESetter"|ERecord->"ERecord"|EGetRecordField->"EGetRecordField"|EGetBitField->"EGetBitField"|EGetBadField->"EGetBadField"|EGetBadBitField->"EGetBadBitField"|EGetBadRecordField->"EGetBadRecordField"|EGetBitFieldNested->"EGetBitFieldNested"|EGetBitFieldTyped->"EGetBitFieldTyped"|EGetTupleItem->"EGetTupleItem"|EGetFields->"EGetFields"|EConcat->"EConcat"|ETuple->"ETuple"|ECondSimple->"ECondSimple"|EGetArray->"EGetArray"|ESliceError->"ESliceError"|EArbitrary->"EArbitrary"|EPattern->"EPattern"|LEDiscard->"LEDiscard"|LEVar->"LEVar"|LESlice->"LESlice"|LESetArray->"LESetArray"|LESetStructuredField->"LESetStructuredField"|LESetBadBitField->"LESetBadBitField"|LESetBitField->"LESetBitField"|LESetBadField->"LESetBadField"|LESetFields->"LESetFields"|LEConcat->"LEConcat"|LEDestructuring->"LEDestructuring"|LEUndefIdentV0->"LEUndefIdentV0"|LEUndefIdentV1->"LEUndefIdentV1"|Slice->"Slice"|PAll->"PAll"|PAny->"PAny"|PGeq->"PGeq"|PLeq->"PLeq"|PNot->"PNot"|PRange->"PRange"|PSingle->"PSingle"|PMask->"PMask"|PTuple->"PTuple"|LDDiscard->"LDDiscardNone"|LDVar->"LDVar"|LDUninitialisedVar->"LDUninitialisedVar"|LDUninitialisedTyped->"LDUninitialisedTyped"|LDTuple->"LDTuple"|SPass->"SPass"|SAssignCall->"SAssignCall"|SAssign->"SAssign"|SReturn->"SReturn"|SSeq->"SThen"|SCall->"SCall"|SCond->"SCond"|SCase->"SCase"|SAssert->"SAssert"|SWhile->"SWhile"|SRepeat->"SRepeat"|SFor->"SFor"|SThrow->"SThrow"|STry->"STry"|SDecl->"SDecl"|SPrint->"SPrint"|SPragma->"SPragma"|FUndefIdent->"FUndefIdent"|FPrimitive->"FPrimitive"|FBadArity->"FBadArity"|FindCheckDeduce->"FindCheckDeduce"|AnnotateCall->"AnnotateCall"|AnnotateCallArgTyped->"AnnotateCallArgTyped"|Block->"Block"|Loop->"Loop"|For->"For"|Catcher->"Catcher"|Subprogram->"Subprogram"|DeclareOneFunc->"DeclareOneFunc"|DeclareGlobalStorage->"DeclareGlobalStorage"|DeclareTypeDecl->"DeclareTypeDecl"|Specification->"Specification"|TString->"TString"|TReal->"TReal"|TBool->"TBool"|TNamed->"TNamed"|TInt->"TInt"|TBits->"TBits"|TTuple->"TTuple"|TArray->"TArray"|TEnumDecl->"TEnumDecl"|TStructuredDecl->"TStructuredDecl"|TNonDecl->"TNonDecl"|TBitField->"TBitField"|TBitFields->"TBitFields"|ReduceSlicesToCall->"ReduceSlicesToCall"|TypeOfArrayLength->"TypeOfArrayLength"|TypecheckDecl->"TypecheckDecl"|CheckGlobalPragma->"CheckGlobalPragmas"|AnnotateAndDeclareFunc->"AnnotateAndDeclareFunc"|AnnotateFuncSig->"AnnotateFuncSig"|CheckSetterHasGetter->"CheckSetterHasGetter"|AddNewFunc->"AddNewFunc"|SubprogramForName->"SubprogramForName"|HasArgClash->"HasArgClash"|GetUndeclaredDefining->"GetUndeclaredDefining"|AnnotateOneParam->"AnnotateOneParam"|AnnotateParams->"AnnotateParams"|ArgsAsParams->"ArgsAsParams"|AnnotateArgs->"AnnotateArgs"|StaticEval->"StaticEval"|ReduceConstants->"ReduceConstants"|Normalize->"Normalize"|RenameTyEqs->"RenameTyEqs"|TypeCheckMutuallyRec->"TypeCheckMutuallyRec"|DeclareSubprograms->"DeclareSubprograms"|AnnotateLimitExpr->"AnnotateLimitExpr"|CheckATC->"CheckATC"|CheckSlicesInWidth->"CheckSlicesInWidth"|DisjointSlicesToPositions->"DisjointSlicesToPositions"|BitfieldSliceToPositions->"BitfieldSliceToPositions"|CheckPositionsInWidth->"CheckPositionsInWidth"|ShouldReduceToCall->"ShouldReduceToCall"|IsSymbolicallyEvaluable->"IsSymbolicallyEvaluable"|CheckSymbolicallyEvaluable->"CheckSymbolicallyEvaluable"|ShouldRememberImmutableExpression->"ShouldRememberImmutableExpression"|AddImmutableExpression->"AddImmutableExpression"|SymIntSetSubset->"SymIntSetSubset"|SymDomIsSubset->"SymDomIsSubset"|ApproxConstraint->"ApproxConstraint"|ApproxConstraints->"ApproxConstraints"|LEBitSlice->"LEBitSlice"|AddLocalImmutableExpr->"AddLocalImmutableExpr"|AddGlobalImmutableExpr->"AddLocalImmutableExpr"|DeclareConst->"DeclareConst"|AddGlobalStorage->"AddGlobalStorage"|LookupConstant->"LookupConstant"|TypeOf->"TypeOf"|LookupImmutableExpr->"LookupImmutableExpr"|WithEmptyLocal->"WithEmptyLocal"|IsGlobalUndefined->"IsGlobalUndefined"|IsLocalUndefined->"IsLocalUndefined"|IsUndefined->"IsUndefined"|IsSubprogram->"IsSubprogram"|CheckVarNotInEnv->"CheckVarNotInEnv"|CheckVarNotInGEnv->"CheckVarNotInGEnv"|CheckDisjointSlices->"CheckDisjointSlices"|ControlFlowFromStmt->"ControlFlowFromStmt"|AnnotateConstraintBinop->"AnnotateConstraintBinop"|ConstraintBinop->"ConstraintBinop"|ConstraintMod->"ConstraintMod"|ConstraintPow->"ConstraintPow"|ApplyBinopExtremities->"ApplyBinopExtremities"|PossibleExtremitiesLeft->"PossibleExtremitiesLeft"|PossibleExtremitiesRight->"PossibleExtremitiesRight"|ControlFlowSeq->"ControlFlowSeq"|ControlFlowJoin->"ControlFlowJoin"|CheckCommonBitfieldsAlign->"CheckCommonBitfieldsAlign"|AnnotateFieldInit->"AnnotateFieldInit"|AnnotateGetArray->"AnnotateGetArray"|AnnotateSetArray->"AnnotateSetArray"|GetBitvectorWidth->"GetBitvectorWidth"|GetBitvectorConstWidth->"GetBitvectorConstWidth"letppfr=to_stringr|>Format.pp_print_stringfletall=[BuiltinSingularType;BuiltinAggregateType;BuiltinSingularOrAggregate;SingularType;AggregateType;NamedType;AnonymousType;NonPrimitiveType;PrimitiveType;Canonical;Domain;Structure;Subtype;DomainSubtypeSatisfaction;StructuralSubtypeSatisfaction;SubtypeSatisfaction;TypeSatisfaction;TypeClash;ApplyUnopType;ApplyBinopTypes;LowestCommonAncestor;ELit;ATC;EVar;Binop;Unop;ECond;ESlice;ECall;ESetter;ERecord;EGetRecordField;EGetBadField;EGetBadBitField;EGetBadRecordField;EGetBitField;EGetBitFieldNested;EGetBitFieldTyped;EGetTupleItem;EGetFields;EArbitrary;EPattern;EGetArray;ESliceError;ECondSimple;EConcat;ETuple;LEDiscard;LEVar;LESlice;LESetArray;LESetStructuredField;LESetBadBitField;LESetBitField;LESetBadField;LESetFields;LESetFields;LEDestructuring;LEConcat;Slice;SPass;SAssignCall;SAssign;SReturn;SSeq;SCall;SCond;SCase;SAssert;SWhile;SRepeat;SFor;SThrow;STry;SDecl;SPrint;SPragma;FUndefIdent;FPrimitive;FBadArity;FindCheckDeduce;AnnotateCall;AnnotateCallArgTyped;Block;Loop;For;Catcher;Subprogram;TString;TReal;TBool;TNamed;TInt;TBits;TTuple;TArray;TEnumDecl;TStructuredDecl;TNonDecl;TBitField;TBitFields;ReduceSlicesToCall;TypeOfArrayLength;TypecheckDecl;CheckGlobalPragma;AnnotateAndDeclareFunc;AnnotateFuncSig;CheckSetterHasGetter;AddNewFunc;SubprogramForName;HasArgClash;GetUndeclaredDefining;AnnotateOneParam;AnnotateParams;ArgsAsParams;AnnotateArgs;StaticEval;ReduceConstants;Normalize;RenameTyEqs;TypeCheckMutuallyRec;DeclareSubprograms;AnnotateLimitExpr;CheckATC;CheckSlicesInWidth;DisjointSlicesToPositions;BitfieldSliceToPositions;CheckPositionsInWidth;ShouldReduceToCall;IsSymbolicallyEvaluable;CheckSymbolicallyEvaluable;ShouldRememberImmutableExpression;AddImmutableExpression;SymIntSetSubset;SymDomIsSubset;ApproxConstraint;ApproxConstraints;LEBitSlice;AddLocalImmutableExpr;AddGlobalImmutableExpr;DeclareConst;AddGlobalStorage;LookupConstant;TypeOf;LookupImmutableExpr;WithEmptyLocal;IsGlobalUndefined;IsLocalUndefined;IsUndefined;IsSubprogram;CheckVarNotInEnv;CheckVarNotInGEnv;CheckDisjointSlices;BitfieldSliceToPositions;ControlFlowFromStmt;AnnotateConstraintBinop;ConstraintBinop;ConstraintPow;ApplyBinopExtremities;PossibleExtremitiesLeft;PossibleExtremitiesRight;ControlFlowSeq;ControlFlowJoin;CheckCommonBitfieldsAlign;AnnotateFieldInit;AnnotateGetArray;AnnotateSetArray;GetBitvectorWidth;GetBitvectorConstWidth;]letall_nb=List.lengthallletindex=lettbl:(t,int)Hashtbl.t=Hashtbl.createall_nbinlet()=List.iteri(funir->Hashtbl.addtblri)allinHashtbl.findtblletof_string=lettbl:(string,t)Hashtbl.t=Hashtbl.createall_nbinlet()=List.iter(funr->Hashtbl.addtbl(to_stringr|>String.lowercase_ascii)r)allinfuns->Hashtbl.findtbl(String.lowercase_asciis)endtypetyping_rule=TypingRule.tmoduleTypingCmp:Set.OrderedTypewithtypet=typing_rule=structtypet=typing_ruleletcompare=compareendmoduleSemanticsSet=Set.Make(SemanticsCmp)moduleTypingSet=Set.Make(TypingCmp)moduleSemanticsMap=Map.Make(SemanticsCmp)moduleTypingsMap=Map.Make(TypingCmp)moduletypeSEMINSTR=sigvaluse:semantics_rule->unitvaluse_with:'a->semantics_rule->'aendmoduletypeTYPINSTR=sigvaluse:typing_rule->unitvaluse_with:'a->typing_rule->'aendmoduletypeSEMBUFFER=sigvalpush:semantics_rule->unitvalreset:unit->unitvalget:unit->semantics_rulelistendmoduletypeTYPBUFFER=sigvalpush:typing_rule->unitvalreset:unit->unitvalget:unit->typing_rulelistendmoduleSemMake(Buffer:SEMBUFFER):SEMINSTR=structletuse=Buffer.pushletuse_with(x:'a)r:'a=Buffer.pushr;xendmoduleTypMake(Buffer:TYPBUFFER):TYPINSTR=structletuse=Buffer.pushletuse_with(x:'a)r:'a=Buffer.pushr;xendmoduleSemanticsNoBuffer:SEMBUFFER=structletpush=Fun.const()letreset()=()letget()=[]endmoduleTypingNoBuffer:TYPBUFFER=structletpush=Fun.const()letreset()=()letget()=[]endmoduleSemanticsSingleBuffer:SEMBUFFER=structlet_buffer:semantics_rulelistref=ref[]letreset()=_buffer:=[]letget()=!_bufferletpushr=_buffer:=r::!_bufferendmoduleTypingSingleBuffer:TYPBUFFER=structlet_buffer:typing_rulelistref=ref[]letreset()=_buffer:=[]letget()=!_bufferletpushr=_buffer:=r::!_bufferendmoduleSemanticsSingleSetBuffer:SEMBUFFER=structlet_semantics_buffer:(semantics_rule,unit)Hashtbl.t=Hashtbl.createSemanticsRule.all_nbletpushr=Hashtbl.replace_semantics_bufferr()letreset()=Hashtbl.clear_semantics_bufferletget()=Hashtbl.to_seq_keys_semantics_buffer|>List.of_seqendmoduleTypingSingleSetBuffer:TYPBUFFER=structlet_typing_buffer:(typing_rule,unit)Hashtbl.t=Hashtbl.createTypingRule.all_nbletpushr=Hashtbl.replace_typing_bufferr()letreset()=Hashtbl.clear_typing_bufferletget()=Hashtbl.to_seq_keys_typing_buffer|>List.of_seqendmoduleSemanticsNoInstr=SemMake(SemanticsNoBuffer)moduleTypingNoInstr=TypMake(TypingNoBuffer)moduleSemanticsSingleInstr=SemMake(SemanticsSingleBuffer)moduleTypingSingleInstr=TypMake(TypingSingleBuffer)moduleSemanticsSingleSetInstr=SemMake(SemanticsSingleSetBuffer)moduleTypingSingleSetInstr=TypMake(TypingSingleSetBuffer)let(|:)=TypingNoInstr.use_with