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