Пример #1
0
        public static ulong?ToUlong(BitVecExpr value, uint nBits, Solver solver, Context ctx)
        {
            if (value.IsBVNumeral)
            {
                return(((BitVecNum)value).UInt64);
            }

            Tv[] results = new Tv[nBits];
            using (BitVecNum ONE = ctx.MkBV(1, 1))
            {
                for (uint bit = 0; bit < nBits; ++bit)
                {
                    using (BoolExpr b = ToolsZ3.GetBit(value, bit, ONE, ctx))
                    {
                        switch (ToolsZ3.GetTv(b, solver, ctx))
                        {
                        case Tv.ONE:
                            results[bit] = Tv.ONE;
                            break;

                        case Tv.ZERO:
                            results[bit] = Tv.ZERO;
                            break;

                        default:
                            return(null);
                        }
                    }
                }
            }
            return(ToolsZ3.ToUlong(results));
        }
Пример #2
0
        public Tv[] GetTvArray(Rn regName)
        {
            lock (this._ctxLock)
            {
                if (this.Frozen && this._cached_Reg_Values.TryGetValue(regName, out var value))
                {
                    return(value);
                }
                try
                {
                    this.UndefGrounding = true; // needed!

                    bool popNeeded = false;
                    if ((this.BranchInfoStore != null) && (this.BranchInfoStore.Count > 0))
                    {
                        this.Solver.Push();
                        this.Solver_U.Push();
                        this.AssertBranchInfoToSolver();
                        popNeeded = true;
                    }

                    using (BitVecExpr regExpr = this.Create(regName))
                    {
                        Tv[] result = ToolsZ3.GetTvArray(regExpr, RegisterTools.NBits(regName), this.Solver, this.Solver_U, this._ctx);

                        if (popNeeded)
                        {
                            this.Solver.Pop();
                            this.Solver_U.Pop();
                        }

                        if (this.Frozen)
                        {
                            if (ADD_COMPUTED_VALUES && (RegisterTools.NBits(regName) == 64))
                            {
                                ulong?value2 = ToolsZ3.ToUlong(result);
                                if (value2 != null)
                                {
                                    this.Solver.Assert(this.Ctx.MkEq(regExpr, this.Ctx.MkBV(value2.Value, 64)));
                                    this.Solver_Dirty = true;
                                }
                            }
                            this._cached_Reg_Values[regName] = result;
                        }
                        return(result);
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("WARNING: AsmSimulator: " + e.ToString());
                    return(new Tv[RegisterTools.NBits(regName)]);
                }
            }
        }