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