const std::string UlamType::getLocalStorageTypeAsString() { std::ostringstream ctype; ctype << getUlamTypeImmediateMangledName(); ctype << "<EC>"; //name of struct w typedef(bf) and storage(bv); return ctype.str(); } //getLocalStorageTypeAsString
const std::string UlamType::getUlamTypeImmediateAutoMangledName() { assert(needsImmediateType()); if(isAltRefType()) { m_state.abortShouldntGetHere(); return getUlamTypeImmediateMangledName(); } //same as non-ref except for the 'r' std::ostringstream automn; automn << "Ui_"; automn << getUlamTypeUPrefix().c_str(); automn << "r"; automn << getUlamTypeMangledType(); return automn.str(); } //getUlamTypeImmediateAutoMangledName
//generates immediates with local storage void UlamTypePrimitive::genUlamTypeMangledDefinitionForC(File * fp) { u32 len = getTotalBitSize(); //could be 0, includes arrays m_state.m_currentIndentLevel = 0; UTI anyuti = Nav; AssertBool anyDefined = m_state.anyDefinedUTI(m_key, anyuti); assert(anyDefined); UTI scalaruti = m_state.getUlamTypeAsScalar(anyuti); UlamType * scalarut = m_state.getUlamTypeByIndex(scalaruti); const std::string scalarmangledName = scalarut->getUlamTypeMangledName(); const std::string mangledName = getUlamTypeImmediateMangledName(); const std::string automangledName = getUlamTypeImmediateAutoMangledName(); std::ostringstream ud; ud << "Ud_" << mangledName; //d for define (p used for atomicparametrictype) std::string udstr = ud.str(); m_state.indent(fp); fp->write("#ifndef "); fp->write(udstr.c_str()); fp->write("\n"); m_state.indent(fp); fp->write("#define "); fp->write(udstr.c_str()); fp->write("\n"); m_state.indent(fp); fp->write("namespace MFM{\n"); fp->write("\n"); m_state.m_currentIndentLevel++; m_state.indent(fp); fp->write("template<class EC>\n"); m_state.indent(fp); fp->write("struct "); fp->write(mangledName.c_str()); fp->write(" : public "); fp->write("BitVectorBitStorage"); fp->write("<EC, BitVector<"); fp->write_decimal_unsigned(len); fp->write("u> >\n"); m_state.indent(fp); fp->write("{\n"); m_state.m_currentIndentLevel++; //typedef atomic parameter type inside struct UlamType::genStandardConfigTypedefTypenames(fp, m_state); m_state.indent(fp); fp->write("typedef BitVector<"); fp->write_decimal_unsigned(len); fp->write("> BV;"); GCNL; m_state.indent(fp); fp->write("typedef BitVectorBitStorage<EC, BV> BVS;"); GCNL; fp->write("\n"); //put read/write methods before constructrtors that may use them. //read BV method genUlamTypeReadDefinitionForC(fp); //write BV method genUlamTypeWriteDefinitionForC(fp); //default constructor (used by local vars) m_state.indent(fp); fp->write(mangledName.c_str()); fp->write("() { }"); GCNL; //constructor here (used by const tmpVars) m_state.indent(fp); fp->write(mangledName.c_str()); fp->write("(const "); fp->write(getTmpStorageTypeAsString().c_str()); //u32, u64 fp->write(" d) { "); fp->write("write(d); }"); GCNL; //array initialization constructor here (used by const tmpVars); // in C, the array is just a pointer (since not within a struct); if(!isScalar()) { m_state.indent(fp); fp->write(mangledName.c_str()); fp->write("(const u32"); fp->write(" d["); fp->write_decimal_unsigned(UlamType::getTotalNumberOfWords()); fp->write("]) : BVS(d) { }"); GCNL; } //copy constructor here (return by value) m_state.indent(fp); fp->write(mangledName.c_str()); fp->write("(const "); fp->write(mangledName.c_str()); //u32 fp->write("& other) { "); fp->write("this->write"); fp->write("(other."); fp->write("read"); fp->write("()); }"); GCNL; //constructor from ref of same type m_state.indent(fp); fp->write(mangledName.c_str()); fp->write("(const "); fp->write(automangledName.c_str()); fp->write("<EC>& d) { "); //uc consistent with atomref fp->write("this->write("); fp->write("d.read()); }"); GCNL; //default destructor (intentionally left out //for var args native funcs, non-refs, required of a BitStorage UlamType::genGetUlamTypeMangledNameDefinitionForC(fp); m_state.m_currentIndentLevel--; m_state.indent(fp); fp->write("};\n"); m_state.m_currentIndentLevel--; m_state.indent(fp); fp->write("} //MFM\n"); m_state.indent(fp); fp->write("#endif /*"); fp->write(udstr.c_str()); fp->write(" */\n\n"); } //genUlamTypeMangledDefinitionForC