예제 #1
0
        public override List <Cmd> CreateUpdatesToRefinementVars(bool isMarkedCall)
        {
            var cmds          = new List <Cmd>();
            var pcOkUpdateLHS = new List <IdentifierExpr> {
                Expr.Ident(pc), Expr.Ident(ok)
            };

            if (isMarkedCall)
            {
                // assert !pc;
                // pc, ok := true, true;
                cmds.Add(CmdHelper.AssertCmd(tok, Expr.Not(Expr.Ident(pc)), $"Layer-{layerNum + 1} state modified before marked call"));
                var pcOkUpdateRHS = new List <Expr> {
                    Expr.True, Expr.True
                };
                cmds.Add(CmdHelper.AssignCmd(pcOkUpdateLHS, pcOkUpdateRHS));
            }
            else
            {
                // pc, ok := g_old == g ==> pc, transitionRelation(i, g_old, o, g) || (o_old == o && ok);
                var pcOkUpdateRHS = new List <Expr> {
                    Expr.Imp(OldEqualityExprForGlobals(), Expr.Ident(pc)),
                    Expr.Or(transitionRelation, Expr.And(OldEqualityExprForOutputs(), Expr.Ident(ok))),
                };
                cmds.Add(CmdHelper.AssignCmd(pcOkUpdateLHS, pcOkUpdateRHS));
            }

            CivlUtil.ResolveAndTypecheck(cmds);

            return(cmds);
        }
        // Add assignment g := g for all global variables g at yielding loop heads.
        // This is to make all global variables loop targets that get havoced.
        private List <Cmd> YieldingLoopDummyAssignment()
        {
            var globals = civlTypeChecker.GlobalVariables.Select(Expr.Ident).ToList();
            var cmds    = new List <Cmd>();

            if (globals.Count != 0)
            {
                cmds.Add(CmdHelper.AssignCmd(globals, globals.ToList <Expr>()));
            }
            return(cmds);
        }
예제 #3
0
        public override List <Cmd> CreateInitCmds()
        {
            var lhss = new List <IdentifierExpr> {
                Expr.Ident(pc), Expr.Ident(ok)
            };
            var rhss = new List <Expr> {
                Expr.False, Expr.False
            };
            var cmds = new List <Cmd> {
                CmdHelper.AssignCmd(lhss, rhss)
            };

            cmds.AddRange(CreateUpdatesToOldOutputVars());
            // assume spec gate at procedure entry
            cmds.Add(CmdHelper.AssumeCmd(gate));
            return(cmds);
        }
예제 #4
0
        public override List <Cmd> CreateUpdatesToOldOutputVars()
        {
            var lhss = new List <IdentifierExpr>();
            var rhss = new List <Expr>();

            foreach (Variable o in oldOutputMap.Keys)
            {
                lhss.Add(Expr.Ident(oldOutputMap[o]));
                rhss.Add(Expr.Ident(o));
            }

            if (lhss.Count > 0)
            {
                return(new List <Cmd> {
                    CmdHelper.AssignCmd(lhss, rhss)
                });
            }
            return(new List <Cmd>());
        }
        public List <Cmd> CreateInitCmds()
        {
            List <IdentifierExpr> lhss = new List <IdentifierExpr>();
            List <Expr>           rhss = new List <Expr>();

            foreach (Variable g in oldGlobalMap.Keys)
            {
                lhss.Add(Expr.Ident(oldGlobalMap[g]));
                rhss.Add(Expr.Ident(g));
            }

            var initCmds = new List <Cmd>();

            if (lhss.Count > 0)
            {
                initCmds.Add(CmdHelper.AssignCmd(lhss, rhss));
            }

            return(initCmds);
        }
        public List <Cmd> CreateUpdatesToPermissionCollector(Absy absy)
        {
            Dictionary <string, Expr> domainNameToExpr = linearPermissionInstrumentation.PermissionExprs(absy);
            List <IdentifierExpr>     lhss             = new List <IdentifierExpr>();
            List <Expr> rhss = new List <Expr>();

            foreach (var domainName in linearTypeChecker.linearDomains.Keys)
            {
                lhss.Add(Expr.Ident(domainNameToHoleVar[domainName]));
                rhss.Add(domainNameToExpr[domainName]);
            }

            var cmds = new List <Cmd>();

            if (lhss.Count > 0)
            {
                cmds.Add(CmdHelper.AssignCmd(lhss, rhss));
            }

            return(cmds);
        }
        public List <Cmd> CreateInitCmds(Implementation impl)
        {
            Dictionary <string, Expr> domainNameToExpr = linearPermissionInstrumentation.PermissionExprs(impl);
            List <IdentifierExpr>     lhss             = new List <IdentifierExpr>();
            List <Expr> rhss = new List <Expr>();

            foreach (string domainName in linearTypeChecker.linearDomains.Keys)
            {
                lhss.Add(Expr.Ident(domainNameToHoleVar[domainName]));
                rhss.Add(domainNameToExpr[domainName]);
            }

            var initCmds = new List <Cmd>();

            if (lhss.Count > 0)
            {
                initCmds.Add(CmdHelper.AssignCmd(lhss, rhss));
            }

            return(initCmds);
        }