BaseSemantics::SValuePtr RiscOperators::concat(const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &b_) { SValuePtr a = SValue::promote(a_); SValuePtr b = SValue::promote(b_); return undefined_(a->get_width() + b->get_width()); }
BaseSemantics::SValuePtr RiscOperators::unsignedMultiply(const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &b_) { SValuePtr a = SValue::promote(a_); SValuePtr b = SValue::promote(b_); size_t retwidth = a->get_width() + b->get_width(); return undefined_(retwidth); }
BaseSemantics::SValuePtr RiscOperators::ite(const BaseSemantics::SValuePtr &sel_, const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &b_) { SValuePtr sel = SValue::promote(sel_); SValuePtr a = SValue::promote(a_); SValuePtr b = SValue::promote(b_); assert(1==sel->get_width()); assert(a->get_width()==b->get_width()); return undefined_(a->get_width()); }
BaseSemantics::SValuePtr RiscOperators::addWithCarries(const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &b_, const BaseSemantics::SValuePtr &c_, BaseSemantics::SValuePtr &carry_out/*out*/) { SValuePtr a = SValue::promote(a_); SValuePtr b = SValue::promote(b_); SValuePtr c = SValue::promote(c_); assert(a->get_width()==b->get_width() && c->get_width()==1); carry_out = undefined_(a->get_width()); return undefined_(a->get_width()); }
Sawyer::Optional<BaseSemantics::SValuePtr> SValue::createOptionalMerge(const BaseSemantics::SValuePtr &other_, const BaseSemantics::MergerPtr &merger, const SmtSolverPtr &solver) const { SValuePtr other = SValue::promote(other_); SValuePtr retval = create_empty(other->get_width()); bool changed = false; for (size_t i=0; i<subvalues.size(); ++i) { BaseSemantics::SValuePtr thisValue = subvalues[i]; BaseSemantics::SValuePtr otherValue = other->subvalues[i]; if (otherValue) { if (thisValue==NULL) { retval->subvalues.push_back(otherValue); changed = true; } else if (BaseSemantics::SValuePtr mergedValue = thisValue->createOptionalMerge(otherValue, merger, solver).orDefault()) { changed = true; retval->subvalues.push_back(mergedValue); } else { retval->subvalues.push_back(thisValue); } } else { retval->subvalues.push_back(thisValue); } } return changed ? Sawyer::Optional<BaseSemantics::SValuePtr>(retval) : Sawyer::Nothing(); }
BaseSemantics::SValuePtr RiscOperators::rotateRight(const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &sa_) { SValuePtr a = SValue::promote(a_); SValuePtr sa = SValue::promote(sa_); return undefined_(a->get_width()); }
BaseSemantics::SValuePtr RiscOperators::unsignedModulo(const BaseSemantics::SValuePtr &a_, const BaseSemantics::SValuePtr &b_) { SValuePtr a = SValue::promote(a_); SValuePtr b = SValue::promote(b_); return undefined_(b->get_width()); }
BaseSemantics::SValuePtr RiscOperators::extract(const BaseSemantics::SValuePtr &a_, size_t begin_bit, size_t end_bit) { SValuePtr a = SValue::promote(a_); assert(end_bit<=a->get_width()); assert(begin_bit<end_bit); return undefined_(end_bit-begin_bit); }
BaseSemantics::SValuePtr RiscOperators::signExtend(const BaseSemantics::SValuePtr &a_, size_t new_width) { SValuePtr a = SValue::promote(a_); if (new_width==a->get_width()) return a; return undefined_(new_width); }
SValuePtr SymbolicMemory::readMemory(const SValuePtr &address_, const SValuePtr &dflt, RiscOperators *addrOps, RiscOperators *valOps) { using namespace InsnSemanticsExpr; SymbolicSemantics::SValuePtr address = SymbolicSemantics::SValue::promote(address_); if (address->get_width() != mem_->domainWidth() || dflt->get_width() != mem_->get_nbits()) { ASSERT_require2(mem_->isLeafNode() && mem_->isLeafNode()->is_memory(), "invalid address and/or value size for memory; expecting " + StringUtility::numberToString(mem_->domainWidth()) + "-bit addresses and " + StringUtility::numberToString(mem_->get_nbits()) + "-bit values"); // We can finalize the domain and range widths for the memory now that they've been given. mem_ = LeafNode::create_memory(address->get_width(), dflt->get_width()); } TreeNodePtr resultExpr = InternalNode::create(8, OP_READ, mem_, address->get_expression()); SymbolicSemantics::SValuePtr retval = SymbolicSemantics::SValue::promote(dflt->copy()); retval->set_expression(resultExpr); return retval; }
BaseSemantics::SValuePtr RiscOperators::mostSignificantSetBit(const BaseSemantics::SValuePtr &a_) { SValuePtr a = SValue::promote(a_); return undefined_(a->get_width()); }
BaseSemantics::SValuePtr RiscOperators::invert(const BaseSemantics::SValuePtr &a_) { SValuePtr a = SValue::promote(a_); return undefined_(a->get_width()); }