Пример #1
0
        private static Ast.smv_module CreateClockModule(string name)
        {
            List <Tuple <string, Tuple <Int64, Int64> > > vars;
            List <Tuple <string, Ast.types> >             varwithtpyes;
            List <string>      parameters = new List <string>();
            List <Ast.section> sections   = new List <Ast.section>();

            // Variable section
            vars         = ClockVars();
            varwithtpyes = ConvertRngTupleToTypes(vars);
            Ast.section varsec = Ast.section.NewVar(FSharpInteropExtensions.ToFSharplist <Tuple <string, Ast.types> >(varwithtpyes));
            //Assignment section
            Tuple <Ast.section, Tuple <List <Tuple <string, Ast.expr> >, List <Tuple <string, Ast.expr> > > > getsections = ClockAssigns(vars);

            Ast.section assignsec = getsections.Item1;
            sections.Add(varsec); sections.Add(assignsec);
            //Create Module
            Ast.smv_module clockmodl = new Ast.smv_module(name,
                                                          FSharpInteropExtensions.ToFSharplist <string>(parameters),
                                                          FSharpInteropExtensions.ToFSharplist <Ast.section>(sections));
            _iassigns[clockmodl] = getsections.Item2.Item1;
            _nassigns[clockmodl] = getsections.Item2.Item2;
            _params[clockmodl]   = parameters;
            _init[clockmodl]     = new List <Ast.expr>();
            _mvars[clockmodl]    = new List <Tuple <string, Tuple <string, List <List <string> > > > >();
            _rvars[clockmodl]    = vars;
            _svars[clockmodl]    = new List <Tuple <string, List <string> > >();
            _trans[clockmodl]    = new List <Ast.expr>();

            return(clockmodl);
        }
Пример #2
0
        private static Ast.smv_module CreateTimeModule(string name)
        {
            List <Tuple <string, Tuple <Int64, Int64> > > vars;
            List <Tuple <string, Ast.types> >             varwithtpyes;

            Ast.expr           init;
            Ast.expr           transrel;
            Ast.expr           resetident = Ast.expr.NewIdent("reset");
            List <string>      parameters = new List <string>();
            List <Ast.section> secs       = new List <Ast.section>();

            //
            vars         = TimerVars();
            varwithtpyes = ConvertRngTupleToTypes(vars);
            init         = TimerInit(vars);
            transrel     = TimerTransitions(vars, resetident);
            Debug.Assert(transrel != null);
            // Create sections
            Ast.section trans  = Ast.section.NewTrans(transrel);
            Ast.section inits  = Ast.section.NewInit(init);
            Ast.section varbls = Ast.section.NewVar(FSharpInteropExtensions.ToFSharplist <Tuple <string, Ast.types> >(varwithtpyes));
            // Dirty conversions
            Microsoft.FSharp.Collections.FSharpList <Ast.section> sections = FSharpInteropExtensions.ToFSharplist <Ast.section>(secs);
            Microsoft.FSharp.Collections.FSharpList <string>      pars     = FSharpInteropExtensions.ToFSharplist <string>(parameters);
            // Create module
            Ast.smv_module timermodule = new Ast.smv_module(name, pars, sections);
            //Fill memory representation
            //Trans
            List <Ast.expr> transrels = new List <Ast.expr>();

            transrels.Add(transrel);
            _trans.Add(timermodule, transrels);
            //init
            List <Ast.expr> initials = new List <Ast.expr>();

            initials.Add(init);
            _init.Add(timermodule, initials);
            //params
            _params.Add(timermodule, parameters);
            //vars
            _rvars.Add(timermodule, vars);
            //_mvars
            _mvars.Add(timermodule, new List <Tuple <string, Tuple <string, List <List <string> > > > >());
            //_svars
            _svars.Add(timermodule, new List <Tuple <string, List <string> > >());
            //iassigns
            _iassigns.Add(timermodule, new List <Tuple <string, Ast.expr> >());
            //nassigns
            _nassigns.Add(timermodule, new List <Tuple <string, Ast.expr> >());
            return(timermodule);
        }
Пример #3
0
        private static Tuple <Ast.section, Tuple <List <Tuple <string, Ast.expr> >, List <Tuple <string, Ast.expr> > > > ClockAssigns(List <Tuple <string, Tuple <Int64, Int64> > > variables)
        {
            List <Tuple <string, Ast.expr> > stringexprlstinit = new List <Tuple <string, Ast.expr> >();
            List <Tuple <string, Ast.expr> > stringexprlstnext = new List <Tuple <string, Ast.expr> >();

            Ast.expr clockindent = Ast.expr.NewInt(_clockbound);

            Ast.expr timerident    = Ast.expr.NewIdent("time");
            Ast.expr inctimerident = Ast.expr.NewAdd(timerident, Ast.expr.NewInt(1));
            Ast.expr truident      = Ast.expr.NewIdent("TRUE");
            Ast.expr zeroident     = Ast.expr.NewInt(0);
            Ast.expr guard         = Ast.expr.NewLt(timerident, Ast.expr.NewInt(_clockbound));
            // init
            Ast.assign initident = Ast.assign.NewInitAssign("time", zeroident);
            // next
            List <Tuple <Ast.expr, Ast.expr> > caseslst = new List <Tuple <Ast.expr, Ast.expr> >();
            Tuple <Ast.expr, Ast.expr>         guardcs  = new Tuple <Ast.expr, Ast.expr>(guard, inctimerident);

            caseslst.Add(guardcs);
            stringexprlstinit.Add(new Tuple <string, Ast.expr>("time", zeroident));

            Tuple <Ast.expr, Ast.expr> trucs = new Tuple <Ast.expr, Ast.expr>(truident, timerident);

            caseslst.Add(trucs);
            Ast.expr   caseident = Ast.expr.NewCases(FSharpInteropExtensions.ToFSharplist <Tuple <Ast.expr, Ast.expr> >(caseslst));
            Ast.assign nextident = Ast.assign.NewNextAssign("time", caseident);
            stringexprlstnext.Add(new Tuple <string, Ast.expr>("time", caseident));

            List <Ast.assign> assignlst = new List <Ast.assign>();

            assignlst.Add(initident);
            assignlst.Add(nextident);
            Ast.section assignsec = Ast.section.NewAssigns(FSharpInteropExtensions.ToFSharplist <Ast.assign>(assignlst));

            Tuple <Ast.section, Tuple <List <Tuple <string, Ast.expr> >, List <Tuple <string, Ast.expr> > > > sectionwithmemoryvalues =
                new Tuple <Ast.section, Tuple <List <Tuple <string, Ast.expr> >, List <Tuple <string, Ast.expr> > > >
                    (assignsec, new Tuple <List <Tuple <string, Ast.expr> >, List <Tuple <string, Ast.expr> > >(stringexprlstinit, stringexprlstnext));

            return(sectionwithmemoryvalues);
        }
Пример #4
0
        private static void IntroduceAsyncBound()
        {
            int counter = 0;

            foreach (var modl in _modules)
            {
                if (_bmodules.ContainsKey(modl))
                {
                    if (modl.name == "main")
                    {
                        // foreach variable in bounded variable set of this module is constructor and needs to be introduced with parameter
                        List <List <string> > timervarlist = new List <List <string> >();
                        Tuple <string, List <List <string> > > timerconstvartupl           = new Tuple <string, List <List <string> > >("timer", timervarlist);
                        Tuple <string, Tuple <string, List <List <string> > > > timerident = new Tuple <string, Tuple <string, List <List <string> > > >("t", timerconstvartupl);
                        _mvars[modl].Add(timerident);
                        List <List <string> > clockvarlist = new List <List <string> >();
                        Tuple <string, List <List <string> > > clockconstvartupl           = new Tuple <string, List <List <string> > >("clock", clockvarlist);
                        Tuple <string, Tuple <string, List <List <string> > > > clockident = new Tuple <string, Tuple <string, List <List <string> > > >("c", clockconstvartupl);
                        _mvars[modl].Add(clockident);
                        foreach (var boundvar in _bmodules[modl])
                        {
                            foreach (var mvar in _mvars[modl])
                            {
                                if (boundvar == mvar.Item1)
                                {
                                    if (mvar.Item2.Item1 == "clock")
                                    {
                                        List <string> mtimervar = new List <string>();
                                        mtimervar.Add("t");
                                        mtimervar.Add("reset");
                                        mvar.Item2.Item2.Add(mtimervar);
                                    }
                                    else
                                    {
                                        if (mvar.Item2.Item1 == "Anchorcell")
                                        {
                                            List <string> mtimervar = new List <string>();
                                            mtimervar.Add("t");
                                            mtimervar.Add("reset");
                                            mvar.Item2.Item2.Add(mtimervar);
                                        }
                                        else
                                        {
                                            if (mvar.Item2.Item1 == "VPC")
                                            {
                                                List <string> mtimervar = new List <string>();
                                                List <string> clockvar  = new List <string>();

                                                Debug.Assert(counter < _nthread);

                                                clockvar.Add("c");
                                                clockvar.Add("time");
                                                mvar.Item2.Item2.Add(clockvar);

                                                mtimervar.Add("t");
                                                mtimervar.Add("var" + counter.ToString());
                                                mvar.Item2.Item2.Add(mtimervar);
                                                counter++;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        //Modify clock
                        // put timerparameter to module's declaration
                        if (modl.name == "clock")
                        {
                            _params[modl].Add("reset");
                            Ast.expr rst        = Ast.expr.NewIdent("reset");
                            Ast.expr resetident = Ast.expr.NewEq(rst, Ast.expr.NewInt(1));
                            //Ast.expr resetnident = Ast.expr.NewNext(rst);
                            //Ast.expr resetnidenttru = Ast.expr.NewEq(resetnident, Ast.expr.NewInt(1));
                            //Ast.expr takestep = Ast.expr.NewAnd(resetident, resetnidenttru);

                            for (int i = 0; i < _nassigns[modl].Count; i++)
                            {
                                Ast.expr.Cases nassign = _nassigns[modl][i].Item2 as Ast.expr.Cases;
                                Debug.Assert(nassign.IsCases);
                                List <Tuple <Ast.expr, Ast.expr> > caselist = new List <Tuple <Ast.expr, Ast.expr> >();
                                for (int j = 0; j < nassign.Item.Length; j++)
                                {
                                    if (nassign.Item[j].Item1.ToString() != "TRUE")
                                    {
                                        Ast.expr asyncupdated = Ast.expr.NewAnd(resetident, nassign.Item[j].Item1);
                                        FSharpList <Tuple <Ast.expr, Ast.expr> > exprlst = FSharpInteropExtensions.ToFSharplist <Tuple <Ast.expr, Ast.expr> >(nassign.Item);
                                        caselist.Add(new Tuple <Ast.expr, Ast.expr>(asyncupdated, exprlst[j].Item2));
                                    }
                                    else
                                    {
                                        Ast.expr asyncupdated = nassign.Item[j].Item1;
                                        FSharpList <Tuple <Ast.expr, Ast.expr> > exprlst = FSharpInteropExtensions.ToFSharplist <Tuple <Ast.expr, Ast.expr> >(nassign.Item);
                                        caselist.Add(new Tuple <Ast.expr, Ast.expr>(asyncupdated, exprlst[j].Item2));
                                    }
                                }
                                Tuple <string, Ast.expr> asyncupdatedassign = new Tuple <string, Ast.expr>(_nassigns[modl][i].Item1,
                                                                                                           Ast.expr.NewCases(FSharpInteropExtensions.ToFSharplist <Tuple <Ast.expr, Ast.expr> >(caselist)));
                                _nassigns[modl][i] = asyncupdatedassign;
                            }
                        }
                        else
                        {
                            if (modl.name == "Anchorcell")
                            {
                                _params[modl].Add("reset");
                                Ast.expr rst            = Ast.expr.NewIdent("reset");
                                Ast.expr resetident     = Ast.expr.NewEq(rst, Ast.expr.NewInt(0));
                                Ast.expr resetnident    = Ast.expr.NewNext(rst);
                                Ast.expr resetnidenttru = Ast.expr.NewEq(resetnident, Ast.expr.NewInt(1));
                                Ast.expr takestep       = Ast.expr.NewAnd(resetident, resetnidenttru);

                                for (int i = 0; i < _nassigns[modl].Count; i++)
                                {
                                    Ast.expr.Cases nassign = _nassigns[modl][i].Item2 as Ast.expr.Cases;
                                    Debug.Assert(nassign.IsCases);
                                    List <Tuple <Ast.expr, Ast.expr> > caselist = new List <Tuple <Ast.expr, Ast.expr> >();
                                    for (int j = 0; j < nassign.Item.Length; j++)
                                    {
                                        if (nassign.Item[j].Item1.ToString() != "TRUE")
                                        {
                                            Ast.expr asyncupdated = Ast.expr.NewAnd(takestep, nassign.Item[j].Item1);
                                            FSharpList <Tuple <Ast.expr, Ast.expr> > exprlst = FSharpInteropExtensions.ToFSharplist <Tuple <Ast.expr, Ast.expr> >(nassign.Item);
                                            caselist.Add(new Tuple <Ast.expr, Ast.expr>(asyncupdated, exprlst[j].Item2));
                                        }
                                        else
                                        {
                                            Ast.expr asyncupdated = nassign.Item[j].Item1;
                                            FSharpList <Tuple <Ast.expr, Ast.expr> > exprlst = FSharpInteropExtensions.ToFSharplist <Tuple <Ast.expr, Ast.expr> >(nassign.Item);
                                            caselist.Add(new Tuple <Ast.expr, Ast.expr>(asyncupdated, exprlst[j].Item2));
                                        }
                                    }
                                    Tuple <string, Ast.expr> asyncupdatedassign = new Tuple <string, Ast.expr>(_nassigns[modl][i].Item1,
                                                                                                               Ast.expr.NewCases(FSharpInteropExtensions.ToFSharplist <Tuple <Ast.expr, Ast.expr> >(caselist)));
                                    _nassigns[modl][i] = asyncupdatedassign;
                                }
                            }
                            else
                            {
                                _params[modl].Add("time");
                                _params[modl].Add("t");
                                string   asyncboundparam = _params[modl][_params[modl].Count - 1];
                                Ast.expr asyncident      = Ast.expr.NewIdent(asyncboundparam);
                                Ast.expr nasyncindent    = Ast.expr.NewNext(asyncident);
                                Ast.expr takestep        = Ast.expr.NewLt(asyncident, nasyncindent);
                                // foreach bounded variable belongs to this module need to be introduce with async bound in their next assignments
                                for (int i = 0; i < _nassigns[modl].Count; i++)
                                {
                                    Ast.expr.Cases nassign = _nassigns[modl][i].Item2 as Ast.expr.Cases;
                                    Debug.Assert(nassign.IsCases);
                                    List <Tuple <Ast.expr, Ast.expr> > caselist = new List <Tuple <Ast.expr, Ast.expr> >();
                                    for (int j = 0; j < nassign.Item.Length; j++)
                                    {
                                        if (nassign.Item[j].Item1.ToString() != "TRUE")
                                        {
                                            Ast.expr asyncupdated = Ast.expr.NewAnd(takestep, nassign.Item[j].Item1);
                                            FSharpList <Tuple <Ast.expr, Ast.expr> > exprlst = FSharpInteropExtensions.ToFSharplist <Tuple <Ast.expr, Ast.expr> >(nassign.Item);
                                            caselist.Add(new Tuple <Ast.expr, Ast.expr>(asyncupdated, exprlst[j].Item2));
                                        }
                                        else
                                        {
                                            Ast.expr asyncupdated = nassign.Item[j].Item1;
                                            FSharpList <Tuple <Ast.expr, Ast.expr> > exprlst = FSharpInteropExtensions.ToFSharplist <Tuple <Ast.expr, Ast.expr> >(nassign.Item);
                                            caselist.Add(new Tuple <Ast.expr, Ast.expr>(asyncupdated, exprlst[j].Item2));
                                        }
                                    }
                                    Tuple <string, Ast.expr> asyncupdatedassign = new Tuple <string, Ast.expr>(_nassigns[modl][i].Item1,
                                                                                                               Ast.expr.NewCases(FSharpInteropExtensions.ToFSharplist <Tuple <Ast.expr, Ast.expr> >(caselist)));
                                    _nassigns[modl][i] = asyncupdatedassign;
                                }
                            }
                        }
                    }
                }
            }
        }
Пример #5
0
        private static List <Tuple <string, Ast.types> > ConvertSetTupleToTypes(List <Tuple <string, List <string> > > variables)
        {
            List <Tuple <string, Ast.types> > vartypes = new List <Tuple <string, Ast.types> >();

            foreach (var v in variables)
            {
                Tuple <string, Ast.types> vartypetup = new Tuple <string, Ast.types>(v.Item1, Ast.types.NewSet(FSharpInteropExtensions.ToFSharplist <string>(v.Item2)));
                vartypes.Add(vartypetup);
            }
            return(vartypes);
        }
Пример #6
0
        private static List <Ast.smv_module> GenSmvModlsFromMem()
        {
            List <Ast.smv_module> astmodules = new List <Ast.smv_module>();

            foreach (var modl in _modules)
            {
                List <Ast.section> sections           = new List <Ast.section>();
                List <Tuple <string, Ast.types> > vrs = new List <Tuple <string, Ast.types> >();
                //svars
                List <Tuple <string, Ast.types> > svars = ConvertSetTupleToTypes(_svars[modl]);
                foreach (var v in svars)
                {
                    vrs.Add(v);
                }
                // Ast.section svarsec = Ast.section.NewVar(FSharpInteropExtensions.ToFSharplist<Tuple<string, Ast.types>> (svars));
                //rvars
                List <Tuple <string, Ast.types> > rvars = ConvertRngTupleToTypes(_rvars[modl]);
                foreach (var v in rvars)
                {
                    vrs.Add(v);
                }
                //mvars
                List <Tuple <string, Ast.types> > mvars = ConvertModlTupleToTypes(_mvars[modl]);
                foreach (var v in mvars)
                {
                    vrs.Add(v);
                }
                Ast.section varsec = Ast.section.NewVar(FSharpInteropExtensions.ToFSharplist <Tuple <string, Ast.types> >(vrs));
                sections.Add(varsec);
                //init
                foreach (var init in _init[modl])
                {
                    sections.Add(Ast.section.NewInit(init));
                }
                //trans
                foreach (var trans in _trans[modl])
                {
                    sections.Add(Ast.section.NewTrans(trans));
                }

                List <Ast.assign> assigns = new List <Ast.assign>();
                using (var e1 = _iassigns[modl].GetEnumerator())
                {
                    while (e1.MoveNext())
                    {
                        var        iassign = e1.Current;
                        Ast.assign iasgn   = Ast.assign.NewInitAssign(iassign.Item1, iassign.Item2);
                        assigns.Add(iasgn);
                    }
                }

                //assigns Bug is here
                using (var e2 = _nassigns[modl].GetEnumerator())
                {
                    while (e2.MoveNext())
                    {
                        var        nassign = e2.Current;
                        Ast.assign nasgn   = Ast.assign.NewNextAssign(nassign.Item1, nassign.Item2);
                        assigns.Add(nasgn);
                    }
                }

                /*
                 * foreach (var iassign in _iassigns[modl])
                 * {
                 *  Ast.assign asgn = Ast.assign.NewInitAssign(iassign.Item1, iassign.Item2);
                 *  assigns.Add(asgn);
                 * }
                 * foreach (var nassign in _nassigns[modl])
                 * {
                 *  Ast.assign asgn = Ast.assign.NewNextAssign(nassign.Item1, nassign.Item2);
                 *  assigns.Add(asgn);
                 * }*/
                if (assigns.Count > 0)
                {
                    sections.Add(Ast.section.NewAssigns(FSharpInteropExtensions.ToFSharplist <Ast.assign>(assigns)));
                }
                Ast.smv_module asyncboundedmodl = new Ast.smv_module(modl.name, FSharpInteropExtensions.ToFSharplist <string>(_params[modl]) /*modl.parameters*/, FSharpInteropExtensions.ToFSharplist <Ast.section>(sections));
                astmodules.Add(asyncboundedmodl);
            }
            return(astmodules);
        }