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); }
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); }
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); }