Esempio n. 1
0
 public override Procedure VisitProcedure(Procedure node) {
   //Contract.Requires(node != null);
   Contract.Ensures(Contract.Result<Procedure>() != null);
   Procedure newProcedure = null;
   if (OldToNewProcedureMap != null && OldToNewProcedureMap.ContainsKey(node)) {
     newProcedure = OldToNewProcedureMap[node];
   } else {
     newProcedure = base.VisitProcedure((Procedure) node.Clone());
     if (OldToNewProcedureMap != null)
       OldToNewProcedureMap[node] = newProcedure;
   }
   return newProcedure;
 }
Esempio n. 2
0
 public override Procedure VisitProcedure(Procedure node)
 {
     if (!QKeyValue.FindBoolAttribute(node.Attributes, "yields"))
         return node;
     if (!procMap.ContainsKey(node))
     {
         Procedure proc = (Procedure)node.Clone();
         proc.Name = string.Format("{0}_{1}", node.Name, phaseNum);
         proc.InParams = this.VisitVariableSeq(node.InParams);
         proc.Modifies = this.VisitIdentifierExprSeq(node.Modifies);
         proc.OutParams = this.VisitVariableSeq(node.OutParams);
         if (moverTypeChecker.procToActionInfo.ContainsKey(node) && moverTypeChecker.procToActionInfo[node].phaseNum < phaseNum)
         {
             proc.Requires = new List<Requires>();
             proc.Ensures = new List<Ensures>();
         }
         else
         {
             proc.Requires = this.VisitRequiresSeq(node.Requires);
             proc.Ensures = this.VisitEnsuresSeq(node.Ensures);
         }
         procMap[node] = proc;
     }
     return procMap[node];
 }
Esempio n. 3
0
        public override Procedure VisitProcedure(Procedure node)
        {
            if (!civlTypeChecker.procToActionInfo.ContainsKey(node))
                return node;
            if (!procMap.ContainsKey(node))
            {
                enclosingProc = node;
                Procedure proc = (Procedure)node.Clone();
                proc.Name = string.Format("{0}_{1}", node.Name, layerNum);
                proc.InParams = this.VisitVariableSeq(node.InParams);
                proc.Modifies = this.VisitIdentifierExprSeq(node.Modifies);
                proc.OutParams = this.VisitVariableSeq(node.OutParams);

                ActionInfo actionInfo = civlTypeChecker.procToActionInfo[node];
                if (actionInfo.createdAtLayerNum < layerNum)
                {
                    proc.Requires = new List<Requires>();
                    proc.Ensures = new List<Ensures>();
                    Implementation impl;
                    AtomicActionInfo atomicActionInfo = actionInfo as AtomicActionInfo;
                    if (atomicActionInfo != null)
                    {
                        CodeExpr action = (CodeExpr)VisitCodeExpr(atomicActionInfo.action);
                        List<Cmd> cmds = new List<Cmd>();
                        foreach (AssertCmd assertCmd in atomicActionInfo.gate)
                        {
                            cmds.Add(new AssumeCmd(Token.NoToken, (Expr)Visit(assertCmd.Expr)));
                        }
                        Block newInitBlock = new Block(Token.NoToken, "_init", cmds,
                            new GotoCmd(Token.NoToken, new List<string>(new string[] { action.Blocks[0].Label }),
                                                       new List<Block>(new Block[] { action.Blocks[0] })));
                        List<Block> newBlocks = new List<Block>();
                        newBlocks.Add(newInitBlock);
                        newBlocks.AddRange(action.Blocks);
                        impl = new Implementation(Token.NoToken, proc.Name, node.TypeParameters, node.InParams, node.OutParams, action.LocVars, newBlocks);
                    }
                    else
                    {
                        Block newInitBlock = new Block(Token.NoToken, "_init", new List<Cmd>(), new ReturnCmd(Token.NoToken));
                        List<Block> newBlocks = new List<Block>();
                        newBlocks.Add(newInitBlock);
                        impl = new Implementation(Token.NoToken, proc.Name, node.TypeParameters, node.InParams, node.OutParams, new List<Variable>(), newBlocks);
                    }
                    impl.Proc = proc;
                    impl.Proc.AddAttribute("inline", new LiteralExpr(Token.NoToken, Microsoft.Basetypes.BigNum.FromInt(1)));
                    impl.AddAttribute("inline", new LiteralExpr(Token.NoToken, Microsoft.Basetypes.BigNum.FromInt(1)));
                    impls.Add(impl);
                }
                else
                {
                    yieldingProcs.Add(proc);
                    proc.Requires = this.VisitRequiresSeq(node.Requires);
                    proc.Ensures = this.VisitEnsuresSeq(node.Ensures);
                }
                procMap[node] = proc;
                proc.Modifies = new List<IdentifierExpr>();
                civlTypeChecker.SharedVariables.Iter(x => proc.Modifies.Add(Expr.Ident(x)));
            }
            return procMap[node];
        }
Esempio n. 4
0
 public override Procedure VisitProcedure(Procedure node) {
   //Contract.Requires(node != null);
   Contract.Ensures(Contract.Result<Procedure>() != null);
   return base.VisitProcedure((Procedure)node.Clone());
 }