const std::string UlamType::getUlamTypeMangledType() { // e.g. parsing overloaded functions, may not be complete. std::ostringstream mangled; s32 bitsize = getBitSize(); s32 arraysize = getArraySize(); if(isReference()) //includes ALT_ARRAYITEM (t3147); not isAltRefType (t3114) mangled << "r"; //e.g. t3114 if(arraysize > 0) mangled << ToLeximitedNumber(arraysize); // else if(arraysize == 0) // mangled << ToLeximitedNumber(-1); //distinct from scalar else mangled << 10; //scalar NONARRAYSIZE if(bitsize > 0) mangled << ToLeximitedNumber(bitsize); else mangled << 10; std::string ecode(UlamType::getUlamTypeEnumCodeChar(getUlamTypeEnum())); mangled << ToLeximited(ecode).c_str(); return mangled.str(); } //getUlamTypeMangledType
const std::string UlamTypePrimitive::getUlamTypeMangledType() { // e.g. parsing overloaded functions, may not be complete. std::ostringstream mangled; s32 bitsize = getBitSize(); s32 arraysize = getArraySize(); if(isReference()) //includes ALT_ARRAYITEM (t3147) mangled << "r"; if(arraysize > 0) mangled << ToLeximitedNumber(arraysize); else mangled << 10; if(bitsize > 0) mangled << ToLeximitedNumber(bitsize); else mangled << 10; std::string ecode(UlamTypePrimitive::getUlamTypeEnumCodeChar(getUlamTypeEnum())); mangled << ToLeximited(ecode).c_str(); return mangled.str(); } //getUlamTypeMangledType
//static: return false if all zeros, o.w. true; rtnstr updated bool SymbolWithValue::getLexValueAsString(u32 ntotbits, const BV8K& bval, std::string& rtnstr) { //like the code generated in CS::genCodeClassDefaultConstantArray u32 uvals[ARRAY_LEN8K]; bval.ToArray(uvals); u32 nwords = (ntotbits + 31)/MAXBITSPERINT; //short-circuit if all zeros bool isZero = true; s32 x = nwords - 1; for(; x >= 0; x--) { if(uvals[x] != 0) { isZero = false; break; } } if(isZero) { rtnstr = "10"; //all zeros return false; } //compress to output only non-zero uval items (left-justified) nwords = (u32) x + 1; std::ostringstream ostream; //output number of non-zero words first ostream << ToLeximitedNumber(nwords); for(u32 i = 0; i < nwords; i++) { ostream << ToLeximitedNumber(uvals[i]); //no spaces } rtnstr = ostream.str(); return true; } //getLexValueAsString
bool SymbolWithValue::convertValueToALexString(u64 varg, UTI tuti, std::string& vstr, CompilerState & state) { //UTI tuti = getUlamTypeIdx(); UlamType * tut = state.getUlamTypeByIndex(tuti); s32 bs = tut->getBitSize(); ULAMTYPE etyp = tut->getUlamTypeEnum(); switch(etyp) { case Int: { if(bs <= MAXBITSPERINT) { s32 sval = _Int32ToInt32((u32) varg, bs, MAXBITSPERINT); vstr = ToLeximitedNumber(sval); } else if(bs <= MAXBITSPERLONG) { s64 sval = _Int64ToInt64(varg, bs, MAXBITSPERLONG); vstr = ToLeximitedNumber64(sval); } else state.abortGreaterThanMaxBitsPerLong(); } break; case Bool: { bool bval = _Bool64ToCbool(varg, bs); if(bval) vstr = ToLeximitedNumber(1); //true else vstr = ToLeximitedNumber(0); //false } break; case Unary: { s32 pval = _Unary64ToInt64(varg, bs, MAXBITSPERINT); vstr = ToLeximitedNumber(pval); } break; case Unsigned: case Bits: { if( bs <= MAXBITSPERINT) vstr = ToLeximitedNumber((u32) varg); else if( bs <= MAXBITSPERLONG) vstr = ToLeximitedNumber64(varg); else state.abortGreaterThanMaxBitsPerLong(); } break; case String: { std::ostringstream fhex; std::string fstr = state.getDataAsUnFormattedUserString((u32) varg); u32 flen = fstr.length() - 1; //exclude null terminator for(u32 i = 0; i < flen; i++) fhex << std::hex << std::setfill('0') << std::setw(2) << (u32) fstr[i]; vstr = fhex.str(); } break; default: state.abortUndefinedUlamPrimitiveType(); }; return true; } //convertValueToLexString (static helper)