Beispiel #1
0
        private void GenerateCombiningRequest()
        {
            var acrequest = AH.MakeGenericTypeSpecific("ArmadaCombiningRequest",
                                                       new List <Type> {
                AH.ReferToType("LPlusState"),
                AH.ReferToType("L.Armada_TraceEntry"),
                AH.ReferToType("L.Armada_PC"),
                AH.ReferToType("HState"),
                AH.ReferToType("H.Armada_TraceEntry"),
                AH.ReferToType("H.Armada_PC")
            });

            pgp.MainProof.AddTypeSynonymDecl("ACRequest", acrequest);

            string str = @"
        function GetArmadaCombiningRequest() : ACRequest
        {
          ArmadaCombiningRequest(LPlus_GetSpecFunctions(), H.Armada_GetSpecFunctions(),
                                 GetLPlusHRefinementRelation(), InductiveInv,
                                 ConvertTotalState_LPlusH, ConvertTraceEntry_LH, ConvertPC_LH,  IsInnerPC)
        }
      ";

            pgp.AddFunction(str);
        }
Beispiel #2
0
        protected override void GenerateConvertStackFrame_HL()
        {
            var cases       = new List <MatchCaseExpr>();
            var methodNames = pgp.symbolsHigh.MethodNames;

            foreach (var methodName in methodNames)
            {
                var smst = pgp.symbolsHigh.GetMethodSymbolTable(methodName);
                var ps   = new List <Expression>();
                var bvs  = new List <BoundVar>();
                foreach (var v in smst.AllVariablesInOrder)
                {
                    var ty = (v is AddressableArmadaVariable) ? AH.ReferToType("Armada_Pointer") : v.ty;
                    var e  = AH.MakeNameSegment(v.FieldName, ty);
                    if (methodName != strategy.MethodName || v.name != strategy.VariableName)
                    {
                        ps.Add(e);
                    }
                    var bv = AH.MakeBoundVar(v.FieldName, v.GetFlattenedType(pgp.symbolsHigh));
                    bvs.Add(bv);
                }
                var case_body = AH.MakeApplyN($"L.Armada_StackFrame_{methodName}", ps, "L.Armada_StackFrame");
                cases.Add(AH.MakeMatchCaseExpr($"Armada_StackFrame_{methodName}", bvs, case_body));
            }

            var source  = AH.MakeNameSegment("frame", "H.Armada_StackFrame");
            var body    = AH.MakeMatchExpr(source, cases, "L.Armada_StackFrame");
            var formals = new List <Formal> {
                AH.MakeFormal("frame", "H.Armada_StackFrame")
            };
            var fn = AH.MakeFunction("ConvertStackFrame_HL", formals, body);

            pgp.AddDefaultClassDecl(fn, "convert");
        }
Beispiel #3
0
        protected override void GenerateConvertStackFrame_LH()
        {
            var cases       = new List <MatchCaseExpr>();
            var methodNames = pgp.symbolsLow.MethodNames;

            foreach (var methodName in methodNames)
            {
                var smst        = pgp.symbolsLow.GetMethodSymbolTable(methodName);
                var ps          = new List <Expression>();
                var bvs         = new List <BoundVar>();
                var lowVarNames = new List <string>(smst.AllVariableNamesInOrder);
                foreach (var varName in lowVarNames)
                {
                    var v  = smst.LookupVariable(varName);
                    var ty = (v is AddressableArmadaVariable) ? AH.ReferToType("Armada_Pointer") : v.ty;
                    var e  = AH.MakeNameSegment(v.FieldName, ty);
                    ps.Add(e);
                    var bv = AH.MakeBoundVar(v.FieldName, v.GetFlattenedType(pgp.symbolsLow));
                    bvs.Add(bv);
                }

                smst = pgp.symbolsHigh.GetMethodSymbolTable(methodName);
                var highVars = new List <ArmadaVariable>(smst.AllVariablesInOrder);

                if (highVars.Count() != lowVarNames.Count())
                {
                    for (var i = 0; i < highVars.Count(); ++i)
                    {
                        if (!lowVarNames.Contains(highVars[i].name))
                        {
                            var v  = highVars[i];
                            var ty = (v is AddressableArmadaVariable) ? AH.ReferToType("Armada_Pointer") : v.ty;
                            ps.Insert(i, AH.MakeNameSegment(strategy.InitializationExpression, ty));
                        }
                    }
                }

                var case_body = AH.MakeApplyN($"H.Armada_StackFrame_{methodName}", ps, "H.Armada_StackFrame");
                cases.Add(AH.MakeMatchCaseExpr($"Armada_StackFrame_{methodName}", bvs, case_body));
            }

            var source  = AH.MakeNameSegment("frame", "L.Armada_StackFrame");
            var body    = AH.MakeMatchExpr(source, cases, "H.Armada_StackFrame");
            var formals = new List <Formal> {
                AH.MakeFormal("frame", "L.Armada_StackFrame")
            };
            var fn = AH.MakeFunction("ConvertStackFrame_LH", formals, body);

            pgp.AddDefaultClassDecl(fn, "convert");
        }
Beispiel #4
0
        ////////////////////////////////////////////////////////////////////////
        /// Variable-hiding request
        ////////////////////////////////////////////////////////////////////////

        private void GenerateVarHidingRequest()
        {
            string str;

            var lplusstate = AH.ReferToType("LPlusState");
            var hstate     = AH.ReferToType("HState");
            var lstep      = AH.ReferToType("LStep");
            var hstep      = AH.ReferToType("HStep");
            var vhrequest  = AH.MakeGenericTypeSpecific("VarHidingRequest", new List <Type> {
                lplusstate, hstate, lstep, hstep
            });

            pgp.MainProof.AddTypeSynonymDecl("VHRequest", vhrequest);

            if (suppressedPCs.Count > 0)
            {
                str  = @"
          predicate IsSuppressedPC(pc:L.Armada_PC)
          {
        ";
                str += string.Join(" || ", suppressedPCs.Select(s => $"pc.{s}?"));
                str += "\n}\n";
            }
            else
            {
                str = @"
          predicate IsSuppressedPC(pc:L.Armada_PC)
          {
            false
          }
        ";
            }
            pgp.AddPredicate(str);

            str = @"
        function GetVarHidingRequest() : VHRequest
        {
          VarHidingRequest(GetLPlusSpec(), GetHSpec(), GetLPlusHRefinementRelation(), InductiveInv, ConvertTotalState_LPlusH,
                           ConvertAndSuppressMultistep)
        }
      ";
            pgp.AddFunction(str);
        }
Beispiel #5
0
        private void GenerateWeakeningRequest()
        {
            var lplusstate = AH.ReferToType("LPlusState");
            var hstate     = AH.ReferToType("HState");
            var lstep      = AH.ReferToType("LStep");
            var hstep      = AH.ReferToType("HStep");
            var wrequest   = AH.MakeGenericTypeSpecific("WeakeningRequest", new List <Type> {
                lplusstate, hstate, lstep, hstep
            });

            pgp.MainProof.AddTypeSynonymDecl("WRequest", wrequest);

            var str = @"
      function GetWeakeningRequest(): WRequest
      {
        WeakeningRequest(GetLPlusSpec(), GetHSpec(), GetLPlusHRefinementRelation(), iset lps : LPlusState | InductiveInv(lps) :: lps, ConvertTotalState_LPlusH, ConvertMultistep_LH)
      }
      ";

            pgp.AddFunction(str);
        }
Beispiel #6
0
        public Type FlattenType(Type t, string moduleName = null)
        {
            if (t is UserDefinedType)
            {
                var ut = (UserDefinedType)t;
                if (DoesStructExist(ut.Name))
                {
                    return(AH.ReferToType("Armada_Struct_" + ut.Name, moduleName));
                }
            }
            else if (t is SizedArrayType)
            {
                var ssa = (SizedArrayType)t;
                return(new SeqType(FlattenType(ssa.Range, moduleName)));
            }
            else if (t is PointerType)
            {
                return(AH.ReferToType("Armada_Pointer"));
            }

            return(t);
        }
Beispiel #7
0
 public Expression ReserveVariableName(string varName, string typeName)
 {
     return(ReserveVariableName(varName, AH.ReferToType(typeName)));
 }
Beispiel #8
0
 public override Type GetFlattenedType(ArmadaSymbolTable symbols, string moduleName = null)
 {
     return(AH.ReferToType("Armada_Pointer"));
 }
Beispiel #9
0
 public NextFormal(string globallyUniqueVarName, string localVarName, string varTypeName)
 {
     GloballyUniqueVarName = globallyUniqueVarName;
     LocalVarName          = localVarName;
     VarType = AH.ReferToType(varTypeName);
 }
Beispiel #10
0
 public GhostsArmadaLValue() : base(Token.NoToken, AH.ReferToType("Armada_Ghosts"), new UndefinedBehaviorAvoidanceConstraint())
 {
 }
Beispiel #11
0
 public TopStackFrameArmadaLValue(UndefinedBehaviorAvoidanceConstraint i_crashAvoidance) : base(Token.NoToken, AH.ReferToType("Armada_StackFrame"), i_crashAvoidance)
 {
 }
Beispiel #12
0
 public TopStackVarsArmadaLValue(UndefinedBehaviorAvoidanceConstraint i_crashAvoidance, string i_methodName)
     : base(Token.NoToken, AH.ReferToType($"Armada_StackVars_{i_methodName}"), i_crashAvoidance)
 {
     methodName = i_methodName;
 }