diff --git a/src/V3AstAttr.h b/src/V3AstAttr.h index fecf234f0..a7326bae4 100644 --- a/src/V3AstAttr.h +++ b/src/V3AstAttr.h @@ -1035,6 +1035,16 @@ public: bool isWritable() const VL_MT_SAFE { return m_e == OUTPUT || m_e == INOUT || m_e == REF; } bool isRef() const VL_MT_SAFE { return m_e == REF; } bool isConstRef() const VL_MT_SAFE { return m_e == CONSTREF; } + string traceSigDirection() const { + if (isInout()) { + return "VerilatedTraceSigDirection::INOUT"; + } else if (isWritable()) { + return "VerilatedTraceSigDirection::OUTPUT"; + } else if (isNonOutput()) { + return "VerilatedTraceSigDirection::INPUT"; + } + return "VerilatedTraceSigDirection::NONE"; + } }; constexpr bool operator==(const VDirection& lhs, const VDirection& rhs) VL_MT_SAFE { return lhs.m_e == rhs.m_e; diff --git a/src/V3AstNodeDType.h b/src/V3AstNodeDType.h index 4eafbbeae..cb4a1594f 100644 --- a/src/V3AstNodeDType.h +++ b/src/V3AstNodeDType.h @@ -129,6 +129,7 @@ public: // Ideally an IEEE $typename virtual string prettyDTypeName(bool) const { return prettyTypeName(); } string prettyDTypeNameQ() const { return "'" + prettyDTypeName(false) + "'"; } + virtual string cDTypeName() const { return ""; } // // Changing the width may confuse the data type resolution, so must clear // TypeTable cache after use. @@ -220,7 +221,19 @@ public: return elementsConst() * subDTypep()->widthTotalBytes(); } inline int left() const VL_MT_STABLE; + string cLeft() const { + std::ostringstream os; + if (left() < 0) os << "__02D"; + os << abs(left()); + return os.str(); + } inline int right() const VL_MT_STABLE; + string cRight() const { + std::ostringstream os; + if (right() < 0) os << "__02D"; + os << abs(right()); + return os.str(); + } inline int hi() const VL_MT_STABLE; inline int lo() const VL_MT_STABLE; inline int elementsConst() const VL_MT_STABLE; @@ -259,6 +272,7 @@ public: void dump(std::ostream& str) const override; void dumpJson(std::ostream& str) const override; string prettyDTypeName(bool) const override; + string cDTypeName() const override; bool isCompound() const override { return !packed(); } // For basicp() we reuse the size to indicate a "fake" basic type of same size AstBasicDType* basicp() const override VL_MT_STABLE { @@ -433,6 +447,7 @@ public: bool similarDTypeNode(const AstNodeDType* samep) const override; string name() const override VL_MT_STABLE { return m.m_keyword.ascii(); } string prettyDTypeName(bool full) const override; + string cDTypeName() const override; const char* broken() const override { BROKEN_RTN(dtypep() != this); BROKEN_RTN(v3Global.widthMinUsage() == VWidthMinUsage::VERILOG_WIDTH @@ -496,7 +511,19 @@ public: inline int lo() const; inline int elements() const; int left() const { return ascending() ? lo() : hi(); } // How to show a declaration + string cLeft() const { + std::ostringstream os; + if (left() < 0) os << "__02D"; + os << abs(left()); + return os.str(); + } int right() const { return ascending() ? hi() : lo(); } + string cRight() const { + std::ostringstream os; + if (right() < 0) os << "__02D"; + os << abs(right()); + return os.str(); + } inline bool ascending() const; bool implicit() const { return keyword() == VBasicDTypeKwd::LOGIC_IMPLICIT; } bool untyped() const { return keyword() == VBasicDTypeKwd::UNTYPED; } @@ -1210,6 +1237,9 @@ public: string prettyDTypeName(bool full) const override { return subDTypep() ? prettyName(subDTypep()->prettyDTypeName(full)) : prettyName(); } + string cDTypeName() const override { + return subDTypep() ? subDTypep()->cDTypeName() : cDTypeName(); + } AstBasicDType* basicp() const override VL_MT_STABLE { return subDTypep() ? subDTypep()->basicp() : nullptr; } @@ -1421,6 +1451,7 @@ public: inline AstPackArrayDType(FileLine* fl, AstNodeDType* dtp, AstRange* rangep); ASTGEN_MEMBERS_AstPackArrayDType; string prettyDTypeName(bool full) const override; + string cDTypeName() const override; bool isCompound() const override { return false; } }; class AstUnpackArrayDType final : public AstNodeArrayDType { @@ -1448,6 +1479,7 @@ public: } ASTGEN_MEMBERS_AstUnpackArrayDType; string prettyDTypeName(bool full) const override; + string cDTypeName() const override; bool sameNode(const AstNode* samep) const override { const AstUnpackArrayDType* const sp = VN_DBG_AS(samep, UnpackArrayDType); return m_isCompound == sp->m_isCompound; diff --git a/src/V3AstNodeExpr.h b/src/V3AstNodeExpr.h index cd6d9c71d..9d76b92d5 100644 --- a/src/V3AstNodeExpr.h +++ b/src/V3AstNodeExpr.h @@ -4344,6 +4344,7 @@ public: string selfPointerProtect(bool useSelfForThis) const { return selfPointer().protect(useSelfForThis, protect()); } + bool maybePointedTo() const override VL_MT_SAFE { return true; } }; class AstCMethodCall final : public AstNodeCCall { // C++ method call diff --git a/src/V3AstNodeOther.h b/src/V3AstNodeOther.h index 96ae9ee88..e39a891bb 100644 --- a/src/V3AstNodeOther.h +++ b/src/V3AstNodeOther.h @@ -2048,7 +2048,7 @@ public: string dpiTmpVarType(const string& varName) const; // Return Verilator internal type for argument: CData, SData, IData, WData string vlArgType(bool named, bool forReturn, bool forFunc, const string& namespc = "", - bool asRef = false) const; + bool asRef = false, bool constRef = false) const; string vlEnumType() const; // Return VerilatorVarType: VLVT_UINT32, etc string vlEnumDir() const; // Return VerilatorVarDir: VLVD_INOUT, etc string vlPropDecl(const string& propName) const; // Return VerilatorVarProps declaration @@ -2262,6 +2262,8 @@ class AstVarScope final : public AstNode { // @astgen ptr := m_varp : Optional[AstVar] // [AfterLink] Pointer to variable itself bool m_trace : 1; // Tracing is turned on for this scope bool m_optimizeLifePost : 1; // One half of an NBA pair using ShadowVariable scheme. Optimize. + // NOCOMMIT -- is this the right way? + bool m_tracePreserve : 1; // Preserve for trace logic public: AstVarScope(FileLine* fl, AstScope* scopep, AstVar* varp) : ASTGEN_SUPER_VarScope(fl) @@ -2271,6 +2273,7 @@ public: UASSERT_OBJ(varp, fl, "Var must be non-null"); m_trace = true; m_optimizeLifePost = false; + m_tracePreserve = false; dtypeFrom(varp); } ASTGEN_MEMBERS_AstVarScope; @@ -2293,6 +2296,8 @@ public: void trace(bool flag) { m_trace = flag; } bool optimizeLifePost() const { return m_optimizeLifePost; } void optimizeLifePost(bool flag) { m_optimizeLifePost = flag; } + bool tracePreserve() const { return m_tracePreserve; } + void tracePreserve(bool tracePreserve) { m_tracePreserve = tracePreserve; } }; // === AstNodeCoverDecl === diff --git a/src/V3AstNodeStmt.h b/src/V3AstNodeStmt.h index 2309a879d..3bb3cf7d3 100644 --- a/src/V3AstNodeStmt.h +++ b/src/V3AstNodeStmt.h @@ -1196,6 +1196,9 @@ class AstTraceDecl final : public AstNodeStmt { // Parents: {statement list} // Expression being traced - Moved to AstTraceInc by V3Trace // @astgen op1 := valuep : Optional[AstNodeExpr] + // + // @astgen ptr := m_dtypeVscp: Optional[AstVarScope] // Var scope for type tracing + // @astgen ptr := m_dtypeCallp: Optional[AstCCall] // Type init function call uint32_t m_code{0}; // Trace identifier code uint32_t m_fidx{0}; // Trace function index const string m_showname; // Name of variable @@ -1203,18 +1206,26 @@ class AstTraceDecl final : public AstNodeStmt { const VNumRange m_arrayRange; // Property of var the trace details const VVarType m_varType; // Type of variable (for localparam vs. param) const VDirection m_declDirection; // Declared direction input/output etc + // NOCOMMIT -- pretty sure something isn't needed here + const bool m_inDtypeFunc; // Trace decl inside type init function + string m_dtypeParamName; // Parameter name for type functions + int m_codeInc{0}; // Code increment for type public: AstTraceDecl(FileLine* fl, const string& showname, AstVar* varp, // For input/output state etc - AstNodeExpr* valuep, const VNumRange& bitRange, const VNumRange& arrayRange) + AstNodeExpr* valuep, const VNumRange& bitRange, const VNumRange& arrayRange, + AstCCall* const dtypeCallp, AstVarScope* const dtypeVscp, const bool inDtypeFunc) : ASTGEN_SUPER_TraceDecl(fl) , m_showname{showname} , m_bitRange{bitRange} , m_arrayRange{arrayRange} , m_varType{varp->varType()} - , m_declDirection{varp->declDirection()} { + , m_declDirection{varp->declDirection()} + , m_inDtypeFunc{inDtypeFunc} { dtypeFrom(valuep); this->valuep(valuep); + this->dtypeCallp(dtypeCallp); + this->dtypeVscp(dtypeVscp); } void dump(std::ostream& str) const override; void dumpJson(std::ostream& str) const override; @@ -1223,14 +1234,16 @@ public: string name() const override VL_MT_STABLE { return m_showname; } bool maybePointedTo() const override VL_MT_SAFE { return true; } bool hasDType() const override VL_MT_SAFE { return true; } - bool sameNode(const AstNode* samep) const override { return false; } + bool sameNode(const AstNode* samep) const override { return true; } string showname() const { return m_showname; } // * = Var name // Details on what we're tracing uint32_t code() const { return m_code; } void code(uint32_t code) { m_code = code; } uint32_t fidx() const { return m_fidx; } void fidx(uint32_t fidx) { m_fidx = fidx; } + void codeInc(uint32_t codeInc) { m_codeInc = codeInc; } uint32_t codeInc() const { + if (m_codeInc) { return m_codeInc; } return (m_arrayRange.ranged() ? m_arrayRange.elements() : 1) * valuep()->dtypep()->widthWords() * (VL_EDATASIZE / 32); // A code is always 32-bits @@ -1239,6 +1252,13 @@ public: const VNumRange& arrayRange() const { return m_arrayRange; } VVarType varType() const { return m_varType; } VDirection declDirection() const { return m_declDirection; } + AstCCall* dtypeCallp() const { return m_dtypeCallp; } + void dtypeCallp(AstCCall* const callp) { m_dtypeCallp = callp; } + AstVarScope* dtypeVscp() const { return m_dtypeVscp; } + void dtypeVscp(AstVarScope* const dtypeVscp) { m_dtypeVscp = dtypeVscp; } + bool inDtypeFunc() const { return m_inDtypeFunc; } + void dtypeParamName(string dtypeParamName) { m_dtypeParamName = dtypeParamName; } + string dtypeParamName() const { return m_dtypeParamName; } }; class AstTraceInc final : public AstNodeStmt { // Trace point dump @@ -1285,15 +1305,19 @@ public: class AstTracePushPrefix final : public AstNodeStmt { const string m_prefix; // Prefix to add to signal names const VTracePrefixType m_prefixType; // Type of prefix being pushed + const bool m_quotedPrefix; // Quote prefix name public: - AstTracePushPrefix(FileLine* fl, const string& prefix, VTracePrefixType prefixType) + AstTracePushPrefix(FileLine* fl, const string& prefix, VTracePrefixType prefixType, + bool quotedPrefix = true) : ASTGEN_SUPER_TracePushPrefix(fl) , m_prefix{prefix} - , m_prefixType{prefixType} {} + , m_prefixType{prefixType} + , m_quotedPrefix{quotedPrefix} {} ASTGEN_MEMBERS_AstTracePushPrefix; bool sameNode(const AstNode* samep) const override { return false; } string prefix() const { return m_prefix; } VTracePrefixType prefixType() const { return m_prefixType; } + bool quotedPrefix() const { return m_quotedPrefix; } }; class AstWait final : public AstNodeStmt { // @astgen op1 := condp : AstNodeExpr diff --git a/src/V3AstNodes.cpp b/src/V3AstNodes.cpp index a2e27245d..6a5295ad1 100644 --- a/src/V3AstNodes.cpp +++ b/src/V3AstNodes.cpp @@ -568,7 +568,7 @@ string AstVar::verilogKwd() const { } string AstVar::vlArgType(bool named, bool forReturn, bool forFunc, const string& namespc, - bool asRef) const { + bool asRef, bool constRef) const { UASSERT_OBJ(!forReturn, this, "Internal data is never passed as return, but as first argument"); string ostatic; @@ -576,7 +576,7 @@ string AstVar::vlArgType(bool named, bool forReturn, bool forFunc, const string& asRef = asRef || isDpiOpenArray() || (forFunc && (isWritable() || isRef() || isConstRef())); - if (forFunc && isReadOnly() && asRef) ostatic = ostatic + "const "; + if (forFunc && (isReadOnly() || constRef) && asRef) ostatic = ostatic + "const "; string oname; if (named) { @@ -1706,6 +1706,14 @@ string AstBasicDType::prettyDTypeName(bool) const { } return os.str(); } +string AstBasicDType::cDTypeName() const { + std::ostringstream os; + os << keyword().ascii(); + if (isRanged() && !rangep() && keyword().width() <= 1) { + os << "__BRA__" << cLeft() << "__" << cRight() << "__KET__"; + } + return os.str(); +} void AstNodeExpr::dump(std::ostream& str) const { this->AstNode::dump(str); } void AstNodeExpr::dumpJson(std::ostream& str) const { dumpJsonGen(str); } @@ -2368,6 +2376,7 @@ string AstNodeUOrStructDType::prettyDTypeName(bool full) const { result += "}" + prettyName(); return result; } +string AstNodeUOrStructDType::cDTypeName() const { return verilogKwd() + "__" + name(); } void AstNodeDType::dump(std::ostream& str) const { this->AstNode::dump(str); if (generic()) str << " [GENERIC]"; @@ -2426,6 +2435,25 @@ string AstUnpackArrayDType::prettyDTypeName(bool full) const { os << subp->prettyDTypeName(full) << "$" << ranges; return os.str(); } +// NOCOMMIT -- copypastaed from prettyDTypeName() -- is there a better way? encodeName()? name()? +string AstPackArrayDType::cDTypeName() const { + std::ostringstream os; + if (const auto subp = subDTypep()) os << subp->cDTypeName(); + os << "__BRA__" + cLeft() + "__" + cRight() + "__KET__"; + return os.str(); +} +string AstUnpackArrayDType::cDTypeName() const { + std::ostringstream os; + string ranges = "__BRA__" + cLeft() + "__" + cRight() + "__KET__"; + // See above re: $ + AstNodeDType* subp = subDTypep()->skipRefp(); + while (AstUnpackArrayDType* adtypep = VN_CAST(subp, UnpackArrayDType)) { + ranges += "__BRA__" + adtypep->cLeft() + "__" + adtypep->cRight() + "__KET__"; + subp = adtypep->subDTypep()->skipRefp(); + } + os << subp->cDTypeName() << "__024__" << ranges; + return os.str(); +} std::vector AstUnpackArrayDType::unpackDimensions() { std::vector dims; for (AstUnpackArrayDType* unpackp = this; unpackp;) { @@ -3092,6 +3120,7 @@ void AstStop::dumpJson(std::ostream& str) const { void AstTraceDecl::dump(std::ostream& str) const { this->AstNodeStmt::dump(str); if (code()) str << " [code=" << code() << "]"; + if (dtypeCallp()) str << " [dtypeCallp=" << dtypeCallp() << "]"; } void AstTraceDecl::dumpJson(std::ostream& str) const { dumpJsonNumFunc(str, code); diff --git a/src/V3Dead.cpp b/src/V3Dead.cpp index d6edab26b..744694e46 100644 --- a/src/V3Dead.cpp +++ b/src/V3Dead.cpp @@ -287,7 +287,7 @@ class DeadVisitor final : public VNVisitor { iterateChildren(nodep); checkAll(nodep); if (nodep->scopep()) nodep->scopep()->user1Inc(); - if (mightElimVar(nodep->varp())) m_vscsp.push_back(nodep); + if (!nodep->tracePreserve() && mightElimVar(nodep->varp())) m_vscsp.push_back(nodep); } void visit(AstVar* nodep) override { iterateChildren(nodep); diff --git a/src/V3DfgOptimizer.cpp b/src/V3DfgOptimizer.cpp index bd3a89578..de79abcae 100644 --- a/src/V3DfgOptimizer.cpp +++ b/src/V3DfgOptimizer.cpp @@ -261,7 +261,8 @@ class DataflowOptimize final { if (AstVarScope* const vscp = VN_CAST(nodep, VarScope)) { const AstVar* const varp = vscp->varp(); // Force and trace have already been processed - const bool hasExtRd = varp->isPrimaryIO() || varp->isSigUserRdPublic(); + const bool hasExtRd = varp->isPrimaryIO() || varp->isSigUserRdPublic() + || vscp->tracePreserve(); const bool hasExtWr = varp->isPrimaryIO() || varp->isSigUserRWPublic(); if (hasExtRd) DfgVertexVar::setHasExtRdRefs(vscp); if (hasExtWr) DfgVertexVar::setHasExtWrRefs(vscp); diff --git a/src/V3EmitCImp.cpp b/src/V3EmitCImp.cpp index c6b213240..62f3c8a30 100644 --- a/src/V3EmitCImp.cpp +++ b/src/V3EmitCImp.cpp @@ -624,6 +624,16 @@ class EmitCTrace final : public EmitCFunc { } void emitTraceInitOne(const AstTraceDecl* nodep, int enumNum) { + std::string direction; + direction = nodep->declDirection().traceSigDirection(); + + AstCCall* const callp = nodep->dtypeCallp(); + if (callp) { + callp->argTypes(callp->argTypes() + ", " + cvtToStr(nodep->fidx()) + ", c+" + + cvtToStr(nodep->code()) + "-1, " + direction); + return; + } + if (nodep->dtypep()->basicp()->isDouble()) { puts("tracep->declDouble("); } else if (nodep->isWide()) { @@ -644,7 +654,11 @@ class EmitCTrace final : public EmitCFunc { // Function index puts(","); - puts(cvtToStr(nodep->fidx())); + if (nodep->inDtypeFunc()) { + puts("fidx"); + } else { + puts(cvtToStr(nodep->fidx())); + } // Name puts(","); @@ -654,14 +668,10 @@ class EmitCTrace final : public EmitCFunc { puts("," + cvtToStr(enumNum)); // Direction - if (nodep->declDirection().isInout()) { - puts(", VerilatedTraceSigDirection::INOUT"); - } else if (nodep->declDirection().isWritable()) { - puts(", VerilatedTraceSigDirection::OUTPUT"); - } else if (nodep->declDirection().isNonOutput()) { - puts(", VerilatedTraceSigDirection::INPUT"); + if (nodep->inDtypeFunc()) { + puts(", direction"); } else { - puts(", VerilatedTraceSigDirection::NONE"); + puts(", " + direction); } // Kind @@ -752,16 +762,7 @@ class EmitCTrace final : public EmitCFunc { puts("VL_SC_BV_DATAP("); } iterateConst(varrefp); // Put var name out - // Tracing only supports 1D arrays - if (nodep->declp()->arrayRange().ranged()) { - if (arrayindex == -2) { - puts("[i]"); - } else if (arrayindex == -1) { - puts("[0]"); - } else { - puts("[" + cvtToStr(arrayindex) + "]"); - } - } + emitTraceIndex(nodep, arrayindex); if (varp->isSc()) puts(".read()"); if (emitTraceIsScUint(nodep)) { puts(nodep->isQuad() ? ".to_uint64()" : ".to_uint()"); @@ -774,10 +775,24 @@ class EmitCTrace final : public EmitCFunc { } else { puts("("); iterateConst(nodep->valuep()); + emitTraceIndex(nodep, arrayindex); puts(")"); } } + void emitTraceIndex(const AstTraceInc* const nodep, int arrayindex) { + // Tracing only supports 1D arrays + if (nodep->declp()->arrayRange().ranged()) { + if (arrayindex == -2) { + puts("[i]"); + } else if (arrayindex == -1) { + puts("[0]"); + } else { + puts("[" + cvtToStr(arrayindex) + "]"); + } + } + } + // VISITORS using EmitCFunc::visit; // Suppress hidden overloaded virtual function warning void visit(AstCFunc* nodep) override { @@ -797,7 +812,11 @@ class EmitCTrace final : public EmitCFunc { } void visit(AstTracePushPrefix* nodep) override { putns(nodep, "tracep->pushPrefix("); - putsQuoted(VIdProtect::protectWordsIf(nodep->prefix(), nodep->protect())); + if (nodep->quotedPrefix()) { + putsQuoted(VIdProtect::protectWordsIf(nodep->prefix(), nodep->protect())); + } else { + puts(nodep->prefix()); + } puts(", VerilatedTracePrefixType::"); puts(nodep->prefixType().ascii()); puts(");\n"); diff --git a/src/V3Gate.cpp b/src/V3Gate.cpp index f6e5a9198..a2d821c0b 100644 --- a/src/V3Gate.cpp +++ b/src/V3Gate.cpp @@ -429,11 +429,12 @@ class GateOkVisitor final : public VNVisitorConst { // We only allow a LHS ref for the var being set, and a RHS ref for // something else being read. + AstVarScope* const vscp = nodep->varScopep(); if (nodep->access().isWriteOnly()) { + if (vscp->tracePreserve()) clearSimple("Needed for tracing"); if (m_lhsVarRef) clearSimple(">1 write refs"); m_lhsVarRef = nodep; } else { - AstVarScope* const vscp = nodep->varScopep(); // TODO: possible bug, should it be >= 1 as add is below? if (m_readVscps.size() > 1) { if (m_buffersOnly) clearSimple(">1 rhs varRefs"); diff --git a/src/V3Trace.cpp b/src/V3Trace.cpp index 41901cb32..ca7cbfae0 100644 --- a/src/V3Trace.cpp +++ b/src/V3Trace.cpp @@ -39,16 +39,20 @@ #include "V3Trace.h" +#include "V3Ast.h" #include "V3DupFinder.h" #include "V3EmitCBase.h" #include "V3Graph.h" #include "V3Stats.h" +#include "V3UniqueNames.h" #include #include +#include VL_DEFINE_DEBUG_FUNCTIONS; +// NOCOMMIT -- do runtime bake off //###################################################################### // Graph vertexes @@ -183,6 +187,15 @@ class TraceVisitor final : public VNVisitor { V3Graph m_graph; // Var/CFunc tracking TraceActivityVertex* const m_alwaysVtxp; // "Always trace" vertex bool m_finding = false; // Pass one of algorithm? + struct DtypeFuncs final { + public: + AstCFunc* fullFuncp = nullptr; + AstCFunc* chgFuncp = nullptr; + }; + std::unordered_map + m_dtypeNonConstFuncs; // Full / Chg funcs per type + std::unordered_map m_dtypeConstFuncs; // Const func per type + V3UniqueNames m_dtypeNames{""}; // Unique type func names // Trace parallelism. Only VCD tracing can be parallelized at this time. const uint32_t m_parallelism @@ -207,13 +220,13 @@ class TraceVisitor final : public VNVisitor { // Hash all of the traced values and find if there are any duplicates for (V3GraphVertex& vtx : m_graph.vertices()) { if (TraceTraceVertex* const vvertexp = vtx.cast()) { - const AstTraceDecl* const nodep = vvertexp->nodep(); + AstTraceDecl* const nodep = vvertexp->nodep(); UASSERT_OBJ(!vvertexp->duplicatep(), nodep, "Should not be a duplicate"); - const auto dupit = dupFinder.findDuplicate(nodep->valuep()); + const auto dupit = dupFinder.findDuplicate(nodep); if (dupit == dupFinder.end()) { - dupFinder.insert(nodep->valuep()); + dupFinder.insert(nodep); } else { - const AstTraceDecl* const dupDeclp = VN_AS(dupit->second->backp(), TraceDecl); + const AstTraceDecl* const dupDeclp = VN_AS(dupit->second, TraceDecl); UASSERT_OBJ(dupDeclp, nodep, "Trace duplicate of wrong type"); TraceTraceVertex* const dupvertexp = dupDeclp->user1u().toGraphVertex()->cast(); @@ -484,11 +497,11 @@ class TraceVisitor final : public VNVisitor { } AstCFunc* newCFunc(VTraceType traceType, AstCFunc* topFuncp, uint32_t funcNum, - uint32_t baseCode = 0) { + uint32_t baseCode = 0, const AstTraceDecl* const declp = nullptr) { // Create new function - const bool isTopFunc = topFuncp == nullptr; + const bool isTopFunc = !declp && topFuncp == nullptr; std::string funcName; - if (isTopFunc) { + if (isTopFunc || declp) { if (traceType == VTraceType::CONSTANT) { funcName = "trace_const"; } else if (traceType == VTraceType::FULL) { @@ -500,8 +513,14 @@ class TraceVisitor final : public VNVisitor { funcName = topFuncp->name(); funcName += "_sub"; } - funcName += "_"; - funcName += cvtToStr(funcNum); + if (declp) { + funcName += "_dtype_"; + funcName += declp->valuep()->dtypep()->cDTypeName(); + funcName = m_dtypeNames.get(funcName); + } else { + funcName += "_"; + funcName += cvtToStr(funcNum); + } FileLine* const flp = m_topScopep->fileline(); AstCFunc* const funcp = new AstCFunc{flp, funcName, m_topScopep}; @@ -514,7 +533,8 @@ class TraceVisitor final : public VNVisitor { m_topScopep->addBlocksp(funcp); const std::string bufArg = v3Global.opt.traceClassBase() - + "::" + (v3Global.opt.useTraceOffload() ? "OffloadBuffer" : "Buffer") + "* bufp"; + + "::" + (v3Global.opt.useTraceOffload() ? "OffloadBuffer" : "Buffer") + "* bufp" + + (declp ? (", uint32_t offset, " + declp->dtypeParamName()) : ""); if (isTopFunc) { // Top functions funcp->argTypes("void* voidSelf, " + bufArg); @@ -549,35 +569,62 @@ class TraceVisitor final : public VNVisitor { if (traceType != VTraceType::CHANGE) { // Full dump sub function funcp->addStmtsp(new AstCStmt{flp, // - "uint32_t* const oldp VL_ATTR_UNUSED = " - "bufp->oldp(vlSymsp->__Vm_baseCode);\n"}); + string("uint32_t* const oldp VL_ATTR_UNUSED = " + "bufp->oldp(vlSymsp->__Vm_baseCode") + + (declp ? " + offset - 1" : "") + ");\n"}); } else { // Change dump sub function if (v3Global.opt.useTraceOffload()) { - funcp->addStmtsp(new AstCStmt{flp, // - "const uint32_t base VL_ATTR_UNUSED = " - "vlSymsp->__Vm_baseCode + " - + cvtToStr(baseCode) + ";\n"}); + funcp->addStmtsp( + new AstCStmt{flp, // + "const uint32_t base VL_ATTR_UNUSED = " + "vlSymsp->__Vm_baseCode + " + + (declp ? " offset - 1" : cvtToStr(baseCode)) + ";\n"}); funcp->addStmtsp( new AstCStmt{flp, "(void)bufp; // Prevent unused variable warning\n"}); } else { - funcp->addStmtsp(new AstCStmt{flp, // - "uint32_t* const oldp VL_ATTR_UNUSED = " - "bufp->oldp(vlSymsp->__Vm_baseCode + " - + cvtToStr(baseCode) + ");\n"}); + funcp->addStmtsp( + new AstCStmt{flp, // + "uint32_t* const oldp VL_ATTR_UNUSED = " + "bufp->oldp(vlSymsp->__Vm_baseCode + " + + (declp ? " offset - 1" : cvtToStr(baseCode)) + ");\n"}); } } - // Add call to top function - AstCCall* const callp = new AstCCall{funcp->fileline(), funcp}; - callp->dtypeSetVoid(); - callp->argTypes("bufp"); - topFuncp->addStmtsp(callp->makeStmt()); + if (!declp) { + // Add call to top function + AstCCall* const callp = new AstCCall{funcp->fileline(), funcp}; + callp->dtypeSetVoid(); + callp->argTypes("bufp"); + topFuncp->addStmtsp(callp->makeStmt()); + } } // Done UINFO(5, " newCFunc " << funcp); return funcp; } + AstCFunc* createConstDtypeTraceFunctions(const AstTraceDecl* declp) { + const AstNodeDType* const dtypep = declp->valuep()->dtypep()->skipRefp(); + auto pair = m_dtypeConstFuncs.emplace(dtypep, nullptr); + if (pair.second) { + FileLine* const flp = declp->fileline(); + AstCFunc* const funcp = newCFunc(VTraceType::CONSTANT, nullptr, 0, 0, declp); + + for (AstNode* stmtp = declp->dtypeCallp()->funcp()->stmtsp(); stmtp; + stmtp = stmtp->nextp()) { + if (AstTraceDecl* const fieldDeclp = VN_CAST(stmtp, TraceDecl)) { + AstTraceInc* const incp + = new AstTraceInc{flp, fieldDeclp, VTraceType::CONSTANT}; + funcp->addStmtsp(incp); + } + } + + pair.first->second = funcp; + } + + return pair.first->second; + } + void createConstTraceFunctions(const TraceVec& traces) { const int splitLimit = v3Global.opt.outputSplitCTrace() ? v3Global.opt.outputSplitCTrace() : std::numeric_limits::max(); @@ -598,6 +645,7 @@ class TraceVisitor final : public VNVisitor { UASSERT_OBJ(canonDeclp->code() != 0, canonDeclp, "Canonical node should have code assigned already"); declp->code(canonDeclp->code()); + declp->dtypeVscp(nullptr); continue; } @@ -620,13 +668,55 @@ class TraceVisitor final : public VNVisitor { ++subFuncNum; } FileLine* const flp = declp->fileline(); - AstTraceInc* const incp = new AstTraceInc{flp, declp, VTraceType::CONSTANT}; - subFuncp->addStmtsp(incp); - subStmts += incp->nodeCount(); + if (declp->dtypeCallp()) { + AstCFunc* const funcp = createConstDtypeTraceFunctions(declp); + AstVarRef* argsp = nullptr; + argsp = AstNode::addNext( + argsp, new AstVarRef{flp, declp->dtypeVscp(), VAccess::READ}); + AstCCall* const callp = new AstCCall{flp, funcp, argsp}; + callp->dtypeSetVoid(); + callp->argTypes(callp->argTypes() + "bufp, " + std::to_string(declp->code())); + subFuncp->addStmtsp(callp->makeStmt()); + + declp->dtypeVscp(nullptr); + + // NOCOMMIT -- ???? + subStmts += 1; + } else { + AstTraceInc* const incp = new AstTraceInc{flp, declp, VTraceType::CONSTANT}; + subFuncp->addStmtsp(incp); + subStmts += incp->nodeCount(); + } } } } + DtypeFuncs createNonConstDtypeTraceFunctions(const AstTraceDecl* declp) { + AstNodeDType* dtypep = declp->valuep()->dtypep()->skipRefp(); + auto pair = m_dtypeNonConstFuncs.emplace(dtypep, DtypeFuncs{}); + if (pair.second) { + FileLine* const flp = declp->fileline(); + AstCFunc* const fullFuncp = newCFunc(VTraceType::FULL, nullptr, 0, 0, declp); + AstCFunc* const chgFuncp = newCFunc(VTraceType::CHANGE, nullptr, 0, 0, declp); + + for (AstNode* stmtp = declp->dtypeCallp()->funcp()->stmtsp(); stmtp; + stmtp = stmtp->nextp()) { + if (AstTraceDecl* const fieldDeclp = VN_CAST(stmtp, TraceDecl)) { + AstTraceInc* const incFullp + = new AstTraceInc{flp, fieldDeclp, VTraceType::FULL}; + fullFuncp->addStmtsp(incFullp); + AstTraceInc* const incChgp + = new AstTraceInc{flp, fieldDeclp, VTraceType::CHANGE}; + chgFuncp->addStmtsp(incChgp); + } + } + + pair.first->second = {.fullFuncp = fullFuncp, .chgFuncp = chgFuncp}; + } + + return pair.first->second; + } + void createNonConstTraceFunctions(const TraceVec& traces, uint32_t nAllCodes, uint32_t parallelism) { const int splitLimit = v3Global.opt.outputSplitCTrace() ? v3Global.opt.outputSplitCTrace() @@ -659,6 +749,7 @@ class TraceVisitor final : public VNVisitor { // function index to the same as the canonical node. if (const TraceTraceVertex* const canonVtxp = vtxp->duplicatep()) { declp->fidx(canonVtxp->nodep()->fidx()); + declp->dtypeVscp(nullptr); continue; } @@ -680,6 +771,7 @@ class TraceVisitor final : public VNVisitor { ifp = nullptr; } + // NOCOMMIT -- is it OK to do this only on the aggregate signal? // If required, create the conditional node checking the activity flags if (!prevActSet || actSet != *prevActSet) { FileLine* const flp = m_topScopep->fileline(); @@ -702,24 +794,53 @@ class TraceVisitor final : public VNVisitor { // Add TraceInc nodes FileLine* const flp = declp->fileline(); - AstTraceInc* const incFulp = new AstTraceInc{flp, declp, VTraceType::FULL}; - subFulFuncp->addStmtsp(incFulp); - AstTraceInc* const incChgp - = new AstTraceInc{flp, declp, VTraceType::CHANGE, baseCode}; - ifp->addThensp(incChgp); + if (declp->dtypeCallp()) { + DtypeFuncs funcs = createNonConstDtypeTraceFunctions(declp); + AstVarRef* argsp = nullptr; + argsp = AstNode::addNext( + argsp, new AstVarRef{flp, declp->dtypeVscp(), VAccess::READ}); + AstCCall* const callFullp = new AstCCall{flp, funcs.fullFuncp, argsp}; + callFullp->dtypeSetVoid(); + callFullp->argTypes(callFullp->argTypes() + "bufp, " + + std::to_string(declp->code())); + subFulFuncp->addStmtsp(callFullp->makeStmt()); + argsp = nullptr; + argsp = AstNode::addNext( + argsp, new AstVarRef{flp, declp->dtypeVscp(), VAccess::READ}); + AstCCall* const callChgp = new AstCCall{flp, funcs.chgFuncp, argsp}; + callChgp->dtypeSetVoid(); + callChgp->argTypes(callChgp->argTypes() + + "bufp, " + // NOCOMMIT -- some kind of two-wrongs off-by-one error + // somewhere: really seems like it should be code() - 1 for + // the chg func (see old chg func) + + std::to_string(declp->code())); + ifp->addThensp(callChgp->makeStmt()); - // Set the function index of the decl - declp->fidx(topFuncNum); + declp->dtypeVscp(nullptr); - // Track splitting due to size - UASSERT_OBJ(incFulp->nodeCount() == incChgp->nodeCount(), declp, - "Should have equal cost"); - const VNumRange range = declp->arrayRange(); - if (range.ranged()) { - // 2x because each element is a TraceInc and a VarRef - subStmts += range.elements() * 2; + // NOCOMMIT -- ???? + subStmts += 2; } else { - subStmts += incChgp->nodeCount(); + AstTraceInc* const incFulp = new AstTraceInc{flp, declp, VTraceType::FULL}; + subFulFuncp->addStmtsp(incFulp); + AstTraceInc* const incChgp + = new AstTraceInc{flp, declp, VTraceType::CHANGE, baseCode}; + ifp->addThensp(incChgp); + + // Set the function index of the decl + declp->fidx(topFuncNum); + + // Track splitting due to size + UASSERT_OBJ(incFulp->nodeCount() == incChgp->nodeCount(), declp, + "Should have equal cost"); + const VNumRange range = declp->arrayRange(); + if (range.ranged()) { + // 2x because each element is a TraceInc and a VarRef + subStmts += range.elements() * 2; + } else { + subStmts += incChgp->nodeCount(); + } } // Track partitioning @@ -899,7 +1020,7 @@ class TraceVisitor final : public VNVisitor { } void visit(AstTraceDecl* nodep) override { UINFO(8, " TRACE " << nodep); - if (!m_finding) { + if (!m_finding && !nodep->inDtypeFunc()) { V3GraphVertex* const vertexp = new TraceTraceVertex{&m_graph, nodep}; nodep->user1p(vertexp); @@ -941,6 +1062,12 @@ public: explicit TraceVisitor(AstNetlist* nodep) : m_alwaysVtxp{new TraceActivityVertex{&m_graph, TraceActivityVertex::ACTIVITY_ALWAYS}} { iterate(nodep); + nodep->foreach([](AstTraceDecl* const declp) { + if (declp->inDtypeFunc()) { + declp->valuep()->unlinkFrBack()->deleteTree(); + declp->valuep(nullptr); + } + }); } ~TraceVisitor() override { V3Stats::addStat("Tracing, Activity setters", m_statSetters); diff --git a/src/V3TraceDecl.cpp b/src/V3TraceDecl.cpp index 86959fc5b..3e862fedb 100644 --- a/src/V3TraceDecl.cpp +++ b/src/V3TraceDecl.cpp @@ -24,13 +24,20 @@ #include "V3TraceDecl.h" +#include "V3Ast.h" #include "V3Control.h" #include "V3EmitCBase.h" +#include "V3Error.h" +#include "V3File.h" +#include "V3Global.h" +#include "V3Number.h" #include "V3Stats.h" +#include "V3UniqueNames.h" #include #include #include +#include #include VL_DEFINE_DEBUG_FUNCTIONS; @@ -90,6 +97,8 @@ public: class TraceDeclVisitor final : public VNVisitor { // NODE STATE + // AstCFunc::user1() // code offset for current type + // AstCFunc::user2() // VarScope for dtype functions // STATE AstTopScope* const m_topScopep; // The singleton AstTopScope @@ -98,6 +107,11 @@ class TraceDeclVisitor final : public VNVisitor { std::vector m_topFuncps; // Top level trace initialization functions std::vector m_subFuncps; // Trace sub functions for this scope std::set m_declUncalledps; // Declarations not called + std::unordered_map m_dtypeFuncs; // Functions per type + AstCFunc* m_dtypeFunc = nullptr; // Current type func + V3UniqueNames m_dtypeNames{""}; // Unique names for dtype funcs + bool m_skipDtypeFunc = false; // Don't create a type func + int m_offset = 0; // Offset for types int m_topFuncSize = 0; // Size of the top function currently being built int m_subFuncSize = 0; // Size of the sub function currently being built const int m_funcSizeLimit // Maximum size of a function @@ -222,6 +236,11 @@ class TraceDeclVisitor final : public VNVisitor { } void addToSubFunc(AstNodeStmt* stmtp) { + // TODO -- sub funcs for dtype components + if (m_dtypeFunc) { + m_dtypeFunc->addStmtsp(stmtp); + return; + } if (m_subFuncSize > m_funcSizeLimit || m_subFuncps.empty()) { m_subFuncSize = 0; // @@ -236,20 +255,49 @@ class TraceDeclVisitor final : public VNVisitor { m_subFuncSize += stmtp->nodeCount(); } - void addTraceDecl(const VNumRange& arrayRange, - int widthOverride) { // If !=0, is packed struct/array where basicp size - // misreflects one element + AstTraceDecl* addTraceDecl(const VNumRange& arrayRange, + int widthOverride, // If !=0, is packed struct/array where basicp + // size misreflects one element + AstCCall* const dtypeCallp = nullptr) { VNumRange bitRange; if (widthOverride) { bitRange = VNumRange{widthOverride - 1, 0}; } else if (const AstBasicDType* const bdtypep = m_traValuep->dtypep()->basicp()) { bitRange = bdtypep->nrange(); } - AstTraceDecl* const newp - = new AstTraceDecl{m_traVscp->fileline(), m_traName, m_traVscp->varp(), - m_traValuep->cloneTree(false), bitRange, arrayRange}; + FileLine* const flp = m_traVscp->fileline(); + AstNodeExpr* valuep = m_traValuep->cloneTree(false); + AstTraceDecl* const newp = new AstTraceDecl{ + flp, m_traName, m_traVscp->varp(), valuep, + bitRange, arrayRange, dtypeCallp, dtypeCallp ? m_traVscp : nullptr, + m_offset != 0}; + // NOCOMMIT -- m_offset and may be redundant with something else here ^ + if (m_offset) { + newp->code(m_offset); + if (!dtypeCallp) { m_offset += newp->codeInc(); } + valuep->foreach([&](AstVarRef* const refp) { + UASSERT_OBJ(refp->varScopep() == m_traVscp, refp, + "Trace decl expression references unexpected var"); + refp->replaceWith(new AstCExpr{flp, VIdProtect::protect(m_traVscp->varp()->name()), + m_traVscp->width()}); + VL_DO_DANGLING(refp->deleteTree(), refp); + }); + } + if (dtypeCallp) { + // NOCOMMIT -- are both necessary? + m_traVscp->tracePreserve(true); + m_traVscp->varp()->trace(true); + m_traVscp->varp()->sigPublic(true); // NOCOMMIT -- this is a lie -- FIX + // NOCOMMIT -- adding this because const and non-const func param names conflict -- + // probably a better way + newp->dtypeParamName(VN_AS(dtypeCallp->funcp()->user2p(), VarScope) + ->varp() + ->vlArgType(true, false, true, "", true, true)); + } m_declUncalledps.emplace(newp); addToSubFunc(newp); + + return newp; } void addIgnore(const string& why) { @@ -421,6 +469,7 @@ class TraceDeclVisitor final : public VNVisitor { = new AstVarRef{m_traVscp->fileline(), m_traVscp, VAccess::READ}; // Recurse into data type of the signal. The visit methods will add // AstTraceDecls. + VL_RESTORER(m_offset); iterate(m_traVscp->varp()->dtypep()->skipRefToEnump()); // Delete reference created above. Traversal cloned it as required. if (m_traValuep) { @@ -503,10 +552,14 @@ class TraceDeclVisitor final : public VNVisitor { // VISITORS - Data types when tracing void visit(AstConstDType* nodep) override { if (!m_traVscp) return; + VL_RESTORER(m_offset); + VL_RESTORER(m_skipDtypeFunc); + m_skipDtypeFunc = true; iterate(nodep->subDTypep()->skipRefToEnump()); } void visit(AstRefDType* nodep) override { if (!m_traVscp) return; + VL_RESTORER(m_offset); iterate(nodep->subDTypep()->skipRefToEnump()); } void visit(AstIfaceRefDType* nodep) override { @@ -518,20 +571,63 @@ class TraceDeclVisitor final : public VNVisitor { addToSubFunc(stmtp); m_ifaceRefInitPlaceholders.emplace_back(m_traVscp, stmtp); } - void visit(AstUnpackArrayDType* nodep) override { - // Note more specific dtypes above - if (!m_traVscp) return; + void newDeclFunc(AstNodeDType* nodep) { + AstNodeDType* const skipTypep = nodep->skipRefp(); + // offset and direction args added in EmitCImp + std::string callArgs{"tracep, \"" + VIdProtect::protect(m_traName) + "\""}; + VL_RESTORER(m_traName); + FileLine* const flp = skipTypep->fileline(); - if (v3Global.opt.traceMaxArray() - && static_cast(nodep->arrayUnpackedElements()) > v3Global.opt.traceMaxArray()) { - addIgnore("Wide memory > --trace-max-array ents"); - return; + auto pair = m_dtypeFuncs.emplace(skipTypep, nullptr); + AstCFunc** funcpp = &pair.first->second; + if (pair.second) { + string dtypeName = skipTypep->cDTypeName(); + const string name{"trace_init_dtype__" + dtypeName}; + // NOCOMMIT -- should we only use V3UniqueNames instead of worrying about cDTypeName()? + *funcpp = newCFunc(flp, m_dtypeNames.get(name)); + (*funcpp)->user2p(m_traVscp); } + AstCCall* const callp = new AstCCall{flp, *funcpp}; + callp->dtypeSetVoid(); + callp->argTypes(callArgs); + AstTraceDecl* const declp = addTraceDecl(VNumRange{}, skipTypep->width(), callp); + addToSubFunc(callp->makeStmt()); + + if (pair.second) { + VL_RESTORER(m_offset); + m_offset = 1; + + VL_RESTORER(m_dtypeFunc); + m_dtypeFunc = *funcpp; + m_dtypeFunc->argTypes(m_dtypeFunc->argTypes() + + ", const char* name, uint32_t fidx, uint32_t c, " + "VerilatedTraceSigDirection direction"); + if (AstStructDType* const dtypep = VN_CAST(skipTypep, StructDType)) { + declStruct(dtypep, true); + } else if (AstUnpackArrayDType* const dtypep = VN_CAST(skipTypep, UnpackArrayDType)) { + declUnpackedArray(dtypep, true); + } else if (AstPackArrayDType* const dtypep = VN_CAST(skipTypep, PackArrayDType)) { + declPackedArray(dtypep, true); + } else { + UASSERT_OBJ(false, skipTypep, "Creating a trace function for an unexpected type"); + } + // Code 0 is a sentinel value + // NOCOMMIT -- handle that ^ so we don't need the -1's?' + m_dtypeFunc->user1(m_offset - 1); + } + + declp->codeInc((*funcpp)->user1()); + m_offset += declp->codeInc(); + } + void declUnpackedArray(AstUnpackArrayDType* const nodep, bool newFunc) { + string prefixName(newFunc ? "name" : m_traName); + VL_RESTORER(m_traName); FileLine* const flp = nodep->fileline(); - addToSubFunc(new AstTracePushPrefix{flp, m_traName, VTracePrefixType::ARRAY_UNPACKED}); + addToSubFunc( + new AstTracePushPrefix{flp, prefixName, VTracePrefixType::ARRAY_UNPACKED, !newFunc}); if (VN_IS(nodep->subDTypep()->skipRefToEnump(), BasicDType) // Nothing lower than this array @@ -559,20 +655,39 @@ class TraceDeclVisitor final : public VNVisitor { addToSubFunc(new AstTracePopPrefix{flp}); } - void visit(AstPackArrayDType* nodep) override { + // NOCOMMIT -- how to handle VL_* macro'ed types? + bool isBasicIO() { + const AstVar* varp = m_traVscp->varp(); + const AstBasicDType* basicp = varp->basicp(); + // NOCOMMIT -- lifted from V3EmitCBase -- AstVar method? + return varp->isIO() && basicp && !basicp->isOpaque(); + } + void visit(AstUnpackArrayDType* nodep) override { + // Note more specific dtypes above if (!m_traVscp) return; - if (!v3Global.opt.traceStructs()) { - // Everything downstream is packed, so deal with as one trace unit. - // This may not be the nicest for user presentation, but is - // a much faster way to trace - addTraceDecl(VNumRange{}, nodep->width()); + if (v3Global.opt.traceMaxArray() + && static_cast(nodep->arrayUnpackedElements()) > v3Global.opt.traceMaxArray()) { + addIgnore("Wide memory > --trace-max-array ents"); return; } + VL_RESTORER(m_skipDtypeFunc); + if (isBasicIO()) m_skipDtypeFunc = true; + + if (m_skipDtypeFunc || m_dtypeFunc) { + declUnpackedArray(nodep, false); + } else { + newDeclFunc(nodep); + } + } + void declPackedArray(AstPackArrayDType* const nodep, bool newFunc) { + string prefixName(newFunc ? "name" : m_traName); + VL_RESTORER(m_traName); FileLine* const flp = nodep->fileline(); - addToSubFunc(new AstTracePushPrefix{flp, m_traName, VTracePrefixType::ARRAY_PACKED}); + addToSubFunc( + new AstTracePushPrefix{flp, prefixName, VTracePrefixType::ARRAY_PACKED, !newFunc}); AstNodeDType* const subtypep = nodep->subDTypep()->skipRefToEnump(); for (int i = nodep->lo(); i <= nodep->hi(); ++i) { @@ -588,23 +703,32 @@ class TraceDeclVisitor final : public VNVisitor { addToSubFunc(new AstTracePopPrefix{flp}); } - void visit(AstStructDType* nodep) override { + void visit(AstPackArrayDType* nodep) override { if (!m_traVscp) return; - if (nodep->packed() && !v3Global.opt.traceStructs()) { - // Everything downstream is packed, so deal with as one trace unit + if (!v3Global.opt.traceStructs()) { + // Everything downstream is packed, so deal with as one trace unit. // This may not be the nicest for user presentation, but is // a much faster way to trace addTraceDecl(VNumRange{}, nodep->width()); return; } - VL_RESTORER(m_traName); - FileLine* const flp = nodep->fileline(); + VL_RESTORER(m_skipDtypeFunc); + if (isBasicIO()) m_skipDtypeFunc = true; + if (m_skipDtypeFunc || m_dtypeFunc) { + declPackedArray(nodep, false); + } else { + newDeclFunc(nodep); + } + } + void declStruct(AstStructDType* const nodep, bool newFunc) { + FileLine* const flp = nodep->fileline(); + string prefixName(newFunc ? "name" : m_traName); if (!nodep->packed()) { - addToSubFunc( - new AstTracePushPrefix{flp, m_traName, VTracePrefixType::STRUCT_UNPACKED}); + addToSubFunc(new AstTracePushPrefix{flp, prefixName, VTracePrefixType::STRUCT_UNPACKED, + !newFunc}); for (const AstMemberDType *itemp = nodep->membersp(), *nextp; itemp; itemp = nextp) { nextp = VN_AS(itemp->nextp(), MemberDType); AstNodeDType* const subtypep = itemp->subDTypep()->skipRefToEnump(); @@ -618,7 +742,8 @@ class TraceDeclVisitor final : public VNVisitor { } addToSubFunc(new AstTracePopPrefix{flp}); } else { - addToSubFunc(new AstTracePushPrefix{flp, m_traName, VTracePrefixType::STRUCT_PACKED}); + addToSubFunc(new AstTracePushPrefix{flp, prefixName, VTracePrefixType::STRUCT_PACKED, + !newFunc}); for (const AstMemberDType *itemp = nodep->membersp(), *nextp; itemp; itemp = nextp) { nextp = VN_AS(itemp->nextp(), MemberDType); AstNodeDType* const subtypep = itemp->subDTypep()->skipRefToEnump(); @@ -633,9 +758,36 @@ class TraceDeclVisitor final : public VNVisitor { addToSubFunc(new AstTracePopPrefix{flp}); } } + void visit(AstStructDType* nodep) override { + if (!m_traVscp) return; + + if (nodep->packed() && !v3Global.opt.traceStructs()) { + // Everything downstream is packed, so deal with as one trace unit + // This may not be the nicest for user presentation, but is + // a much faster way to trace + addTraceDecl(VNumRange{}, nodep->width()); + return; + } + + VL_RESTORER(m_skipDtypeFunc); + if (isBasicIO()) m_skipDtypeFunc = true; + + // Only create sub functions for top-level structs, i.e. don't have struct funcs + // call other struct funcs for child types. This could easily be done for decl funcs + // but full / chg funcs would require copying / aligning data for child types or more + // complicated / wonky / generalized data access. + if (m_skipDtypeFunc || m_dtypeFunc) { + declStruct(nodep, false); + } else { + newDeclFunc(nodep); + } + } void visit(AstUnionDType* nodep) override { if (!m_traVscp) return; + VL_RESTORER(m_skipDtypeFunc); + m_skipDtypeFunc = true; + if (nodep->packed() && !v3Global.opt.traceStructs()) { // Everything downstream is packed, so deal with as one trace unit // This may not be the nicest for user presentation, but is diff --git a/test_regress/t/t_flag_csplit_groups.py b/test_regress/t/t_flag_csplit_groups.py index 1530bf537..ea7025ed3 100755 --- a/test_regress/t/t_flag_csplit_groups.py +++ b/test_regress/t/t_flag_csplit_groups.py @@ -125,7 +125,7 @@ test.file_grep_not(test.obj_dir + "/" + test.vm_prefix + "_classes.mk", "vm_clas test.file_grep_not(test.obj_dir + "/" + test.vm_prefix + "_classes.mk", "vm_classes_2") # Check combine count -test.file_grep(test.stats, r'Node count, CFILE + (\d+)', (272 if test.vltmt else 255)) +test.file_grep(test.stats, r'Node count, CFILE + (\d+)', (276 if test.vltmt else 257)) test.file_grep(test.stats, r'Makefile targets, VM_CLASSES_FAST + (\d+)', 2) test.file_grep(test.stats, r'Makefile targets, VM_CLASSES_SLOW + (\d+)', 2) diff --git a/test_regress/t/t_mem_trace_split.py b/test_regress/t/t_mem_trace_split.py index 14fc22b86..d5c5a9ecf 100755 --- a/test_regress/t/t_mem_trace_split.py +++ b/test_regress/t/t_mem_trace_split.py @@ -15,7 +15,7 @@ test.compile(verilator_flags2=["--trace-vcd", "--trace-structs", "--output-split if test.vlt_all: test.file_grep_count(test.obj_dir + "/V" + test.name + "__Trace__0.cpp", - r'void Vt.*trace_chg_.*sub.*{', 3) + r'void Vt.*trace_chg_.*sub.*{', 3 if test.vltmt else 1) test.execute() diff --git a/test_regress/t/t_trace_type_dupes.out b/test_regress/t/t_trace_type_dupes.out new file mode 100644 index 000000000..0da154e43 --- /dev/null +++ b/test_regress/t/t_trace_type_dupes.out @@ -0,0 +1,1622 @@ +$version Generated by VerilatedVcd $end +$timescale 1ps $end + $scope module top $end + $var wire 1 6$ clk $end + $scope module pkg $end + $var wire 17 O% SUB_ONES [16:0] $end + $var wire 17 P% SUB_ZEROS [16:0] $end + $upscope $end + $scope module t $end + $var wire 1 6$ clk $end + $var wire 32 # cyc [31:0] $end + $var wire 4 $ x [3:0] $end + $scope module the_intf_a $end + $var wire 1 6$ clk $end + $var wire 32 4$ data [31:0] $end + $var wire 32 4$ data_typed [31:0] $end + $upscope $end + $scope module the_intf_b $end + $var wire 1 6$ clk $end + $var wire 32 5$ data [31:0] $end + $var wire 32 5$ data_typed [31:0] $end + $upscope $end + $scope module gen_loop[0] $end + $var wire 32 # loop_cyc [31:0] $end + $scope module the_sub $end + $var wire 1 % a $end + $var wire 1 & b $end + $var wire 1 ' x $end + $var wire 1 ( out_2d_unpacked[0][0] $end + $var wire 1 ) out_2d_unpacked[0][1] $end + $var wire 1 * out_2d_unpacked[0][2] $end + $var wire 1 + out_2d_unpacked[0][3] $end + $var wire 1 , out_2d_unpacked[1][0] $end + $var wire 1 - out_2d_unpacked[1][1] $end + $var wire 1 . out_2d_unpacked[1][2] $end + $var wire 1 / out_2d_unpacked[1][3] $end + $var wire 1 0 out_2d_unpacked[2][0] $end + $var wire 1 1 out_2d_unpacked[2][1] $end + $var wire 1 2 out_2d_unpacked[2][2] $end + $var wire 1 3 out_2d_unpacked[2][3] $end + $var wire 290 4 data [289:0] $end + $var wire 32 # cyc [31:0] $end + $var wire 1 6$ clk $end + $var wire 290 4 the_struct [289:0] $end + $var wire 290 > the_structs[0] [289:0] $end + $var wire 290 H the_structs[1] [289:0] $end + $var wire 290 R the_structs[2] [289:0] $end + $var wire 290 \ the_structs[3] [289:0] $end + $var wire 870 7$ the_packed_structs [869:0] $end + $var wire 3 f the_local_struct [2:0] $end + $var wire 3 S$ const_struct [2:0] $end + $var wire 3 g the_typedefed_struct [2:0] $end + $scope module the_local_unpacked_struct $end + $var wire 1 h field_a $end + $var wire 1 i field_b $end + $var wire 1 j field_c $end + $upscope $end + $var wire 8 k the_local_union [7:0] $end + $var wire 64 l the_logic_array [63:0] $end + $var wire 64 n the_other_logic_array [63:0] $end + $var wire 16 p the_unpacked_array[0] [15:0] $end + $var wire 16 q the_unpacked_array[1] [15:0] $end + $var wire 16 r the_unpacked_array[2] [15:0] $end + $var wire 16 s the_unpacked_array[3] [15:0] $end + $var wire 16 t the_unpacked_array[4] [15:0] $end + $var wire 1 u the_2d_unpacked[0][0] $end + $var wire 1 v the_2d_unpacked[0][1] $end + $var wire 1 w the_2d_unpacked[0][2] $end + $var wire 1 x the_2d_unpacked[0][3] $end + $var wire 1 y the_2d_unpacked[1][0] $end + $var wire 1 z the_2d_unpacked[1][1] $end + $var wire 1 { the_2d_unpacked[1][2] $end + $var wire 1 | the_2d_unpacked[1][3] $end + $var wire 1 } the_2d_unpacked[2][0] $end + $var wire 1 ~ the_2d_unpacked[2][1] $end + $var wire 1 !! the_2d_unpacked[2][2] $end + $var wire 1 "! the_2d_unpacked[2][3] $end + $var wire 8 T$ two_fours [7:0] $end + $var wire 8 U$ two_fours_var [7:0] $end + $scope module unnamedblk1 $end + $var wire 32 #! i [31:0] $end + $upscope $end + $scope module unnamedblk2 $end + $var wire 32 $! i [31:0] $end + $upscope $end + $scope module unnamedblk3 $end + $var wire 32 %! i [31:0] $end + $upscope $end + $scope module unnamedblk4 $end + $var wire 32 &! i [31:0] $end + $scope module unnamedblk5 $end + $var wire 32 '! j [31:0] $end + $upscope $end + $upscope $end + $upscope $end + $upscope $end + $scope module gen_loop[1] $end + $var wire 32 (! loop_cyc [31:0] $end + $scope module the_sub $end + $var wire 1 )! a $end + $var wire 1 *! b $end + $var wire 1 +! x $end + $var wire 1 ,! out_2d_unpacked[0][0] $end + $var wire 1 -! out_2d_unpacked[0][1] $end + $var wire 1 .! out_2d_unpacked[0][2] $end + $var wire 1 /! out_2d_unpacked[0][3] $end + $var wire 1 0! out_2d_unpacked[1][0] $end + $var wire 1 1! out_2d_unpacked[1][1] $end + $var wire 1 2! out_2d_unpacked[1][2] $end + $var wire 1 3! out_2d_unpacked[1][3] $end + $var wire 1 4! out_2d_unpacked[2][0] $end + $var wire 1 5! out_2d_unpacked[2][1] $end + $var wire 1 6! out_2d_unpacked[2][2] $end + $var wire 1 7! out_2d_unpacked[2][3] $end + $var wire 290 8! data [289:0] $end + $var wire 32 (! cyc [31:0] $end + $var wire 1 6$ clk $end + $var wire 290 8! the_struct [289:0] $end + $var wire 290 B! the_structs[0] [289:0] $end + $var wire 290 L! the_structs[1] [289:0] $end + $var wire 290 V! the_structs[2] [289:0] $end + $var wire 290 `! the_structs[3] [289:0] $end + $var wire 870 V$ the_packed_structs [869:0] $end + $var wire 3 j! the_local_struct [2:0] $end + $var wire 3 S$ const_struct [2:0] $end + $var wire 3 k! the_typedefed_struct [2:0] $end + $scope module the_local_unpacked_struct $end + $var wire 1 l! field_a $end + $var wire 1 m! field_b $end + $var wire 1 n! field_c $end + $upscope $end + $var wire 8 o! the_local_union [7:0] $end + $var wire 64 p! the_logic_array [63:0] $end + $var wire 64 r! the_other_logic_array [63:0] $end + $var wire 16 t! the_unpacked_array[0] [15:0] $end + $var wire 16 u! the_unpacked_array[1] [15:0] $end + $var wire 16 v! the_unpacked_array[2] [15:0] $end + $var wire 16 w! the_unpacked_array[3] [15:0] $end + $var wire 16 x! the_unpacked_array[4] [15:0] $end + $var wire 1 y! the_2d_unpacked[0][0] $end + $var wire 1 z! the_2d_unpacked[0][1] $end + $var wire 1 {! the_2d_unpacked[0][2] $end + $var wire 1 |! the_2d_unpacked[0][3] $end + $var wire 1 }! the_2d_unpacked[1][0] $end + $var wire 1 ~! the_2d_unpacked[1][1] $end + $var wire 1 !" the_2d_unpacked[1][2] $end + $var wire 1 "" the_2d_unpacked[1][3] $end + $var wire 1 #" the_2d_unpacked[2][0] $end + $var wire 1 $" the_2d_unpacked[2][1] $end + $var wire 1 %" the_2d_unpacked[2][2] $end + $var wire 1 &" the_2d_unpacked[2][3] $end + $var wire 8 T$ two_fours [7:0] $end + $var wire 8 r$ two_fours_var [7:0] $end + $scope module unnamedblk1 $end + $var wire 32 '" i [31:0] $end + $upscope $end + $scope module unnamedblk2 $end + $var wire 32 (" i [31:0] $end + $upscope $end + $scope module unnamedblk3 $end + $var wire 32 )" i [31:0] $end + $upscope $end + $scope module unnamedblk4 $end + $var wire 32 *" i [31:0] $end + $scope module unnamedblk5 $end + $var wire 32 +" j [31:0] $end + $upscope $end + $upscope $end + $upscope $end + $upscope $end + $scope module gen_loop[2] $end + $var wire 32 ," loop_cyc [31:0] $end + $scope module the_sub $end + $var wire 1 -" a $end + $var wire 1 ." b $end + $var wire 1 /" x $end + $var wire 1 0" out_2d_unpacked[0][0] $end + $var wire 1 1" out_2d_unpacked[0][1] $end + $var wire 1 2" out_2d_unpacked[0][2] $end + $var wire 1 3" out_2d_unpacked[0][3] $end + $var wire 1 4" out_2d_unpacked[1][0] $end + $var wire 1 5" out_2d_unpacked[1][1] $end + $var wire 1 6" out_2d_unpacked[1][2] $end + $var wire 1 7" out_2d_unpacked[1][3] $end + $var wire 1 8" out_2d_unpacked[2][0] $end + $var wire 1 9" out_2d_unpacked[2][1] $end + $var wire 1 :" out_2d_unpacked[2][2] $end + $var wire 1 ;" out_2d_unpacked[2][3] $end + $var wire 290 <" data [289:0] $end + $var wire 32 ," cyc [31:0] $end + $var wire 1 6$ clk $end + $var wire 290 <" the_struct [289:0] $end + $var wire 290 F" the_structs[0] [289:0] $end + $var wire 290 P" the_structs[1] [289:0] $end + $var wire 290 Z" the_structs[2] [289:0] $end + $var wire 290 d" the_structs[3] [289:0] $end + $var wire 870 s$ the_packed_structs [869:0] $end + $var wire 3 n" the_local_struct [2:0] $end + $var wire 3 S$ const_struct [2:0] $end + $var wire 3 o" the_typedefed_struct [2:0] $end + $scope module the_local_unpacked_struct $end + $var wire 1 p" field_a $end + $var wire 1 q" field_b $end + $var wire 1 r" field_c $end + $upscope $end + $var wire 8 s" the_local_union [7:0] $end + $var wire 64 t" the_logic_array [63:0] $end + $var wire 64 v" the_other_logic_array [63:0] $end + $var wire 16 x" the_unpacked_array[0] [15:0] $end + $var wire 16 y" the_unpacked_array[1] [15:0] $end + $var wire 16 z" the_unpacked_array[2] [15:0] $end + $var wire 16 {" the_unpacked_array[3] [15:0] $end + $var wire 16 |" the_unpacked_array[4] [15:0] $end + $var wire 1 }" the_2d_unpacked[0][0] $end + $var wire 1 ~" the_2d_unpacked[0][1] $end + $var wire 1 !# the_2d_unpacked[0][2] $end + $var wire 1 "# the_2d_unpacked[0][3] $end + $var wire 1 ## the_2d_unpacked[1][0] $end + $var wire 1 $# the_2d_unpacked[1][1] $end + $var wire 1 %# the_2d_unpacked[1][2] $end + $var wire 1 &# the_2d_unpacked[1][3] $end + $var wire 1 '# the_2d_unpacked[2][0] $end + $var wire 1 (# the_2d_unpacked[2][1] $end + $var wire 1 )# the_2d_unpacked[2][2] $end + $var wire 1 *# the_2d_unpacked[2][3] $end + $var wire 8 T$ two_fours [7:0] $end + $var wire 8 1% two_fours_var [7:0] $end + $scope module unnamedblk1 $end + $var wire 32 +# i [31:0] $end + $upscope $end + $scope module unnamedblk2 $end + $var wire 32 ,# i [31:0] $end + $upscope $end + $scope module unnamedblk3 $end + $var wire 32 -# i [31:0] $end + $upscope $end + $scope module unnamedblk4 $end + $var wire 32 .# i [31:0] $end + $scope module unnamedblk5 $end + $var wire 32 /# j [31:0] $end + $upscope $end + $upscope $end + $upscope $end + $upscope $end + $scope module gen_loop[3] $end + $var wire 32 0# loop_cyc [31:0] $end + $scope module the_sub $end + $var wire 1 1# a $end + $var wire 1 2# b $end + $var wire 1 3# x $end + $var wire 1 4# out_2d_unpacked[0][0] $end + $var wire 1 5# out_2d_unpacked[0][1] $end + $var wire 1 6# out_2d_unpacked[0][2] $end + $var wire 1 7# out_2d_unpacked[0][3] $end + $var wire 1 8# out_2d_unpacked[1][0] $end + $var wire 1 9# out_2d_unpacked[1][1] $end + $var wire 1 :# out_2d_unpacked[1][2] $end + $var wire 1 ;# out_2d_unpacked[1][3] $end + $var wire 1 <# out_2d_unpacked[2][0] $end + $var wire 1 =# out_2d_unpacked[2][1] $end + $var wire 1 ># out_2d_unpacked[2][2] $end + $var wire 1 ?# out_2d_unpacked[2][3] $end + $var wire 290 @# data [289:0] $end + $var wire 32 0# cyc [31:0] $end + $var wire 1 6$ clk $end + $var wire 290 @# the_struct [289:0] $end + $var wire 290 J# the_structs[0] [289:0] $end + $var wire 290 T# the_structs[1] [289:0] $end + $var wire 290 ^# the_structs[2] [289:0] $end + $var wire 290 h# the_structs[3] [289:0] $end + $var wire 870 2% the_packed_structs [869:0] $end + $var wire 3 r# the_local_struct [2:0] $end + $var wire 3 S$ const_struct [2:0] $end + $var wire 3 s# the_typedefed_struct [2:0] $end + $scope module the_local_unpacked_struct $end + $var wire 1 t# field_a $end + $var wire 1 u# field_b $end + $var wire 1 v# field_c $end + $upscope $end + $var wire 8 w# the_local_union [7:0] $end + $var wire 64 x# the_logic_array [63:0] $end + $var wire 64 z# the_other_logic_array [63:0] $end + $var wire 16 |# the_unpacked_array[0] [15:0] $end + $var wire 16 }# the_unpacked_array[1] [15:0] $end + $var wire 16 ~# the_unpacked_array[2] [15:0] $end + $var wire 16 !$ the_unpacked_array[3] [15:0] $end + $var wire 16 "$ the_unpacked_array[4] [15:0] $end + $var wire 1 #$ the_2d_unpacked[0][0] $end + $var wire 1 $$ the_2d_unpacked[0][1] $end + $var wire 1 %$ the_2d_unpacked[0][2] $end + $var wire 1 &$ the_2d_unpacked[0][3] $end + $var wire 1 '$ the_2d_unpacked[1][0] $end + $var wire 1 ($ the_2d_unpacked[1][1] $end + $var wire 1 )$ the_2d_unpacked[1][2] $end + $var wire 1 *$ the_2d_unpacked[1][3] $end + $var wire 1 +$ the_2d_unpacked[2][0] $end + $var wire 1 ,$ the_2d_unpacked[2][1] $end + $var wire 1 -$ the_2d_unpacked[2][2] $end + $var wire 1 .$ the_2d_unpacked[2][3] $end + $var wire 8 T$ two_fours [7:0] $end + $var wire 8 N% two_fours_var [7:0] $end + $scope module unnamedblk1 $end + $var wire 32 /$ i [31:0] $end + $upscope $end + $scope module unnamedblk2 $end + $var wire 32 0$ i [31:0] $end + $upscope $end + $scope module unnamedblk3 $end + $var wire 32 1$ i [31:0] $end + $upscope $end + $scope module unnamedblk4 $end + $var wire 32 2$ i [31:0] $end + $scope module unnamedblk5 $end + $var wire 32 3$ j [31:0] $end + $upscope $end + $upscope $end + $upscope $end + $upscope $end + $upscope $end + $upscope $end +$enddefinitions $end + + +#0 +b00000000000000000000000000000000 # +b0000 $ +0% +0& +0' +0( +0) +0* +0+ +0, +0- +0. +0/ +00 +01 +02 +03 +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 4 +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 > +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 H +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 R +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \ +b000 f +b000 g +0h +0i +0j +b00000000 k +b0000000000000000000000000000000000000000000000000000000000000000 l +b0000000000000000000000000000000000000000000000000000000000000000 n +b0000000000000000 p +b0000000000000000 q +b0000000000000000 r +b0000000000000000 s +b0000000000000000 t +0u +0v +0w +0x +0y +0z +0{ +0| +0} +0~ +0!! +0"! +b00000000000000000000000000000000 #! +b00000000000000000000000000000000 $! +b00000000000000000000000000000000 %! +b00000000000000000000000000000000 &! +b00000000000000000000000000000000 '! +b00000000000000000000000000000001 (! +0)! +0*! +0+! +0,! +0-! +0.! +0/! +00! +01! +02! +03! +04! +05! +06! +07! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 8! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 B! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 L! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 V! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 `! +b000 j! +b000 k! +0l! +0m! +0n! +b00000000 o! +b0000000000000000000000000000000000000000000000000000000000000000 p! +b0000000000000000000000000000000000000000000000000000000000000000 r! +b0000000000000000 t! +b0000000000000000 u! +b0000000000000000 v! +b0000000000000000 w! +b0000000000000000 x! +0y! +0z! +0{! +0|! +0}! +0~! +0!" +0"" +0#" +0$" +0%" +0&" +b00000000000000000000000000000000 '" +b00000000000000000000000000000000 (" +b00000000000000000000000000000000 )" +b00000000000000000000000000000000 *" +b00000000000000000000000000000000 +" +b00000000000000000000000000000010 ," +0-" +0." +0/" +00" +01" +02" +03" +04" +05" +06" +07" +08" +09" +0:" +0;" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 <" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 F" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 P" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Z" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 d" +b000 n" +b000 o" +0p" +0q" +0r" +b00000000 s" +b0000000000000000000000000000000000000000000000000000000000000000 t" +b0000000000000000000000000000000000000000000000000000000000000000 v" +b0000000000000000 x" +b0000000000000000 y" +b0000000000000000 z" +b0000000000000000 {" +b0000000000000000 |" +0}" +0~" +0!# +0"# +0## +0$# +0%# +0&# +0'# +0(# +0)# +0*# +b00000000000000000000000000000000 +# +b00000000000000000000000000000000 ,# +b00000000000000000000000000000000 -# +b00000000000000000000000000000000 .# +b00000000000000000000000000000000 /# +b00000000000000000000000000000011 0# +01# +02# +03# +04# +05# +06# +07# +08# +09# +0:# +0;# +0<# +0=# +0># +0?# +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 @# +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 J# +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 T# +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ^# +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 h# +b000 r# +b000 s# +0t# +0u# +0v# +b00000000 w# +b0000000000000000000000000000000000000000000000000000000000000000 x# +b0000000000000000000000000000000000000000000000000000000000000000 z# +b0000000000000000 |# +b0000000000000000 }# +b0000000000000000 ~# +b0000000000000000 !$ +b0000000000000000 "$ +0#$ +0$$ +0%$ +0&$ +0'$ +0($ +0)$ +0*$ +0+$ +0,$ +0-$ +0.$ +b00000000000000000000000000000000 /$ +b00000000000000000000000000000000 0$ +b00000000000000000000000000000000 1$ +b00000000000000000000000000000000 2$ +b00000000000000000000000000000000 3$ +b00000100000000110000001000000001 4$ +b00000101000001000000001100000010 5$ +06$ +b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 7$ +b101 S$ +b10101011 T$ +b00000000 U$ +b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 V$ +b00000000 r$ +b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 s$ +b00000000 1% +b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 2% +b00000000 N% +b11111111111111111 O% +b00000000000000000 P% +#10 +b00000000000000000000000000000001 # +1% +b00000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000100000000000000000000000000000001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 4 +b0000000000000000000000000000000100000000000000000000000000000000 l +b0000000000000000000000000111110000000000000000000000000001111011 n +1u +1v +1w +1x +1y +1z +1{ +1| +1} +1~ +1!! +1"! +b00000000000000000000000000000100 #! +b00000000000000000000000000000010 $! +b00000000000000000000000000000101 %! +b00000000000000000000000000000011 &! +b00000000000000000000000000000100 '! +b00000000000000000000000000000010 (! +1)! +1-! +1.! +1/! +10! +14! +b10000000000000000000000000000000100000000000000000000000000000010000000000000000000000000000000110000000000000000000000000000010000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110000010000000001 8! +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 B! +b001 j! +1l! +b00000001 o! +b0000000000000000000000000000001000000000000000000000000000000001 p! +b0000000000000000000000000111110100000000000000000000000001111100 r! +b0000000000000001 t! +b0000000000000001 u! +b0000000000000001 v! +b0000000000000001 w! +b0000000000000001 x! +1y! +1~! +1!" +1"" +1$" +1%" +1&" +b00000000000000000000000000000100 '" +b00000000000000000000000000000010 (" +b00000000000000000000000000000101 )" +b00000000000000000000000000000011 *" +b00000000000000000000000000000100 +" +b00000000000000000000000000000011 ," +11" +14" +16" +17" +19" +b00000000000000000000000000000001000000000000000000000000000000011000000000000000000000000000001000000000000000000000000000000010100000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000100000000010 <" +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 P" +b010 n" +b001 o" +1q" +b00000010 s" +b0000000000000000000000000000001100000000000000000000000000000010 t" +b0000000000000000000000000111111000000000000000000000000001111101 v" +b0000000000000010 x" +b0000000000000010 y" +b0000000000000010 z" +b0000000000000010 {" +b0000000000000010 |" +1}" +1!# +1"# +1$# +1'# +1)# +1*# +b00000000000000000000000000000100 +# +b00000000000000000000000000000010 ,# +b00000000000000000000000000000101 -# +b00000000000000000000000000000011 .# +b00000000000000000000000000000100 /# +b00000000000000000000000000000100 0# +16# +17# +1:# +1;# +1<# +1=# +b10000000000000000000000000000001100000000000000000000000000000100000000000000000000000000000001010000000000000000000000000000011000000000000000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001110000110000000011 @# +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 J# +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 T# +b011 r# +b001 s# +1t# +1u# +b00000011 w# +b0000000000000000000000000000010000000000000000000000000000000011 x# +b0000000000000000000000000111111100000000000000000000000001111110 z# +b0000000000000011 |# +b0000000000000011 }# +b0000000000000011 ~# +b0000000000000011 !$ +b0000000000000011 "$ +1#$ +1$$ +1'$ +1($ +1-$ +1.$ +b00000000000000000000000000000100 /$ +b00000000000000000000000000000010 0$ +b00000000000000000000000000000101 1$ +b00000000000000000000000000000011 2$ +b00000000000000000000000000000100 3$ +b00000101000001000000001100000010 4$ +b00000110000001010000010000000011 5$ +16$ +#15 +06$ +#20 +b00000000000000000000000000000010 # +b0011 $ +0% +1& +1' +1) +1* +1+ +1, +10 +b10000000000000000000000000000000100000000000000000000000000000010000000000000000000000000000000110000000000000000000000000000010000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110000010000000001 4 +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 > +b001 f +1h +b00000001 k +b0000000000000000000000000000001000000000000000000000000000000001 l +b0000000000000000000000000111110100000000000000000000000001111100 n +b0000000000000001 p +b0000000000000001 q +b0000000000000001 r +b0000000000000001 s +b0000000000000001 t +0v +0w +0x +0y +0} +b00000000000000000000000000000011 (! +1+! +0.! +0/! +12! +13! +04! +15! +b00000000000000000000000000000001000000000000000000000000000000011000000000000000000000000000001000000000000000000000000000000010100000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000100000000010 8! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 B! +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 L! +b010 j! +b001 k! +0l! +1m! +b00000010 o! +b0000000000000000000000000000001100000000000000000000000000000010 p! +b0000000000000000000000000111111000000000000000000000000001111101 r! +b0000000000000010 t! +b0000000000000010 u! +b0000000000000010 v! +b0000000000000010 w! +b0000000000000010 x! +1{! +1|! +0!" +0"" +1#" +0$" +b00000000000000000000000000000100 ," +1-" +01" +12" +13" +04" +18" +b10000000000000000000000000000001100000000000000000000000000000100000000000000000000000000000001010000000000000000000000000000011000000000000000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001110000110000000011 <" +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 F" +b011 n" +1p" +b00000011 s" +b0000000000000000000000000000010000000000000000000000000000000011 t" +b0000000000000000000000000111111100000000000000000000000001111110 v" +b0000000000000011 x" +b0000000000000011 y" +b0000000000000011 z" +b0000000000000011 {" +b0000000000000011 |" +1~" +0!# +0"# +1## +0'# +b00000000000000000000000000000101 0# +07# +0;# +1?# +b00000000000000000000000000000010000000000000000000000000000000101000000000000000000000000000001100000000000000000000000000000011100000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000001000000000100 @# +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 J# +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 T# +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 ^# +b100 r# +b010 s# +0t# +0u# +1v# +b00000100 w# +b0000000000000000000000000000010100000000000000000000000000000100 x# +b0000000000000000000000001000000000000000000000000000000001111111 z# +b0000000000000100 |# +b0000000000000100 }# +b0000000000000100 ~# +b0000000000000100 !$ +b0000000000000100 "$ +1&$ +1*$ +0.$ +b00000110000001010000010000000011 4$ +b00000111000001100000010100000100 5$ +16$ +#25 +06$ +#30 +b00000000000000000000000000000011 # +b0111 $ +1% +0* +0+ +1. +1/ +00 +11 +b00000000000000000000000000000001000000000000000000000000000000011000000000000000000000000000001000000000000000000000000000000010100000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000100000000010 4 +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 > +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 H +b010 f +b001 g +0h +1i +b00000010 k +b0000000000000000000000000000001100000000000000000000000000000010 l +b0000000000000000000000000111111000000000000000000000000001111101 n +b0000000000000010 p +b0000000000000010 q +b0000000000000010 r +b0000000000000010 s +b0000000000000010 t +1w +1x +0{ +0| +1} +0~ +b00000000000000000000000000000100 (! +0)! +1*! +0-! +1.! +1/! +00! +14! +b10000000000000000000000000000001100000000000000000000000000000100000000000000000000000000000001010000000000000000000000000000011000000000000000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001110000110000000011 8! +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 B! +b011 j! +1l! +b00000011 o! +b0000000000000000000000000000010000000000000000000000000000000011 p! +b0000000000000000000000000111111100000000000000000000000001111110 r! +b0000000000000011 t! +b0000000000000011 u! +b0000000000000011 v! +b0000000000000011 w! +b0000000000000011 x! +1z! +0{! +0|! +1}! +0#" +b00000000000000000000000000000101 ," +1/" +03" +07" +1;" +b00000000000000000000000000000010000000000000000000000000000000101000000000000000000000000000001100000000000000000000000000000011100000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000001000000000100 <" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 F" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 P" +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 Z" +b100 n" +b010 o" +0p" +0q" +1r" +b00000100 s" +b0000000000000000000000000000010100000000000000000000000000000100 t" +b0000000000000000000000001000000000000000000000000000000001111111 v" +b0000000000000100 x" +b0000000000000100 y" +b0000000000000100 z" +b0000000000000100 {" +b0000000000000100 |" +1"# +1&# +0*# +b00000000000000000000000000000110 0# +15# +06# +17# +18# +0<# +b10000000000000000000000000000010100000000000000000000000000000110000000000000000000000000000001110000000000000000000000000000100000000000000001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010110001010000000101 @# +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 J# +b101 r# +1t# +b00000101 w# +b0000000000000000000000000000011000000000000000000000000000000101 x# +b0000000000000000000000001000000100000000000000000000000010000000 z# +b0000000000000101 |# +b0000000000000101 }# +b0000000000000101 ~# +b0000000000000101 !$ +b0000000000000101 "$ +0$$ +1%$ +0&$ +0'$ +1+$ +b00000111000001100000010100000100 4$ +b00001000000001110000011000000101 5$ +16$ +#35 +06$ +#40 +b00000000000000000000000000000100 # +b0110 $ +0% +0& +0' +0) +1* +1+ +0, +10 +b10000000000000000000000000000001100000000000000000000000000000100000000000000000000000000000001010000000000000000000000000000011000000000000000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001110000110000000011 4 +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 > +b011 f +1h +b00000011 k +b0000000000000000000000000000010000000000000000000000000000000011 l +b0000000000000000000000000111111100000000000000000000000001111110 n +b0000000000000011 p +b0000000000000011 q +b0000000000000011 r +b0000000000000011 s +b0000000000000011 t +1v +0w +0x +1y +0} +b00000000000000000000000000000101 (! +0/! +03! +17! +b00000000000000000000000000000010000000000000000000000000000000101000000000000000000000000000001100000000000000000000000000000011100000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000001000000000100 8! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 B! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 L! +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 V! +b100 j! +b010 k! +0l! +0m! +1n! +b00000100 o! +b0000000000000000000000000000010100000000000000000000000000000100 p! +b0000000000000000000000001000000000000000000000000000000001111111 r! +b0000000000000100 t! +b0000000000000100 u! +b0000000000000100 v! +b0000000000000100 w! +b0000000000000100 x! +1|! +1"" +0&" +b00000000000000000000000000000110 ," +11" +02" +13" +14" +08" +b10000000000000000000000000000010100000000000000000000000000000110000000000000000000000000000001110000000000000000000000000000100000000000000001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010110001010000000101 <" +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 F" +b101 n" +1p" +b00000101 s" +b0000000000000000000000000000011000000000000000000000000000000101 t" +b0000000000000000000000001000000100000000000000000000000010000000 v" +b0000000000000101 x" +b0000000000000101 y" +b0000000000000101 z" +b0000000000000101 {" +b0000000000000101 |" +0~" +1!# +0"# +0## +1'# +b00000000000000000000000000000111 0# +16# +07# +0:# +1;# +1<# +0=# +b00000000000000000000000000000011000000000000000000000000000000111000000000000000000000000000010000000000000000000000000000000100100000000000001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011000001100000000110 @# +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 J# +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 T# +b110 r# +b011 s# +0t# +1u# +b00000110 w# +b0000000000000000000000000000011100000000000000000000000000000110 x# +b0000000000000000000000001000001000000000000000000000000010000001 z# +b0000000000000110 |# +b0000000000000110 }# +b0000000000000110 ~# +b0000000000000110 !$ +b0000000000000110 "$ +0%$ +1&$ +1)$ +0*$ +0+$ +1,$ +b00001000000001110000011000000101 4$ +b00001001000010000000011100000110 5$ +16$ +#45 +06$ +#50 +b00000000000000000000000000000101 # +1% +0+ +0/ +13 +b00000000000000000000000000000010000000000000000000000000000000101000000000000000000000000000001100000000000000000000000000000011100000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000001000000000100 4 +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 > +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 H +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 R +b100 f +b010 g +0h +0i +1j +b00000100 k +b0000000000000000000000000000010100000000000000000000000000000100 l +b0000000000000000000000001000000000000000000000000000000001111111 n +b0000000000000100 p +b0000000000000100 q +b0000000000000100 r +b0000000000000100 s +b0000000000000100 t +1x +1| +0"! +b00000000000000000000000000000110 (! +1)! +1-! +0.! +1/! +10! +04! +b10000000000000000000000000000010100000000000000000000000000000110000000000000000000000000000001110000000000000000000000000000100000000000000001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010110001010000000101 8! +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 B! +b101 j! +1l! +b00000101 o! +b0000000000000000000000000000011000000000000000000000000000000101 p! +b0000000000000000000000001000000100000000000000000000000010000000 r! +b0000000000000101 t! +b0000000000000101 u! +b0000000000000101 v! +b0000000000000101 w! +b0000000000000101 x! +0z! +1{! +0|! +0}! +1#" +b00000000000000000000000000000111 ," +12" +03" +06" +17" +18" +09" +b00000000000000000000000000000011000000000000000000000000000000111000000000000000000000000000010000000000000000000000000000000100100000000000001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011000001100000000110 <" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 F" +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 P" +b110 n" +b011 o" +0p" +1q" +b00000110 s" +b0000000000000000000000000000011100000000000000000000000000000110 t" +b0000000000000000000000001000001000000000000000000000000010000001 v" +b0000000000000110 x" +b0000000000000110 y" +b0000000000000110 z" +b0000000000000110 {" +b0000000000000110 |" +0!# +1"# +1%# +0&# +0'# +1(# +b00000000000000000000000000001000 0# +11# +05# +06# +17# +08# +0<# +b10000000000000000000000000000011100000000000000000000000000001000000000000000000000000000000010010000000000000000000000000000101000000000000001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011110001110000000111 @# +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 J# +b111 r# +1t# +b00000111 w# +b0000000000000000000000000000100000000000000000000000000000000111 x# +b0000000000000000000000001000001100000000000000000000000010000010 z# +b0000000000000111 |# +b0000000000000111 }# +b0000000000000111 ~# +b0000000000000111 !$ +b0000000000000111 "$ +1$$ +1%$ +0&$ +1'$ +1+$ +b00001001000010000000011100000110 4$ +b00001010000010010000100000000111 5$ +16$ +#55 +06$ +#60 +b00000000000000000000000000000110 # +b1101 $ +0% +1& +1' +1) +0* +1+ +1, +00 +b10000000000000000000000000000010100000000000000000000000000000110000000000000000000000000000001110000000000000000000000000000100000000000000001010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010110001010000000101 4 +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 > +b101 f +1h +b00000101 k +b0000000000000000000000000000011000000000000000000000000000000101 l +b0000000000000000000000001000000100000000000000000000000010000000 n +b0000000000000101 p +b0000000000000101 q +b0000000000000101 r +b0000000000000101 s +b0000000000000101 t +0v +1w +0x +0y +1} +b00000000000000000000000000000111 (! +0+! +1.! +0/! +02! +13! +14! +05! +b00000000000000000000000000000011000000000000000000000000000000111000000000000000000000000000010000000000000000000000000000000100100000000000001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011000001100000000110 8! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 B! +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 L! +b110 j! +b011 k! +0l! +1m! +b00000110 o! +b0000000000000000000000000000011100000000000000000000000000000110 p! +b0000000000000000000000001000001000000000000000000000000010000001 r! +b0000000000000110 t! +b0000000000000110 u! +b0000000000000110 v! +b0000000000000110 w! +b0000000000000110 x! +0{! +1|! +1!" +0"" +0#" +1$" +b00000000000000000000000000001000 ," +0-" +1." +01" +02" +13" +04" +08" +b10000000000000000000000000000011100000000000000000000000000001000000000000000000000000000000010010000000000000000000000000000101000000000000001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011110001110000000111 <" +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 F" +b111 n" +1p" +b00000111 s" +b0000000000000000000000000000100000000000000000000000000000000111 t" +b0000000000000000000000001000001100000000000000000000000010000010 v" +b0000000000000111 x" +b0000000000000111 y" +b0000000000000111 z" +b0000000000000111 {" +b0000000000000111 |" +1~" +1!# +0"# +1## +1'# +b00000000000000000000000000001001 0# +13# +b00000000000000000000000000000100000000000000000000000000000001001000000000000000000000000000010100000000000000000000000000000101100000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000010000000001000 @# +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 J# +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 T# +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ^# +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 h# +b000 r# +b100 s# +0t# +0u# +0v# +b00001000 w# +b0000000000000000000000000000100100000000000000000000000000001000 x# +b0000000000000000000000001000010000000000000000000000000010000011 z# +b0000000000001000 |# +b0000000000001000 }# +b0000000000001000 ~# +b0000000000001000 !$ +b0000000000001000 "$ +b00001010000010010000100000000111 4$ +b00001011000010100000100100001000 5$ +16$ +#65 +06$ +#70 +b00000000000000000000000000000111 # +1% +1* +0+ +0. +1/ +10 +01 +b00000000000000000000000000000011000000000000000000000000000000111000000000000000000000000000010000000000000000000000000000000100100000000000001100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011000001100000000110 4 +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 > +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 H +b110 f +b011 g +0h +1i +b00000110 k +b0000000000000000000000000000011100000000000000000000000000000110 l +b0000000000000000000000001000001000000000000000000000000010000001 n +b0000000000000110 p +b0000000000000110 q +b0000000000000110 r +b0000000000000110 s +b0000000000000110 t +0w +1x +1{ +0| +0} +1~ +b00000000000000000000000000001000 (! +0)! +0*! +0-! +0.! +1/! +00! +04! +b10000000000000000000000000000011100000000000000000000000000001000000000000000000000000000000010010000000000000000000000000000101000000000000001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011110001110000000111 8! +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 B! +b111 j! +1l! +b00000111 o! +b0000000000000000000000000000100000000000000000000000000000000111 p! +b0000000000000000000000001000001100000000000000000000000010000010 r! +b0000000000000111 t! +b0000000000000111 u! +b0000000000000111 v! +b0000000000000111 w! +b0000000000000111 x! +1z! +1{! +0|! +1}! +1#" +b00000000000000000000000000001001 ," +b00000000000000000000000000000100000000000000000000000000000001001000000000000000000000000000010100000000000000000000000000000101100000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000010000000001000 <" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 F" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 P" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Z" +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 d" +b000 n" +b100 o" +0p" +0q" +0r" +b00001000 s" +b0000000000000000000000000000100100000000000000000000000000001000 t" +b0000000000000000000000001000010000000000000000000000000010000011 v" +b0000000000001000 x" +b0000000000001000 y" +b0000000000001000 z" +b0000000000001000 {" +b0000000000001000 |" +b00000000000000000000000000001010 0# +15# +16# +07# +18# +1<# +b10000000000000000000000000000100100000000000000000000000000001010000000000000000000000000000010110000000000000000000000000000110000000000000010010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100110010010000001001 @# +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 J# +b001 r# +1t# +b00001001 w# +b0000000000000000000000000000101000000000000000000000000000001001 x# +b0000000000000000000000001000010100000000000000000000000010000100 z# +b0000000000001001 |# +b0000000000001001 }# +b0000000000001001 ~# +b0000000000001001 !$ +b0000000000001001 "$ +0$$ +0%$ +1&$ +0'$ +0+$ +b00001011000010100000100100001000 4$ +b00001100000010110000101000001001 5$ +16$ +#75 +06$ +#80 +b00000000000000000000000000001000 # +b1100 $ +0% +0& +0' +0) +0* +1+ +0, +00 +b10000000000000000000000000000011100000000000000000000000000001000000000000000000000000000000010010000000000000000000000000000101000000000000001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011110001110000000111 4 +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 > +b111 f +1h +b00000111 k +b0000000000000000000000000000100000000000000000000000000000000111 l +b0000000000000000000000001000001100000000000000000000000010000010 n +b0000000000000111 p +b0000000000000111 q +b0000000000000111 r +b0000000000000111 s +b0000000000000111 t +1v +1w +0x +1y +1} +b00000000000000000000000000001001 (! +b00000000000000000000000000000100000000000000000000000000000001001000000000000000000000000000010100000000000000000000000000000101100000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000010000000001000 8! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 B! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 L! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 V! +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 `! +b000 j! +b100 k! +0l! +0m! +0n! +b00001000 o! +b0000000000000000000000000000100100000000000000000000000000001000 p! +b0000000000000000000000001000010000000000000000000000000010000011 r! +b0000000000001000 t! +b0000000000001000 u! +b0000000000001000 v! +b0000000000001000 w! +b0000000000001000 x! +b00000000000000000000000000001010 ," +11" +12" +03" +14" +18" +b10000000000000000000000000000100100000000000000000000000000001010000000000000000000000000000010110000000000000000000000000000110000000000000010010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100110010010000001001 <" +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 F" +b001 n" +1p" +b00001001 s" +b0000000000000000000000000000101000000000000000000000000000001001 t" +b0000000000000000000000001000010100000000000000000000000010000100 v" +b0000000000001001 x" +b0000000000001001 y" +b0000000000001001 z" +b0000000000001001 {" +b0000000000001001 |" +0~" +0!# +1"# +0## +0'# +b00000000000000000000000000001011 0# +06# +17# +1:# +0;# +0<# +1=# +b00000000000000000000000000000101000000000000000000000000000001011000000000000000000000000000011000000000000000000000000000000110100000000000010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101000010100000001010 @# +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 J# +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 T# +b010 r# +b101 s# +0t# +1u# +b00001010 w# +b0000000000000000000000000000101100000000000000000000000000001010 x# +b0000000000000000000000001000011000000000000000000000000010000101 z# +b0000000000001010 |# +b0000000000001010 }# +b0000000000001010 ~# +b0000000000001010 !$ +b0000000000001010 "$ +1%$ +0&$ +0)$ +1*$ +1+$ +0,$ +b00001100000010110000101000001001 4$ +b00001101000011000000101100001010 5$ +16$ +#85 +06$ +#90 +b00000000000000000000000000001001 # +1% +b00000000000000000000000000000100000000000000000000000000000001001000000000000000000000000000010100000000000000000000000000000101100000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000010000000001000 4 +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 > +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 H +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 R +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 \ +b000 f +b100 g +0h +0i +0j +b00001000 k +b0000000000000000000000000000100100000000000000000000000000001000 l +b0000000000000000000000001000010000000000000000000000000010000011 n +b0000000000001000 p +b0000000000001000 q +b0000000000001000 r +b0000000000001000 s +b0000000000001000 t +b00000000000000000000000000001010 (! +1)! +1-! +1.! +0/! +10! +14! +b10000000000000000000000000000100100000000000000000000000000001010000000000000000000000000000010110000000000000000000000000000110000000000000010010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100110010010000001001 8! +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 B! +b001 j! +1l! +b00001001 o! +b0000000000000000000000000000101000000000000000000000000000001001 p! +b0000000000000000000000001000010100000000000000000000000010000100 r! +b0000000000001001 t! +b0000000000001001 u! +b0000000000001001 v! +b0000000000001001 w! +b0000000000001001 x! +0z! +0{! +1|! +0}! +0#" +b00000000000000000000000000001011 ," +02" +13" +16" +07" +08" +19" +b00000000000000000000000000000101000000000000000000000000000001011000000000000000000000000000011000000000000000000000000000000110100000000000010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101000010100000001010 <" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 F" +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 P" +b010 n" +b101 o" +0p" +1q" +b00001010 s" +b0000000000000000000000000000101100000000000000000000000000001010 t" +b0000000000000000000000001000011000000000000000000000000010000101 v" +b0000000000001010 x" +b0000000000001010 y" +b0000000000001010 z" +b0000000000001010 {" +b0000000000001010 |" +1!# +0"# +0%# +1&# +1'# +0(# +b00000000000000000000000000001100 0# +05# +16# +07# +08# +1<# +b10000000000000000000000000000101100000000000000000000000000001100000000000000000000000000000011010000000000000000000000000000111000000000000010110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101110010110000001011 @# +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 J# +b011 r# +1t# +b00001011 w# +b0000000000000000000000000000110000000000000000000000000000001011 x# +b0000000000000000000000001000011100000000000000000000000010000110 z# +b0000000000001011 |# +b0000000000001011 }# +b0000000000001011 ~# +b0000000000001011 !$ +b0000000000001011 "$ +1$$ +0%$ +1&$ +1'$ +0+$ +b00001101000011000000101100001010 4$ +b00001110000011010000110000001011 5$ +16$ +#95 +06$ +#100 +b00000000000000000000000000001010 # +b1111 $ +0% +1& +1' +1) +1* +0+ +1, +10 +b10000000000000000000000000000100100000000000000000000000000001010000000000000000000000000000010110000000000000000000000000000110000000000000010010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100110010010000001001 4 +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 > +b001 f +1h +b00001001 k +b0000000000000000000000000000101000000000000000000000000000001001 l +b0000000000000000000000001000010100000000000000000000000010000100 n +b0000000000001001 p +b0000000000001001 q +b0000000000001001 r +b0000000000001001 s +b0000000000001001 t +0v +0w +1x +0y +0} +b00000000000000000000000000001011 (! +1+! +0.! +1/! +12! +03! +04! +15! +b00000000000000000000000000000101000000000000000000000000000001011000000000000000000000000000011000000000000000000000000000000110100000000000010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101000010100000001010 8! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 B! +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 L! +b010 j! +b101 k! +0l! +1m! +b00001010 o! +b0000000000000000000000000000101100000000000000000000000000001010 p! +b0000000000000000000000001000011000000000000000000000000010000101 r! +b0000000000001010 t! +b0000000000001010 u! +b0000000000001010 v! +b0000000000001010 w! +b0000000000001010 x! +1{! +0|! +0!" +1"" +1#" +0$" +b00000000000000000000000000001100 ," +1-" +01" +12" +03" +04" +18" +b10000000000000000000000000000101100000000000000000000000000001100000000000000000000000000000011010000000000000000000000000000111000000000000010110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101110010110000001011 <" +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 F" +b011 n" +1p" +b00001011 s" +b0000000000000000000000000000110000000000000000000000000000001011 t" +b0000000000000000000000001000011100000000000000000000000010000110 v" +b0000000000001011 x" +b0000000000001011 y" +b0000000000001011 z" +b0000000000001011 {" +b0000000000001011 |" +1~" +0!# +1"# +1## +0'# +b00000000000000000000000000001101 0# +17# +1;# +0?# +b00000000000000000000000000000110000000000000000000000000000001101000000000000000000000000000011100000000000000000000000000000111100000000000011000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110000011000000001100 @# +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 J# +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 T# +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 ^# +b100 r# +b110 s# +0t# +0u# +1v# +b00001100 w# +b0000000000000000000000000000110100000000000000000000000000001100 x# +b0000000000000000000000001000100000000000000000000000000010000111 z# +b0000000000001100 |# +b0000000000001100 }# +b0000000000001100 ~# +b0000000000001100 !$ +b0000000000001100 "$ +0&$ +0*$ +1.$ +b00001110000011010000110000001011 4$ +b00001111000011100000110100001100 5$ +16$ diff --git a/test_regress/t/t_trace_type_dupes.py b/test_regress/t/t_trace_type_dupes.py new file mode 100755 index 000000000..5e3edff09 --- /dev/null +++ b/test_regress/t/t_trace_type_dupes.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python3 +# DESCRIPTION: Verilator: Verilog Test driver/expect definition +# +# Copyright 2024 by Wilson Snyder. This program is free software; you +# can redistribute it and/or modify it under the terms of either the GNU +# Lesser General Public License Version 3 or the Perl Artistic License +# Version 2.0. +# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0 + +import vltest_bootstrap + +test.scenarios("simulator_st") + +test.compile(verilator_flags2=["--trace"]) + +test.execute() + +test.vcd_identical(test.trace_filename, test.golden_filename) + +test.passes() diff --git a/test_regress/t/t_trace_type_dupes.v b/test_regress/t/t_trace_type_dupes.v new file mode 100644 index 000000000..ddc83b1f3 --- /dev/null +++ b/test_regress/t/t_trace_type_dupes.v @@ -0,0 +1,185 @@ +// DESCRIPTION: Verilator: Verilog Test module +// +// This file ONLY is placed under the Creative Commons Public Domain, for +// any use, without warranty, 2025 by Wilson Snyder. +// SPDX-License-Identifier: CC0-1.0 + +`ifndef LAST_CYC +`define LAST_CYC 9 +`endif + +`ifndef NUM_SUBS +`define NUM_SUBS 4 +`endif + + +module t (/*AUTOARG*/ + // Inputs + clk + ); + input clk; + + int cyc; + logic [`NUM_SUBS - 1:0] x; + initial cyc = 0; + + always_ff @(posedge clk) begin + cyc <= cyc + 1; + if (cyc == `LAST_CYC) begin + if (~|x) $stop; + $write("*-* All Finished *-*\n"); + $finish; + end + end + + for (genvar i = 0; i < `NUM_SUBS; i++) begin : gen_loop + int loop_cyc; + always_comb loop_cyc = cyc + i; + sub #( + .data_t (pkg::some_struct_t) + ) + the_sub ( + .a (loop_cyc[i%32]), + .b (loop_cyc[(i+1)%32]), + .x (x[i]), + .out_2d_unpacked (), + .data (), + .cyc (loop_cyc), + .clk + ); + end + + intf + the_intf_a (.*), + the_intf_b (.*); + + for (genvar m = 0; m < 4; m++) begin : gen_intf_loop + always_comb begin + the_intf_a.data[m] = cyc[7:0] + m + 7'd1; + the_intf_b.data[m] = cyc[7:0] + m + 7'd2; + end + end + +endmodule + +package pkg; + typedef struct packed { + logic field_a; + logic [5:0] field_b; + logic [9:0] field_c; + } some_sub_struct_t; + + typedef struct packed { + logic foo; + logic [3:0] [31:0] bar; + logic [15:0] baz; + logic [127:0] qux; + some_sub_struct_t sub_struct; + } some_struct_t; + + parameter some_sub_struct_t SUB_ONES = '1; + parameter some_sub_struct_t SUB_ZEROS = '0; +endpackage + +module sub #( + parameter type data_t = bit +)( + input a, + input b, + output logic x, + output out_2d_unpacked [3][4], + output data_t data, + input int cyc, + input clk +); + pkg::some_struct_t the_struct; + pkg::some_struct_t the_structs [3:0]; + pkg::some_struct_t [2:0] the_packed_structs; + + typedef struct packed { + logic abc; + logic def; + logic xyz; + } some_struct_t; + some_struct_t the_local_struct; + localparam some_struct_t const_struct = 3'b101; + typedef some_struct_t typedefed_struct_t; + typedefed_struct_t the_typedefed_struct; + + typedef struct { + logic field_a; + logic field_b; + logic field_c; + } some_unpacked_struct_t; + some_unpacked_struct_t the_local_unpacked_struct; + + typedef union packed { + struct packed { + logic [7:0] field_0; + } union_a; + struct packed { + logic [3:0] field_1; + logic [3:0] field_2; + } union_b; + struct packed { + logic [1:0] field_3; + logic [5:0] field_4; + } union_c; + } some_union_t; + some_union_t the_local_union; + + typedef logic [1:0] [31:0] logic_array_t; + typedef logic [1:0] [31:0] logic_array_2_t; + logic_array_t the_logic_array; + logic_array_2_t the_other_logic_array; + logic [15:0] the_unpacked_array [5]; + logic the_2d_unpacked [3][4]; + + typedef logic [3:0] four_bit_t; + typedef four_bit_t [1:0] two_fours_t; + localparam two_fours_t two_fours = 8'hab; + two_fours_t two_fours_var; + + always_ff @(posedge clk) begin + x <= a ^ b; + the_struct <= '{ + foo : cyc[0], + bar : '{cyc, cyc+1, cyc+2, cyc+3}, + baz : cyc[15:0], + qux : 128'(cyc), + sub_struct : '{ + field_a : cyc[0], + field_b : cyc[5:0], + field_c : cyc[9:0] + } + }; + for (int i = 0; i < 4; i++) the_structs[i] <= {$bits(pkg::some_struct_t){cyc[i]}}; + the_local_struct <= cyc[2:0]; + the_typedefed_struct <= cyc[3:1]; + the_local_unpacked_struct <= '{ + field_a : cyc[0], + field_b : cyc[1], + field_c : cyc[2] + }; + the_local_union <= cyc[7:0]; + for (int i = 0; i < 2; i++) begin + the_logic_array[i] <= cyc + i; + the_other_logic_array[i] <= cyc + i + 123; + end + for (int i = 0; i < 5; i++) the_unpacked_array[i] <= cyc[15:0]; + for (int i = 0; i < 3; i++) + for (int j = 0; j < 4; j++) begin + the_2d_unpacked [i][j] <= ~(cyc[i] ^ cyc[j]); + out_2d_unpacked [i][j] <= cyc[i] ^ cyc[j]; + end + end + + always_comb data = the_struct; +endmodule + +interface intf + (input wire clk); + logic [3:0] [7:0] data; + int data_typed; + always_comb data_typed = data; +endinterface diff --git a/test_regress/t/t_trace_type_dupes_structs.out b/test_regress/t/t_trace_type_dupes_structs.out new file mode 100644 index 000000000..3078870a7 --- /dev/null +++ b/test_regress/t/t_trace_type_dupes_structs.out @@ -0,0 +1,3811 @@ +$version Generated by VerilatedVcd $end +$timescale 1ps $end + $scope module top $end + $var wire 1 9% clk $end + $scope module pkg $end + $scope module SUB_ONES $end + $var wire 1 a% field_a $end + $var wire 6 &' field_b [5:0] $end + $var wire 10 '' field_c [9:0] $end + $upscope $end + $scope module SUB_ZEROS $end + $var wire 1 b% field_a $end + $var wire 6 (' field_b [5:0] $end + $var wire 10 )' field_c [9:0] $end + $upscope $end + $upscope $end + $scope module t $end + $var wire 1 9% clk $end + $var wire 32 # cyc [31:0] $end + $var wire 4 $ x [3:0] $end + $scope module the_intf_a $end + $var wire 1 9% clk $end + $var wire 8 2% data[0] [7:0] $end + $var wire 8 3% data[1] [7:0] $end + $var wire 8 4% data[2] [7:0] $end + $var wire 8 5% data[3] [7:0] $end + $var wire 32 6% data_typed [31:0] $end + $upscope $end + $scope module the_intf_b $end + $var wire 1 9% clk $end + $var wire 8 3% data[0] [7:0] $end + $var wire 8 4% data[1] [7:0] $end + $var wire 8 5% data[2] [7:0] $end + $var wire 8 7% data[3] [7:0] $end + $var wire 32 8% data_typed [31:0] $end + $upscope $end + $scope module gen_loop[0] $end + $var wire 32 # loop_cyc [31:0] $end + $scope module the_sub $end + $var wire 1 % a $end + $var wire 1 & b $end + $var wire 1 ' x $end + $var wire 1 ( out_2d_unpacked[0][0] $end + $var wire 1 ) out_2d_unpacked[0][1] $end + $var wire 1 * out_2d_unpacked[0][2] $end + $var wire 1 + out_2d_unpacked[0][3] $end + $var wire 1 , out_2d_unpacked[1][0] $end + $var wire 1 - out_2d_unpacked[1][1] $end + $var wire 1 . out_2d_unpacked[1][2] $end + $var wire 1 / out_2d_unpacked[1][3] $end + $var wire 1 0 out_2d_unpacked[2][0] $end + $var wire 1 1 out_2d_unpacked[2][1] $end + $var wire 1 2 out_2d_unpacked[2][2] $end + $var wire 1 3 out_2d_unpacked[2][3] $end + $scope module data $end + $var wire 1 4 foo $end + $var wire 32 5 bar[0] [31:0] $end + $var wire 32 6 bar[1] [31:0] $end + $var wire 32 7 bar[2] [31:0] $end + $var wire 32 8 bar[3] [31:0] $end + $var wire 16 9 baz [15:0] $end + $var wire 128 : qux [127:0] $end + $scope module sub_struct $end + $var wire 1 > field_a $end + $var wire 6 ? field_b [5:0] $end + $var wire 10 @ field_c [9:0] $end + $upscope $end + $upscope $end + $var wire 32 # cyc [31:0] $end + $var wire 1 9% clk $end + $scope module the_struct $end + $var wire 1 4 foo $end + $var wire 32 5 bar[0] [31:0] $end + $var wire 32 6 bar[1] [31:0] $end + $var wire 32 7 bar[2] [31:0] $end + $var wire 32 8 bar[3] [31:0] $end + $var wire 16 9 baz [15:0] $end + $var wire 128 : qux [127:0] $end + $scope module sub_struct $end + $var wire 1 > field_a $end + $var wire 6 ? field_b [5:0] $end + $var wire 10 @ field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_structs[0] $end + $var wire 1 A foo $end + $var wire 32 B bar[0] [31:0] $end + $var wire 32 C bar[1] [31:0] $end + $var wire 32 D bar[2] [31:0] $end + $var wire 32 E bar[3] [31:0] $end + $var wire 16 F baz [15:0] $end + $var wire 128 G qux [127:0] $end + $scope module sub_struct $end + $var wire 1 K field_a $end + $var wire 6 L field_b [5:0] $end + $var wire 10 M field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_structs[1] $end + $var wire 1 N foo $end + $var wire 32 O bar[0] [31:0] $end + $var wire 32 P bar[1] [31:0] $end + $var wire 32 Q bar[2] [31:0] $end + $var wire 32 R bar[3] [31:0] $end + $var wire 16 S baz [15:0] $end + $var wire 128 T qux [127:0] $end + $scope module sub_struct $end + $var wire 1 X field_a $end + $var wire 6 Y field_b [5:0] $end + $var wire 10 Z field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_structs[2] $end + $var wire 1 [ foo $end + $var wire 32 \ bar[0] [31:0] $end + $var wire 32 ] bar[1] [31:0] $end + $var wire 32 ^ bar[2] [31:0] $end + $var wire 32 _ bar[3] [31:0] $end + $var wire 16 ` baz [15:0] $end + $var wire 128 a qux [127:0] $end + $scope module sub_struct $end + $var wire 1 e field_a $end + $var wire 6 f field_b [5:0] $end + $var wire 10 g field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_structs[3] $end + $var wire 1 h foo $end + $var wire 32 i bar[0] [31:0] $end + $var wire 32 j bar[1] [31:0] $end + $var wire 32 k bar[2] [31:0] $end + $var wire 32 l bar[3] [31:0] $end + $var wire 16 m baz [15:0] $end + $var wire 128 n qux [127:0] $end + $scope module sub_struct $end + $var wire 1 r field_a $end + $var wire 6 s field_b [5:0] $end + $var wire 10 t field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_packed_structs[0] $end + $var wire 1 :% foo $end + $var wire 32 ;% bar[0] [31:0] $end + $var wire 32 <% bar[1] [31:0] $end + $var wire 32 =% bar[2] [31:0] $end + $var wire 32 >% bar[3] [31:0] $end + $var wire 16 ?% baz [15:0] $end + $var wire 128 @% qux [127:0] $end + $scope module sub_struct $end + $var wire 1 D% field_a $end + $var wire 6 E% field_b [5:0] $end + $var wire 10 F% field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_packed_structs[1] $end + $var wire 1 G% foo $end + $var wire 32 H% bar[0] [31:0] $end + $var wire 32 I% bar[1] [31:0] $end + $var wire 32 J% bar[2] [31:0] $end + $var wire 32 K% bar[3] [31:0] $end + $var wire 16 L% baz [15:0] $end + $var wire 128 M% qux [127:0] $end + $scope module sub_struct $end + $var wire 1 Q% field_a $end + $var wire 6 R% field_b [5:0] $end + $var wire 10 S% field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_packed_structs[2] $end + $var wire 1 T% foo $end + $var wire 32 U% bar[0] [31:0] $end + $var wire 32 V% bar[1] [31:0] $end + $var wire 32 W% bar[2] [31:0] $end + $var wire 32 X% bar[3] [31:0] $end + $var wire 16 Y% baz [15:0] $end + $var wire 128 Z% qux [127:0] $end + $scope module sub_struct $end + $var wire 1 ^% field_a $end + $var wire 6 _% field_b [5:0] $end + $var wire 10 `% field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_local_struct $end + $var wire 1 u abc $end + $var wire 1 v def $end + $var wire 1 w xyz $end + $upscope $end + $scope module const_struct $end + $var wire 1 a% abc $end + $var wire 1 b% def $end + $var wire 1 a% xyz $end + $upscope $end + $scope module the_typedefed_struct $end + $var wire 1 x abc $end + $var wire 1 y def $end + $var wire 1 z xyz $end + $upscope $end + $scope module the_local_unpacked_struct $end + $var wire 1 { field_a $end + $var wire 1 | field_b $end + $var wire 1 } field_c $end + $upscope $end + $scope module the_local_union $end + $scope module union_a $end + $var wire 8 ~ field_0 [7:0] $end + $upscope $end + $scope module union_b $end + $var wire 4 !! field_1 [3:0] $end + $var wire 4 "! field_2 [3:0] $end + $upscope $end + $scope module union_c $end + $var wire 2 #! field_3 [1:0] $end + $var wire 6 $! field_4 [5:0] $end + $upscope $end + $upscope $end + $var wire 32 %! the_logic_array[0] [31:0] $end + $var wire 32 &! the_logic_array[1] [31:0] $end + $var wire 32 '! the_other_logic_array[0] [31:0] $end + $var wire 32 (! the_other_logic_array[1] [31:0] $end + $var wire 16 )! the_unpacked_array[0] [15:0] $end + $var wire 16 *! the_unpacked_array[1] [15:0] $end + $var wire 16 +! the_unpacked_array[2] [15:0] $end + $var wire 16 ,! the_unpacked_array[3] [15:0] $end + $var wire 16 -! the_unpacked_array[4] [15:0] $end + $var wire 1 .! the_2d_unpacked[0][0] $end + $var wire 1 /! the_2d_unpacked[0][1] $end + $var wire 1 0! the_2d_unpacked[0][2] $end + $var wire 1 1! the_2d_unpacked[0][3] $end + $var wire 1 2! the_2d_unpacked[1][0] $end + $var wire 1 3! the_2d_unpacked[1][1] $end + $var wire 1 4! the_2d_unpacked[1][2] $end + $var wire 1 5! the_2d_unpacked[1][3] $end + $var wire 1 6! the_2d_unpacked[2][0] $end + $var wire 1 7! the_2d_unpacked[2][1] $end + $var wire 1 8! the_2d_unpacked[2][2] $end + $var wire 1 9! the_2d_unpacked[2][3] $end + $var wire 4 c% two_fours[0] [3:0] $end + $var wire 4 d% two_fours[1] [3:0] $end + $var wire 4 e% two_fours_var[0] [3:0] $end + $var wire 4 f% two_fours_var[1] [3:0] $end + $scope module unnamedblk1 $end + $var wire 32 :! i [31:0] $end + $upscope $end + $scope module unnamedblk2 $end + $var wire 32 ;! i [31:0] $end + $upscope $end + $scope module unnamedblk3 $end + $var wire 32 ! j [31:0] $end + $upscope $end + $upscope $end + $upscope $end + $upscope $end + $scope module gen_loop[1] $end + $var wire 32 ?! loop_cyc [31:0] $end + $scope module the_sub $end + $var wire 1 @! a $end + $var wire 1 A! b $end + $var wire 1 B! x $end + $var wire 1 C! out_2d_unpacked[0][0] $end + $var wire 1 D! out_2d_unpacked[0][1] $end + $var wire 1 E! out_2d_unpacked[0][2] $end + $var wire 1 F! out_2d_unpacked[0][3] $end + $var wire 1 G! out_2d_unpacked[1][0] $end + $var wire 1 H! out_2d_unpacked[1][1] $end + $var wire 1 I! out_2d_unpacked[1][2] $end + $var wire 1 J! out_2d_unpacked[1][3] $end + $var wire 1 K! out_2d_unpacked[2][0] $end + $var wire 1 L! out_2d_unpacked[2][1] $end + $var wire 1 M! out_2d_unpacked[2][2] $end + $var wire 1 N! out_2d_unpacked[2][3] $end + $scope module data $end + $var wire 1 O! foo $end + $var wire 32 P! bar[0] [31:0] $end + $var wire 32 Q! bar[1] [31:0] $end + $var wire 32 R! bar[2] [31:0] $end + $var wire 32 S! bar[3] [31:0] $end + $var wire 16 T! baz [15:0] $end + $var wire 128 U! qux [127:0] $end + $scope module sub_struct $end + $var wire 1 Y! field_a $end + $var wire 6 Z! field_b [5:0] $end + $var wire 10 [! field_c [9:0] $end + $upscope $end + $upscope $end + $var wire 32 ?! cyc [31:0] $end + $var wire 1 9% clk $end + $scope module the_struct $end + $var wire 1 O! foo $end + $var wire 32 P! bar[0] [31:0] $end + $var wire 32 Q! bar[1] [31:0] $end + $var wire 32 R! bar[2] [31:0] $end + $var wire 32 S! bar[3] [31:0] $end + $var wire 16 T! baz [15:0] $end + $var wire 128 U! qux [127:0] $end + $scope module sub_struct $end + $var wire 1 Y! field_a $end + $var wire 6 Z! field_b [5:0] $end + $var wire 10 [! field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_structs[0] $end + $var wire 1 \! foo $end + $var wire 32 ]! bar[0] [31:0] $end + $var wire 32 ^! bar[1] [31:0] $end + $var wire 32 _! bar[2] [31:0] $end + $var wire 32 `! bar[3] [31:0] $end + $var wire 16 a! baz [15:0] $end + $var wire 128 b! qux [127:0] $end + $scope module sub_struct $end + $var wire 1 f! field_a $end + $var wire 6 g! field_b [5:0] $end + $var wire 10 h! field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_structs[1] $end + $var wire 1 i! foo $end + $var wire 32 j! bar[0] [31:0] $end + $var wire 32 k! bar[1] [31:0] $end + $var wire 32 l! bar[2] [31:0] $end + $var wire 32 m! bar[3] [31:0] $end + $var wire 16 n! baz [15:0] $end + $var wire 128 o! qux [127:0] $end + $scope module sub_struct $end + $var wire 1 s! field_a $end + $var wire 6 t! field_b [5:0] $end + $var wire 10 u! field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_structs[2] $end + $var wire 1 v! foo $end + $var wire 32 w! bar[0] [31:0] $end + $var wire 32 x! bar[1] [31:0] $end + $var wire 32 y! bar[2] [31:0] $end + $var wire 32 z! bar[3] [31:0] $end + $var wire 16 {! baz [15:0] $end + $var wire 128 |! qux [127:0] $end + $scope module sub_struct $end + $var wire 1 "" field_a $end + $var wire 6 #" field_b [5:0] $end + $var wire 10 $" field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_structs[3] $end + $var wire 1 %" foo $end + $var wire 32 &" bar[0] [31:0] $end + $var wire 32 '" bar[1] [31:0] $end + $var wire 32 (" bar[2] [31:0] $end + $var wire 32 )" bar[3] [31:0] $end + $var wire 16 *" baz [15:0] $end + $var wire 128 +" qux [127:0] $end + $scope module sub_struct $end + $var wire 1 /" field_a $end + $var wire 6 0" field_b [5:0] $end + $var wire 10 1" field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_packed_structs[0] $end + $var wire 1 g% foo $end + $var wire 32 h% bar[0] [31:0] $end + $var wire 32 i% bar[1] [31:0] $end + $var wire 32 j% bar[2] [31:0] $end + $var wire 32 k% bar[3] [31:0] $end + $var wire 16 l% baz [15:0] $end + $var wire 128 m% qux [127:0] $end + $scope module sub_struct $end + $var wire 1 q% field_a $end + $var wire 6 r% field_b [5:0] $end + $var wire 10 s% field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_packed_structs[1] $end + $var wire 1 t% foo $end + $var wire 32 u% bar[0] [31:0] $end + $var wire 32 v% bar[1] [31:0] $end + $var wire 32 w% bar[2] [31:0] $end + $var wire 32 x% bar[3] [31:0] $end + $var wire 16 y% baz [15:0] $end + $var wire 128 z% qux [127:0] $end + $scope module sub_struct $end + $var wire 1 ~% field_a $end + $var wire 6 !& field_b [5:0] $end + $var wire 10 "& field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_packed_structs[2] $end + $var wire 1 #& foo $end + $var wire 32 $& bar[0] [31:0] $end + $var wire 32 %& bar[1] [31:0] $end + $var wire 32 && bar[2] [31:0] $end + $var wire 32 '& bar[3] [31:0] $end + $var wire 16 (& baz [15:0] $end + $var wire 128 )& qux [127:0] $end + $scope module sub_struct $end + $var wire 1 -& field_a $end + $var wire 6 .& field_b [5:0] $end + $var wire 10 /& field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_local_struct $end + $var wire 1 2" abc $end + $var wire 1 3" def $end + $var wire 1 4" xyz $end + $upscope $end + $scope module const_struct $end + $var wire 1 a% abc $end + $var wire 1 b% def $end + $var wire 1 a% xyz $end + $upscope $end + $scope module the_typedefed_struct $end + $var wire 1 5" abc $end + $var wire 1 6" def $end + $var wire 1 7" xyz $end + $upscope $end + $scope module the_local_unpacked_struct $end + $var wire 1 8" field_a $end + $var wire 1 9" field_b $end + $var wire 1 :" field_c $end + $upscope $end + $scope module the_local_union $end + $scope module union_a $end + $var wire 8 ;" field_0 [7:0] $end + $upscope $end + $scope module union_b $end + $var wire 4 <" field_1 [3:0] $end + $var wire 4 =" field_2 [3:0] $end + $upscope $end + $scope module union_c $end + $var wire 2 >" field_3 [1:0] $end + $var wire 6 ?" field_4 [5:0] $end + $upscope $end + $upscope $end + $var wire 32 @" the_logic_array[0] [31:0] $end + $var wire 32 A" the_logic_array[1] [31:0] $end + $var wire 32 B" the_other_logic_array[0] [31:0] $end + $var wire 32 C" the_other_logic_array[1] [31:0] $end + $var wire 16 D" the_unpacked_array[0] [15:0] $end + $var wire 16 E" the_unpacked_array[1] [15:0] $end + $var wire 16 F" the_unpacked_array[2] [15:0] $end + $var wire 16 G" the_unpacked_array[3] [15:0] $end + $var wire 16 H" the_unpacked_array[4] [15:0] $end + $var wire 1 I" the_2d_unpacked[0][0] $end + $var wire 1 J" the_2d_unpacked[0][1] $end + $var wire 1 K" the_2d_unpacked[0][2] $end + $var wire 1 L" the_2d_unpacked[0][3] $end + $var wire 1 M" the_2d_unpacked[1][0] $end + $var wire 1 N" the_2d_unpacked[1][1] $end + $var wire 1 O" the_2d_unpacked[1][2] $end + $var wire 1 P" the_2d_unpacked[1][3] $end + $var wire 1 Q" the_2d_unpacked[2][0] $end + $var wire 1 R" the_2d_unpacked[2][1] $end + $var wire 1 S" the_2d_unpacked[2][2] $end + $var wire 1 T" the_2d_unpacked[2][3] $end + $var wire 4 c% two_fours[0] [3:0] $end + $var wire 4 d% two_fours[1] [3:0] $end + $var wire 4 0& two_fours_var[0] [3:0] $end + $var wire 4 1& two_fours_var[1] [3:0] $end + $scope module unnamedblk1 $end + $var wire 32 U" i [31:0] $end + $upscope $end + $scope module unnamedblk2 $end + $var wire 32 V" i [31:0] $end + $upscope $end + $scope module unnamedblk3 $end + $var wire 32 W" i [31:0] $end + $upscope $end + $scope module unnamedblk4 $end + $var wire 32 X" i [31:0] $end + $scope module unnamedblk5 $end + $var wire 32 Y" j [31:0] $end + $upscope $end + $upscope $end + $upscope $end + $upscope $end + $scope module gen_loop[2] $end + $var wire 32 Z" loop_cyc [31:0] $end + $scope module the_sub $end + $var wire 1 [" a $end + $var wire 1 \" b $end + $var wire 1 ]" x $end + $var wire 1 ^" out_2d_unpacked[0][0] $end + $var wire 1 _" out_2d_unpacked[0][1] $end + $var wire 1 `" out_2d_unpacked[0][2] $end + $var wire 1 a" out_2d_unpacked[0][3] $end + $var wire 1 b" out_2d_unpacked[1][0] $end + $var wire 1 c" out_2d_unpacked[1][1] $end + $var wire 1 d" out_2d_unpacked[1][2] $end + $var wire 1 e" out_2d_unpacked[1][3] $end + $var wire 1 f" out_2d_unpacked[2][0] $end + $var wire 1 g" out_2d_unpacked[2][1] $end + $var wire 1 h" out_2d_unpacked[2][2] $end + $var wire 1 i" out_2d_unpacked[2][3] $end + $scope module data $end + $var wire 1 j" foo $end + $var wire 32 k" bar[0] [31:0] $end + $var wire 32 l" bar[1] [31:0] $end + $var wire 32 m" bar[2] [31:0] $end + $var wire 32 n" bar[3] [31:0] $end + $var wire 16 o" baz [15:0] $end + $var wire 128 p" qux [127:0] $end + $scope module sub_struct $end + $var wire 1 t" field_a $end + $var wire 6 u" field_b [5:0] $end + $var wire 10 v" field_c [9:0] $end + $upscope $end + $upscope $end + $var wire 32 Z" cyc [31:0] $end + $var wire 1 9% clk $end + $scope module the_struct $end + $var wire 1 j" foo $end + $var wire 32 k" bar[0] [31:0] $end + $var wire 32 l" bar[1] [31:0] $end + $var wire 32 m" bar[2] [31:0] $end + $var wire 32 n" bar[3] [31:0] $end + $var wire 16 o" baz [15:0] $end + $var wire 128 p" qux [127:0] $end + $scope module sub_struct $end + $var wire 1 t" field_a $end + $var wire 6 u" field_b [5:0] $end + $var wire 10 v" field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_structs[0] $end + $var wire 1 w" foo $end + $var wire 32 x" bar[0] [31:0] $end + $var wire 32 y" bar[1] [31:0] $end + $var wire 32 z" bar[2] [31:0] $end + $var wire 32 {" bar[3] [31:0] $end + $var wire 16 |" baz [15:0] $end + $var wire 128 }" qux [127:0] $end + $scope module sub_struct $end + $var wire 1 ## field_a $end + $var wire 6 $# field_b [5:0] $end + $var wire 10 %# field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_structs[1] $end + $var wire 1 &# foo $end + $var wire 32 '# bar[0] [31:0] $end + $var wire 32 (# bar[1] [31:0] $end + $var wire 32 )# bar[2] [31:0] $end + $var wire 32 *# bar[3] [31:0] $end + $var wire 16 +# baz [15:0] $end + $var wire 128 ,# qux [127:0] $end + $scope module sub_struct $end + $var wire 1 0# field_a $end + $var wire 6 1# field_b [5:0] $end + $var wire 10 2# field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_structs[2] $end + $var wire 1 3# foo $end + $var wire 32 4# bar[0] [31:0] $end + $var wire 32 5# bar[1] [31:0] $end + $var wire 32 6# bar[2] [31:0] $end + $var wire 32 7# bar[3] [31:0] $end + $var wire 16 8# baz [15:0] $end + $var wire 128 9# qux [127:0] $end + $scope module sub_struct $end + $var wire 1 =# field_a $end + $var wire 6 ># field_b [5:0] $end + $var wire 10 ?# field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_structs[3] $end + $var wire 1 @# foo $end + $var wire 32 A# bar[0] [31:0] $end + $var wire 32 B# bar[1] [31:0] $end + $var wire 32 C# bar[2] [31:0] $end + $var wire 32 D# bar[3] [31:0] $end + $var wire 16 E# baz [15:0] $end + $var wire 128 F# qux [127:0] $end + $scope module sub_struct $end + $var wire 1 J# field_a $end + $var wire 6 K# field_b [5:0] $end + $var wire 10 L# field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_packed_structs[0] $end + $var wire 1 2& foo $end + $var wire 32 3& bar[0] [31:0] $end + $var wire 32 4& bar[1] [31:0] $end + $var wire 32 5& bar[2] [31:0] $end + $var wire 32 6& bar[3] [31:0] $end + $var wire 16 7& baz [15:0] $end + $var wire 128 8& qux [127:0] $end + $scope module sub_struct $end + $var wire 1 <& field_a $end + $var wire 6 =& field_b [5:0] $end + $var wire 10 >& field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_packed_structs[1] $end + $var wire 1 ?& foo $end + $var wire 32 @& bar[0] [31:0] $end + $var wire 32 A& bar[1] [31:0] $end + $var wire 32 B& bar[2] [31:0] $end + $var wire 32 C& bar[3] [31:0] $end + $var wire 16 D& baz [15:0] $end + $var wire 128 E& qux [127:0] $end + $scope module sub_struct $end + $var wire 1 I& field_a $end + $var wire 6 J& field_b [5:0] $end + $var wire 10 K& field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_packed_structs[2] $end + $var wire 1 L& foo $end + $var wire 32 M& bar[0] [31:0] $end + $var wire 32 N& bar[1] [31:0] $end + $var wire 32 O& bar[2] [31:0] $end + $var wire 32 P& bar[3] [31:0] $end + $var wire 16 Q& baz [15:0] $end + $var wire 128 R& qux [127:0] $end + $scope module sub_struct $end + $var wire 1 V& field_a $end + $var wire 6 W& field_b [5:0] $end + $var wire 10 X& field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_local_struct $end + $var wire 1 M# abc $end + $var wire 1 N# def $end + $var wire 1 O# xyz $end + $upscope $end + $scope module const_struct $end + $var wire 1 a% abc $end + $var wire 1 b% def $end + $var wire 1 a% xyz $end + $upscope $end + $scope module the_typedefed_struct $end + $var wire 1 P# abc $end + $var wire 1 Q# def $end + $var wire 1 R# xyz $end + $upscope $end + $scope module the_local_unpacked_struct $end + $var wire 1 S# field_a $end + $var wire 1 T# field_b $end + $var wire 1 U# field_c $end + $upscope $end + $scope module the_local_union $end + $scope module union_a $end + $var wire 8 V# field_0 [7:0] $end + $upscope $end + $scope module union_b $end + $var wire 4 W# field_1 [3:0] $end + $var wire 4 X# field_2 [3:0] $end + $upscope $end + $scope module union_c $end + $var wire 2 Y# field_3 [1:0] $end + $var wire 6 Z# field_4 [5:0] $end + $upscope $end + $upscope $end + $var wire 32 [# the_logic_array[0] [31:0] $end + $var wire 32 \# the_logic_array[1] [31:0] $end + $var wire 32 ]# the_other_logic_array[0] [31:0] $end + $var wire 32 ^# the_other_logic_array[1] [31:0] $end + $var wire 16 _# the_unpacked_array[0] [15:0] $end + $var wire 16 `# the_unpacked_array[1] [15:0] $end + $var wire 16 a# the_unpacked_array[2] [15:0] $end + $var wire 16 b# the_unpacked_array[3] [15:0] $end + $var wire 16 c# the_unpacked_array[4] [15:0] $end + $var wire 1 d# the_2d_unpacked[0][0] $end + $var wire 1 e# the_2d_unpacked[0][1] $end + $var wire 1 f# the_2d_unpacked[0][2] $end + $var wire 1 g# the_2d_unpacked[0][3] $end + $var wire 1 h# the_2d_unpacked[1][0] $end + $var wire 1 i# the_2d_unpacked[1][1] $end + $var wire 1 j# the_2d_unpacked[1][2] $end + $var wire 1 k# the_2d_unpacked[1][3] $end + $var wire 1 l# the_2d_unpacked[2][0] $end + $var wire 1 m# the_2d_unpacked[2][1] $end + $var wire 1 n# the_2d_unpacked[2][2] $end + $var wire 1 o# the_2d_unpacked[2][3] $end + $var wire 4 c% two_fours[0] [3:0] $end + $var wire 4 d% two_fours[1] [3:0] $end + $var wire 4 Y& two_fours_var[0] [3:0] $end + $var wire 4 Z& two_fours_var[1] [3:0] $end + $scope module unnamedblk1 $end + $var wire 32 p# i [31:0] $end + $upscope $end + $scope module unnamedblk2 $end + $var wire 32 q# i [31:0] $end + $upscope $end + $scope module unnamedblk3 $end + $var wire 32 r# i [31:0] $end + $upscope $end + $scope module unnamedblk4 $end + $var wire 32 s# i [31:0] $end + $scope module unnamedblk5 $end + $var wire 32 t# j [31:0] $end + $upscope $end + $upscope $end + $upscope $end + $upscope $end + $scope module gen_loop[3] $end + $var wire 32 u# loop_cyc [31:0] $end + $scope module the_sub $end + $var wire 1 v# a $end + $var wire 1 w# b $end + $var wire 1 x# x $end + $var wire 1 y# out_2d_unpacked[0][0] $end + $var wire 1 z# out_2d_unpacked[0][1] $end + $var wire 1 {# out_2d_unpacked[0][2] $end + $var wire 1 |# out_2d_unpacked[0][3] $end + $var wire 1 }# out_2d_unpacked[1][0] $end + $var wire 1 ~# out_2d_unpacked[1][1] $end + $var wire 1 !$ out_2d_unpacked[1][2] $end + $var wire 1 "$ out_2d_unpacked[1][3] $end + $var wire 1 #$ out_2d_unpacked[2][0] $end + $var wire 1 $$ out_2d_unpacked[2][1] $end + $var wire 1 %$ out_2d_unpacked[2][2] $end + $var wire 1 &$ out_2d_unpacked[2][3] $end + $scope module data $end + $var wire 1 '$ foo $end + $var wire 32 ($ bar[0] [31:0] $end + $var wire 32 )$ bar[1] [31:0] $end + $var wire 32 *$ bar[2] [31:0] $end + $var wire 32 +$ bar[3] [31:0] $end + $var wire 16 ,$ baz [15:0] $end + $var wire 128 -$ qux [127:0] $end + $scope module sub_struct $end + $var wire 1 1$ field_a $end + $var wire 6 2$ field_b [5:0] $end + $var wire 10 3$ field_c [9:0] $end + $upscope $end + $upscope $end + $var wire 32 u# cyc [31:0] $end + $var wire 1 9% clk $end + $scope module the_struct $end + $var wire 1 '$ foo $end + $var wire 32 ($ bar[0] [31:0] $end + $var wire 32 )$ bar[1] [31:0] $end + $var wire 32 *$ bar[2] [31:0] $end + $var wire 32 +$ bar[3] [31:0] $end + $var wire 16 ,$ baz [15:0] $end + $var wire 128 -$ qux [127:0] $end + $scope module sub_struct $end + $var wire 1 1$ field_a $end + $var wire 6 2$ field_b [5:0] $end + $var wire 10 3$ field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_structs[0] $end + $var wire 1 4$ foo $end + $var wire 32 5$ bar[0] [31:0] $end + $var wire 32 6$ bar[1] [31:0] $end + $var wire 32 7$ bar[2] [31:0] $end + $var wire 32 8$ bar[3] [31:0] $end + $var wire 16 9$ baz [15:0] $end + $var wire 128 :$ qux [127:0] $end + $scope module sub_struct $end + $var wire 1 >$ field_a $end + $var wire 6 ?$ field_b [5:0] $end + $var wire 10 @$ field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_structs[1] $end + $var wire 1 A$ foo $end + $var wire 32 B$ bar[0] [31:0] $end + $var wire 32 C$ bar[1] [31:0] $end + $var wire 32 D$ bar[2] [31:0] $end + $var wire 32 E$ bar[3] [31:0] $end + $var wire 16 F$ baz [15:0] $end + $var wire 128 G$ qux [127:0] $end + $scope module sub_struct $end + $var wire 1 K$ field_a $end + $var wire 6 L$ field_b [5:0] $end + $var wire 10 M$ field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_structs[2] $end + $var wire 1 N$ foo $end + $var wire 32 O$ bar[0] [31:0] $end + $var wire 32 P$ bar[1] [31:0] $end + $var wire 32 Q$ bar[2] [31:0] $end + $var wire 32 R$ bar[3] [31:0] $end + $var wire 16 S$ baz [15:0] $end + $var wire 128 T$ qux [127:0] $end + $scope module sub_struct $end + $var wire 1 X$ field_a $end + $var wire 6 Y$ field_b [5:0] $end + $var wire 10 Z$ field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_structs[3] $end + $var wire 1 [$ foo $end + $var wire 32 \$ bar[0] [31:0] $end + $var wire 32 ]$ bar[1] [31:0] $end + $var wire 32 ^$ bar[2] [31:0] $end + $var wire 32 _$ bar[3] [31:0] $end + $var wire 16 `$ baz [15:0] $end + $var wire 128 a$ qux [127:0] $end + $scope module sub_struct $end + $var wire 1 e$ field_a $end + $var wire 6 f$ field_b [5:0] $end + $var wire 10 g$ field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_packed_structs[0] $end + $var wire 1 [& foo $end + $var wire 32 \& bar[0] [31:0] $end + $var wire 32 ]& bar[1] [31:0] $end + $var wire 32 ^& bar[2] [31:0] $end + $var wire 32 _& bar[3] [31:0] $end + $var wire 16 `& baz [15:0] $end + $var wire 128 a& qux [127:0] $end + $scope module sub_struct $end + $var wire 1 e& field_a $end + $var wire 6 f& field_b [5:0] $end + $var wire 10 g& field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_packed_structs[1] $end + $var wire 1 h& foo $end + $var wire 32 i& bar[0] [31:0] $end + $var wire 32 j& bar[1] [31:0] $end + $var wire 32 k& bar[2] [31:0] $end + $var wire 32 l& bar[3] [31:0] $end + $var wire 16 m& baz [15:0] $end + $var wire 128 n& qux [127:0] $end + $scope module sub_struct $end + $var wire 1 r& field_a $end + $var wire 6 s& field_b [5:0] $end + $var wire 10 t& field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_packed_structs[2] $end + $var wire 1 u& foo $end + $var wire 32 v& bar[0] [31:0] $end + $var wire 32 w& bar[1] [31:0] $end + $var wire 32 x& bar[2] [31:0] $end + $var wire 32 y& bar[3] [31:0] $end + $var wire 16 z& baz [15:0] $end + $var wire 128 {& qux [127:0] $end + $scope module sub_struct $end + $var wire 1 !' field_a $end + $var wire 6 "' field_b [5:0] $end + $var wire 10 #' field_c [9:0] $end + $upscope $end + $upscope $end + $scope module the_local_struct $end + $var wire 1 h$ abc $end + $var wire 1 i$ def $end + $var wire 1 j$ xyz $end + $upscope $end + $scope module const_struct $end + $var wire 1 a% abc $end + $var wire 1 b% def $end + $var wire 1 a% xyz $end + $upscope $end + $scope module the_typedefed_struct $end + $var wire 1 k$ abc $end + $var wire 1 l$ def $end + $var wire 1 m$ xyz $end + $upscope $end + $scope module the_local_unpacked_struct $end + $var wire 1 n$ field_a $end + $var wire 1 o$ field_b $end + $var wire 1 p$ field_c $end + $upscope $end + $scope module the_local_union $end + $scope module union_a $end + $var wire 8 q$ field_0 [7:0] $end + $upscope $end + $scope module union_b $end + $var wire 4 r$ field_1 [3:0] $end + $var wire 4 s$ field_2 [3:0] $end + $upscope $end + $scope module union_c $end + $var wire 2 t$ field_3 [1:0] $end + $var wire 6 u$ field_4 [5:0] $end + $upscope $end + $upscope $end + $var wire 32 v$ the_logic_array[0] [31:0] $end + $var wire 32 w$ the_logic_array[1] [31:0] $end + $var wire 32 x$ the_other_logic_array[0] [31:0] $end + $var wire 32 y$ the_other_logic_array[1] [31:0] $end + $var wire 16 z$ the_unpacked_array[0] [15:0] $end + $var wire 16 {$ the_unpacked_array[1] [15:0] $end + $var wire 16 |$ the_unpacked_array[2] [15:0] $end + $var wire 16 }$ the_unpacked_array[3] [15:0] $end + $var wire 16 ~$ the_unpacked_array[4] [15:0] $end + $var wire 1 !% the_2d_unpacked[0][0] $end + $var wire 1 "% the_2d_unpacked[0][1] $end + $var wire 1 #% the_2d_unpacked[0][2] $end + $var wire 1 $% the_2d_unpacked[0][3] $end + $var wire 1 %% the_2d_unpacked[1][0] $end + $var wire 1 &% the_2d_unpacked[1][1] $end + $var wire 1 '% the_2d_unpacked[1][2] $end + $var wire 1 (% the_2d_unpacked[1][3] $end + $var wire 1 )% the_2d_unpacked[2][0] $end + $var wire 1 *% the_2d_unpacked[2][1] $end + $var wire 1 +% the_2d_unpacked[2][2] $end + $var wire 1 ,% the_2d_unpacked[2][3] $end + $var wire 4 c% two_fours[0] [3:0] $end + $var wire 4 d% two_fours[1] [3:0] $end + $var wire 4 $' two_fours_var[0] [3:0] $end + $var wire 4 %' two_fours_var[1] [3:0] $end + $scope module unnamedblk1 $end + $var wire 32 -% i [31:0] $end + $upscope $end + $scope module unnamedblk2 $end + $var wire 32 .% i [31:0] $end + $upscope $end + $scope module unnamedblk3 $end + $var wire 32 /% i [31:0] $end + $upscope $end + $scope module unnamedblk4 $end + $var wire 32 0% i [31:0] $end + $scope module unnamedblk5 $end + $var wire 32 1% j [31:0] $end + $upscope $end + $upscope $end + $upscope $end + $upscope $end + $upscope $end + $upscope $end +$enddefinitions $end + + +#0 +b00000000000000000000000000000000 # +b0000 $ +0% +0& +0' +0( +0) +0* +0+ +0, +0- +0. +0/ +00 +01 +02 +03 +04 +b00000000000000000000000000000000 5 +b00000000000000000000000000000000 6 +b00000000000000000000000000000000 7 +b00000000000000000000000000000000 8 +b0000000000000000 9 +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 : +0> +b000000 ? +b0000000000 @ +0A +b00000000000000000000000000000000 B +b00000000000000000000000000000000 C +b00000000000000000000000000000000 D +b00000000000000000000000000000000 E +b0000000000000000 F +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 G +0K +b000000 L +b0000000000 M +0N +b00000000000000000000000000000000 O +b00000000000000000000000000000000 P +b00000000000000000000000000000000 Q +b00000000000000000000000000000000 R +b0000000000000000 S +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 T +0X +b000000 Y +b0000000000 Z +0[ +b00000000000000000000000000000000 \ +b00000000000000000000000000000000 ] +b00000000000000000000000000000000 ^ +b00000000000000000000000000000000 _ +b0000000000000000 ` +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a +0e +b000000 f +b0000000000 g +0h +b00000000000000000000000000000000 i +b00000000000000000000000000000000 j +b00000000000000000000000000000000 k +b00000000000000000000000000000000 l +b0000000000000000 m +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 n +0r +b000000 s +b0000000000 t +0u +0v +0w +0x +0y +0z +0{ +0| +0} +b00000000 ~ +b0000 !! +b0000 "! +b00 #! +b000000 $! +b00000000000000000000000000000000 %! +b00000000000000000000000000000000 &! +b00000000000000000000000000000000 '! +b00000000000000000000000000000000 (! +b0000000000000000 )! +b0000000000000000 *! +b0000000000000000 +! +b0000000000000000 ,! +b0000000000000000 -! +0.! +0/! +00! +01! +02! +03! +04! +05! +06! +07! +08! +09! +b00000000000000000000000000000000 :! +b00000000000000000000000000000000 ;! +b00000000000000000000000000000000 ! +b00000000000000000000000000000001 ?! +0@! +0A! +0B! +0C! +0D! +0E! +0F! +0G! +0H! +0I! +0J! +0K! +0L! +0M! +0N! +0O! +b00000000000000000000000000000000 P! +b00000000000000000000000000000000 Q! +b00000000000000000000000000000000 R! +b00000000000000000000000000000000 S! +b0000000000000000 T! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 U! +0Y! +b000000 Z! +b0000000000 [! +0\! +b00000000000000000000000000000000 ]! +b00000000000000000000000000000000 ^! +b00000000000000000000000000000000 _! +b00000000000000000000000000000000 `! +b0000000000000000 a! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 b! +0f! +b000000 g! +b0000000000 h! +0i! +b00000000000000000000000000000000 j! +b00000000000000000000000000000000 k! +b00000000000000000000000000000000 l! +b00000000000000000000000000000000 m! +b0000000000000000 n! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 o! +0s! +b000000 t! +b0000000000 u! +0v! +b00000000000000000000000000000000 w! +b00000000000000000000000000000000 x! +b00000000000000000000000000000000 y! +b00000000000000000000000000000000 z! +b0000000000000000 {! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 |! +0"" +b000000 #" +b0000000000 $" +0%" +b00000000000000000000000000000000 &" +b00000000000000000000000000000000 '" +b00000000000000000000000000000000 (" +b00000000000000000000000000000000 )" +b0000000000000000 *" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +" +0/" +b000000 0" +b0000000000 1" +02" +03" +04" +05" +06" +07" +08" +09" +0:" +b00000000 ;" +b0000 <" +b0000 =" +b00 >" +b000000 ?" +b00000000000000000000000000000000 @" +b00000000000000000000000000000000 A" +b00000000000000000000000000000000 B" +b00000000000000000000000000000000 C" +b0000000000000000 D" +b0000000000000000 E" +b0000000000000000 F" +b0000000000000000 G" +b0000000000000000 H" +0I" +0J" +0K" +0L" +0M" +0N" +0O" +0P" +0Q" +0R" +0S" +0T" +b00000000000000000000000000000000 U" +b00000000000000000000000000000000 V" +b00000000000000000000000000000000 W" +b00000000000000000000000000000000 X" +b00000000000000000000000000000000 Y" +b00000000000000000000000000000010 Z" +0[" +0\" +0]" +0^" +0_" +0`" +0a" +0b" +0c" +0d" +0e" +0f" +0g" +0h" +0i" +0j" +b00000000000000000000000000000000 k" +b00000000000000000000000000000000 l" +b00000000000000000000000000000000 m" +b00000000000000000000000000000000 n" +b0000000000000000 o" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 p" +0t" +b000000 u" +b0000000000 v" +0w" +b00000000000000000000000000000000 x" +b00000000000000000000000000000000 y" +b00000000000000000000000000000000 z" +b00000000000000000000000000000000 {" +b0000000000000000 |" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }" +0## +b000000 $# +b0000000000 %# +0&# +b00000000000000000000000000000000 '# +b00000000000000000000000000000000 (# +b00000000000000000000000000000000 )# +b00000000000000000000000000000000 *# +b0000000000000000 +# +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ,# +00# +b000000 1# +b0000000000 2# +03# +b00000000000000000000000000000000 4# +b00000000000000000000000000000000 5# +b00000000000000000000000000000000 6# +b00000000000000000000000000000000 7# +b0000000000000000 8# +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 9# +0=# +b000000 ># +b0000000000 ?# +0@# +b00000000000000000000000000000000 A# +b00000000000000000000000000000000 B# +b00000000000000000000000000000000 C# +b00000000000000000000000000000000 D# +b0000000000000000 E# +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 F# +0J# +b000000 K# +b0000000000 L# +0M# +0N# +0O# +0P# +0Q# +0R# +0S# +0T# +0U# +b00000000 V# +b0000 W# +b0000 X# +b00 Y# +b000000 Z# +b00000000000000000000000000000000 [# +b00000000000000000000000000000000 \# +b00000000000000000000000000000000 ]# +b00000000000000000000000000000000 ^# +b0000000000000000 _# +b0000000000000000 `# +b0000000000000000 a# +b0000000000000000 b# +b0000000000000000 c# +0d# +0e# +0f# +0g# +0h# +0i# +0j# +0k# +0l# +0m# +0n# +0o# +b00000000000000000000000000000000 p# +b00000000000000000000000000000000 q# +b00000000000000000000000000000000 r# +b00000000000000000000000000000000 s# +b00000000000000000000000000000000 t# +b00000000000000000000000000000011 u# +0v# +0w# +0x# +0y# +0z# +0{# +0|# +0}# +0~# +0!$ +0"$ +0#$ +0$$ +0%$ +0&$ +0'$ +b00000000000000000000000000000000 ($ +b00000000000000000000000000000000 )$ +b00000000000000000000000000000000 *$ +b00000000000000000000000000000000 +$ +b0000000000000000 ,$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -$ +01$ +b000000 2$ +b0000000000 3$ +04$ +b00000000000000000000000000000000 5$ +b00000000000000000000000000000000 6$ +b00000000000000000000000000000000 7$ +b00000000000000000000000000000000 8$ +b0000000000000000 9$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 :$ +0>$ +b000000 ?$ +b0000000000 @$ +0A$ +b00000000000000000000000000000000 B$ +b00000000000000000000000000000000 C$ +b00000000000000000000000000000000 D$ +b00000000000000000000000000000000 E$ +b0000000000000000 F$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 G$ +0K$ +b000000 L$ +b0000000000 M$ +0N$ +b00000000000000000000000000000000 O$ +b00000000000000000000000000000000 P$ +b00000000000000000000000000000000 Q$ +b00000000000000000000000000000000 R$ +b0000000000000000 S$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 T$ +0X$ +b000000 Y$ +b0000000000 Z$ +0[$ +b00000000000000000000000000000000 \$ +b00000000000000000000000000000000 ]$ +b00000000000000000000000000000000 ^$ +b00000000000000000000000000000000 _$ +b0000000000000000 `$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a$ +0e$ +b000000 f$ +b0000000000 g$ +0h$ +0i$ +0j$ +0k$ +0l$ +0m$ +0n$ +0o$ +0p$ +b00000000 q$ +b0000 r$ +b0000 s$ +b00 t$ +b000000 u$ +b00000000000000000000000000000000 v$ +b00000000000000000000000000000000 w$ +b00000000000000000000000000000000 x$ +b00000000000000000000000000000000 y$ +b0000000000000000 z$ +b0000000000000000 {$ +b0000000000000000 |$ +b0000000000000000 }$ +b0000000000000000 ~$ +0!% +0"% +0#% +0$% +0%% +0&% +0'% +0(% +0)% +0*% +0+% +0,% +b00000000000000000000000000000000 -% +b00000000000000000000000000000000 .% +b00000000000000000000000000000000 /% +b00000000000000000000000000000000 0% +b00000000000000000000000000000000 1% +b00000001 2% +b00000010 3% +b00000011 4% +b00000100 5% +b00000100000000110000001000000001 6% +b00000101 7% +b00000101000001000000001100000010 8% +09% +0:% +b00000000000000000000000000000000 ;% +b00000000000000000000000000000000 <% +b00000000000000000000000000000000 =% +b00000000000000000000000000000000 >% +b0000000000000000 ?% +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 @% +0D% +b000000 E% +b0000000000 F% +0G% +b00000000000000000000000000000000 H% +b00000000000000000000000000000000 I% +b00000000000000000000000000000000 J% +b00000000000000000000000000000000 K% +b0000000000000000 L% +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 M% +0Q% +b000000 R% +b0000000000 S% +0T% +b00000000000000000000000000000000 U% +b00000000000000000000000000000000 V% +b00000000000000000000000000000000 W% +b00000000000000000000000000000000 X% +b0000000000000000 Y% +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Z% +0^% +b000000 _% +b0000000000 `% +1a% +0b% +b1011 c% +b1010 d% +b0000 e% +b0000 f% +0g% +b00000000000000000000000000000000 h% +b00000000000000000000000000000000 i% +b00000000000000000000000000000000 j% +b00000000000000000000000000000000 k% +b0000000000000000 l% +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 m% +0q% +b000000 r% +b0000000000 s% +0t% +b00000000000000000000000000000000 u% +b00000000000000000000000000000000 v% +b00000000000000000000000000000000 w% +b00000000000000000000000000000000 x% +b0000000000000000 y% +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 z% +0~% +b000000 !& +b0000000000 "& +0#& +b00000000000000000000000000000000 $& +b00000000000000000000000000000000 %& +b00000000000000000000000000000000 && +b00000000000000000000000000000000 '& +b0000000000000000 (& +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 )& +0-& +b000000 .& +b0000000000 /& +b0000 0& +b0000 1& +02& +b00000000000000000000000000000000 3& +b00000000000000000000000000000000 4& +b00000000000000000000000000000000 5& +b00000000000000000000000000000000 6& +b0000000000000000 7& +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 8& +0<& +b000000 =& +b0000000000 >& +0?& +b00000000000000000000000000000000 @& +b00000000000000000000000000000000 A& +b00000000000000000000000000000000 B& +b00000000000000000000000000000000 C& +b0000000000000000 D& +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 E& +0I& +b000000 J& +b0000000000 K& +0L& +b00000000000000000000000000000000 M& +b00000000000000000000000000000000 N& +b00000000000000000000000000000000 O& +b00000000000000000000000000000000 P& +b0000000000000000 Q& +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 R& +0V& +b000000 W& +b0000000000 X& +b0000 Y& +b0000 Z& +0[& +b00000000000000000000000000000000 \& +b00000000000000000000000000000000 ]& +b00000000000000000000000000000000 ^& +b00000000000000000000000000000000 _& +b0000000000000000 `& +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a& +0e& +b000000 f& +b0000000000 g& +0h& +b00000000000000000000000000000000 i& +b00000000000000000000000000000000 j& +b00000000000000000000000000000000 k& +b00000000000000000000000000000000 l& +b0000000000000000 m& +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 n& +0r& +b000000 s& +b0000000000 t& +0u& +b00000000000000000000000000000000 v& +b00000000000000000000000000000000 w& +b00000000000000000000000000000000 x& +b00000000000000000000000000000000 y& +b0000000000000000 z& +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 {& +0!' +b000000 "' +b0000000000 #' +b0000 $' +b0000 %' +b111111 &' +b1111111111 '' +b000000 (' +b0000000000 )' +#10 +b00000000000000000000000000000001 # +1% +b00000000000000000000000000000011 5 +b00000000000000000000000000000010 6 +b00000000000000000000000000000001 7 +b00000000000000000000000000000001 &! +b00000000000000000000000001111011 '! +b00000000000000000000000001111100 (! +1.! +1/! +10! +11! +12! +13! +14! +15! +16! +17! +18! +19! +b00000000000000000000000000000100 :! +b00000000000000000000000000000010 ;! +b00000000000000000000000000000101 ! +b00000000000000000000000000000010 ?! +1@! +1D! +1E! +1F! +1G! +1K! +1O! +b00000000000000000000000000000100 P! +b00000000000000000000000000000011 Q! +b00000000000000000000000000000010 R! +b00000000000000000000000000000001 S! +b0000000000000001 T! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 U! +1Y! +b000001 Z! +b0000000001 [! +1\! +b11111111111111111111111111111111 ]! +b11111111111111111111111111111111 ^! +b11111111111111111111111111111111 _! +b11111111111111111111111111111111 `! +b1111111111111111 a! +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 b! +1f! +b111111 g! +b1111111111 h! +14" +18" +b00000001 ;" +b0001 =" +b000001 ?" +b00000000000000000000000000000001 @" +b00000000000000000000000000000010 A" +b00000000000000000000000001111100 B" +b00000000000000000000000001111101 C" +b0000000000000001 D" +b0000000000000001 E" +b0000000000000001 F" +b0000000000000001 G" +b0000000000000001 H" +1I" +1N" +1O" +1P" +1R" +1S" +1T" +b00000000000000000000000000000100 U" +b00000000000000000000000000000010 V" +b00000000000000000000000000000101 W" +b00000000000000000000000000000011 X" +b00000000000000000000000000000100 Y" +b00000000000000000000000000000011 Z" +1_" +1b" +1d" +1e" +1g" +b00000000000000000000000000000101 k" +b00000000000000000000000000000100 l" +b00000000000000000000000000000011 m" +b00000000000000000000000000000010 n" +b0000000000000010 o" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010 p" +b000010 u" +b0000000010 v" +1&# +b11111111111111111111111111111111 '# +b11111111111111111111111111111111 (# +b11111111111111111111111111111111 )# +b11111111111111111111111111111111 *# +b1111111111111111 +# +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 ,# +10# +b111111 1# +b1111111111 2# +1N# +1R# +1T# +b00000010 V# +b0010 X# +b000010 Z# +b00000000000000000000000000000010 [# +b00000000000000000000000000000011 \# +b00000000000000000000000001111101 ]# +b00000000000000000000000001111110 ^# +b0000000000000010 _# +b0000000000000010 `# +b0000000000000010 a# +b0000000000000010 b# +b0000000000000010 c# +1d# +1f# +1g# +1i# +1l# +1n# +1o# +b00000000000000000000000000000100 p# +b00000000000000000000000000000010 q# +b00000000000000000000000000000101 r# +b00000000000000000000000000000011 s# +b00000000000000000000000000000100 t# +b00000000000000000000000000000100 u# +1{# +1|# +1!$ +1"$ +1#$ +1$$ +1'$ +b00000000000000000000000000000110 ($ +b00000000000000000000000000000101 )$ +b00000000000000000000000000000100 *$ +b00000000000000000000000000000011 +$ +b0000000000000011 ,$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011 -$ +11$ +b000011 2$ +b0000000011 3$ +14$ +b11111111111111111111111111111111 5$ +b11111111111111111111111111111111 6$ +b11111111111111111111111111111111 7$ +b11111111111111111111111111111111 8$ +b1111111111111111 9$ +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 :$ +1>$ +b111111 ?$ +b1111111111 @$ +1A$ +b11111111111111111111111111111111 B$ +b11111111111111111111111111111111 C$ +b11111111111111111111111111111111 D$ +b11111111111111111111111111111111 E$ +b1111111111111111 F$ +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 G$ +1K$ +b111111 L$ +b1111111111 M$ +1i$ +1j$ +1m$ +1n$ +1o$ +b00000011 q$ +b0011 s$ +b000011 u$ +b00000000000000000000000000000011 v$ +b00000000000000000000000000000100 w$ +b00000000000000000000000001111110 x$ +b00000000000000000000000001111111 y$ +b0000000000000011 z$ +b0000000000000011 {$ +b0000000000000011 |$ +b0000000000000011 }$ +b0000000000000011 ~$ +1!% +1"% +1%% +1&% +1+% +1,% +b00000000000000000000000000000100 -% +b00000000000000000000000000000010 .% +b00000000000000000000000000000101 /% +b00000000000000000000000000000011 0% +b00000000000000000000000000000100 1% +b00000010 2% +b00000011 3% +b00000100 4% +b00000101 5% +b00000101000001000000001100000010 6% +b00000110 7% +b00000110000001010000010000000011 8% +19% +#15 +09% +#20 +b00000000000000000000000000000010 # +b0011 $ +0% +1& +1' +1) +1* +1+ +1, +10 +14 +b00000000000000000000000000000100 5 +b00000000000000000000000000000011 6 +b00000000000000000000000000000010 7 +b00000000000000000000000000000001 8 +b0000000000000001 9 +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001 : +1> +b000001 ? +b0000000001 @ +1A +b11111111111111111111111111111111 B +b11111111111111111111111111111111 C +b11111111111111111111111111111111 D +b11111111111111111111111111111111 E +b1111111111111111 F +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 G +1K +b111111 L +b1111111111 M +1w +1{ +b00000001 ~ +b0001 "! +b000001 $! +b00000000000000000000000000000001 %! +b00000000000000000000000000000010 &! +b00000000000000000000000001111100 '! +b00000000000000000000000001111101 (! +b0000000000000001 )! +b0000000000000001 *! +b0000000000000001 +! +b0000000000000001 ,! +b0000000000000001 -! +0/! +00! +01! +02! +06! +b00000000000000000000000000000011 ?! +1B! +0E! +0F! +1I! +1J! +0K! +1L! +0O! +b00000000000000000000000000000101 P! +b00000000000000000000000000000100 Q! +b00000000000000000000000000000011 R! +b00000000000000000000000000000010 S! +b0000000000000010 T! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010 U! +0Y! +b000010 Z! +b0000000010 [! +0\! +b00000000000000000000000000000000 ]! +b00000000000000000000000000000000 ^! +b00000000000000000000000000000000 _! +b00000000000000000000000000000000 `! +b0000000000000000 a! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 b! +0f! +b000000 g! +b0000000000 h! +1i! +b11111111111111111111111111111111 j! +b11111111111111111111111111111111 k! +b11111111111111111111111111111111 l! +b11111111111111111111111111111111 m! +b1111111111111111 n! +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 o! +1s! +b111111 t! +b1111111111 u! +13" +04" +17" +08" +19" +b00000010 ;" +b0010 =" +b000010 ?" +b00000000000000000000000000000010 @" +b00000000000000000000000000000011 A" +b00000000000000000000000001111101 B" +b00000000000000000000000001111110 C" +b0000000000000010 D" +b0000000000000010 E" +b0000000000000010 F" +b0000000000000010 G" +b0000000000000010 H" +1K" +1L" +0O" +0P" +1Q" +0R" +b00000000000000000000000000000100 Z" +1[" +0_" +1`" +1a" +0b" +1f" +1j" +b00000000000000000000000000000110 k" +b00000000000000000000000000000101 l" +b00000000000000000000000000000100 m" +b00000000000000000000000000000011 n" +b0000000000000011 o" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011 p" +1t" +b000011 u" +b0000000011 v" +1w" +b11111111111111111111111111111111 x" +b11111111111111111111111111111111 y" +b11111111111111111111111111111111 z" +b11111111111111111111111111111111 {" +b1111111111111111 |" +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }" +1## +b111111 $# +b1111111111 %# +1O# +1S# +b00000011 V# +b0011 X# +b000011 Z# +b00000000000000000000000000000011 [# +b00000000000000000000000000000100 \# +b00000000000000000000000001111110 ]# +b00000000000000000000000001111111 ^# +b0000000000000011 _# +b0000000000000011 `# +b0000000000000011 a# +b0000000000000011 b# +b0000000000000011 c# +1e# +0f# +0g# +1h# +0l# +b00000000000000000000000000000101 u# +0|# +0"$ +1&$ +0'$ +b00000000000000000000000000000111 ($ +b00000000000000000000000000000110 )$ +b00000000000000000000000000000101 *$ +b00000000000000000000000000000100 +$ +b0000000000000100 ,$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100 -$ +01$ +b000100 2$ +b0000000100 3$ +04$ +b00000000000000000000000000000000 5$ +b00000000000000000000000000000000 6$ +b00000000000000000000000000000000 7$ +b00000000000000000000000000000000 8$ +b0000000000000000 9$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 :$ +0>$ +b000000 ?$ +b0000000000 @$ +0A$ +b00000000000000000000000000000000 B$ +b00000000000000000000000000000000 C$ +b00000000000000000000000000000000 D$ +b00000000000000000000000000000000 E$ +b0000000000000000 F$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 G$ +0K$ +b000000 L$ +b0000000000 M$ +1N$ +b11111111111111111111111111111111 O$ +b11111111111111111111111111111111 P$ +b11111111111111111111111111111111 Q$ +b11111111111111111111111111111111 R$ +b1111111111111111 S$ +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 T$ +1X$ +b111111 Y$ +b1111111111 Z$ +1h$ +0i$ +0j$ +1l$ +0m$ +0n$ +0o$ +1p$ +b00000100 q$ +b0100 s$ +b000100 u$ +b00000000000000000000000000000100 v$ +b00000000000000000000000000000101 w$ +b00000000000000000000000001111111 x$ +b00000000000000000000000010000000 y$ +b0000000000000100 z$ +b0000000000000100 {$ +b0000000000000100 |$ +b0000000000000100 }$ +b0000000000000100 ~$ +1$% +1(% +0,% +b00000011 2% +b00000100 3% +b00000101 4% +b00000110 5% +b00000110000001010000010000000011 6% +b00000111 7% +b00000111000001100000010100000100 8% +19% +#25 +09% +#30 +b00000000000000000000000000000011 # +b0111 $ +1% +0* +0+ +1. +1/ +00 +11 +04 +b00000000000000000000000000000101 5 +b00000000000000000000000000000100 6 +b00000000000000000000000000000011 7 +b00000000000000000000000000000010 8 +b0000000000000010 9 +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010 : +0> +b000010 ? +b0000000010 @ +0A +b00000000000000000000000000000000 B +b00000000000000000000000000000000 C +b00000000000000000000000000000000 D +b00000000000000000000000000000000 E +b0000000000000000 F +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 G +0K +b000000 L +b0000000000 M +1N +b11111111111111111111111111111111 O +b11111111111111111111111111111111 P +b11111111111111111111111111111111 Q +b11111111111111111111111111111111 R +b1111111111111111 S +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 T +1X +b111111 Y +b1111111111 Z +1v +0w +1z +0{ +1| +b00000010 ~ +b0010 "! +b000010 $! +b00000000000000000000000000000010 %! +b00000000000000000000000000000011 &! +b00000000000000000000000001111101 '! +b00000000000000000000000001111110 (! +b0000000000000010 )! +b0000000000000010 *! +b0000000000000010 +! +b0000000000000010 ,! +b0000000000000010 -! +10! +11! +04! +05! +16! +07! +b00000000000000000000000000000100 ?! +0@! +1A! +0D! +1E! +1F! +0G! +1K! +1O! +b00000000000000000000000000000110 P! +b00000000000000000000000000000101 Q! +b00000000000000000000000000000100 R! +b00000000000000000000000000000011 S! +b0000000000000011 T! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011 U! +1Y! +b000011 Z! +b0000000011 [! +1\! +b11111111111111111111111111111111 ]! +b11111111111111111111111111111111 ^! +b11111111111111111111111111111111 _! +b11111111111111111111111111111111 `! +b1111111111111111 a! +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 b! +1f! +b111111 g! +b1111111111 h! +14" +18" +b00000011 ;" +b0011 =" +b000011 ?" +b00000000000000000000000000000011 @" +b00000000000000000000000000000100 A" +b00000000000000000000000001111110 B" +b00000000000000000000000001111111 C" +b0000000000000011 D" +b0000000000000011 E" +b0000000000000011 F" +b0000000000000011 G" +b0000000000000011 H" +1J" +0K" +0L" +1M" +0Q" +b00000000000000000000000000000101 Z" +1]" +0a" +0e" +1i" +0j" +b00000000000000000000000000000111 k" +b00000000000000000000000000000110 l" +b00000000000000000000000000000101 m" +b00000000000000000000000000000100 n" +b0000000000000100 o" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100 p" +0t" +b000100 u" +b0000000100 v" +0w" +b00000000000000000000000000000000 x" +b00000000000000000000000000000000 y" +b00000000000000000000000000000000 z" +b00000000000000000000000000000000 {" +b0000000000000000 |" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }" +0## +b000000 $# +b0000000000 %# +0&# +b00000000000000000000000000000000 '# +b00000000000000000000000000000000 (# +b00000000000000000000000000000000 )# +b00000000000000000000000000000000 *# +b0000000000000000 +# +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ,# +00# +b000000 1# +b0000000000 2# +13# +b11111111111111111111111111111111 4# +b11111111111111111111111111111111 5# +b11111111111111111111111111111111 6# +b11111111111111111111111111111111 7# +b1111111111111111 8# +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 9# +1=# +b111111 ># +b1111111111 ?# +1M# +0N# +0O# +1Q# +0R# +0S# +0T# +1U# +b00000100 V# +b0100 X# +b000100 Z# +b00000000000000000000000000000100 [# +b00000000000000000000000000000101 \# +b00000000000000000000000001111111 ]# +b00000000000000000000000010000000 ^# +b0000000000000100 _# +b0000000000000100 `# +b0000000000000100 a# +b0000000000000100 b# +b0000000000000100 c# +1g# +1k# +0o# +b00000000000000000000000000000110 u# +1z# +0{# +1|# +1}# +0#$ +1'$ +b00000000000000000000000000001000 ($ +b00000000000000000000000000000111 )$ +b00000000000000000000000000000110 *$ +b00000000000000000000000000000101 +$ +b0000000000000101 ,$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101 -$ +11$ +b000101 2$ +b0000000101 3$ +14$ +b11111111111111111111111111111111 5$ +b11111111111111111111111111111111 6$ +b11111111111111111111111111111111 7$ +b11111111111111111111111111111111 8$ +b1111111111111111 9$ +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 :$ +1>$ +b111111 ?$ +b1111111111 @$ +1j$ +1n$ +b00000101 q$ +b0101 s$ +b000101 u$ +b00000000000000000000000000000101 v$ +b00000000000000000000000000000110 w$ +b00000000000000000000000010000000 x$ +b00000000000000000000000010000001 y$ +b0000000000000101 z$ +b0000000000000101 {$ +b0000000000000101 |$ +b0000000000000101 }$ +b0000000000000101 ~$ +0"% +1#% +0$% +0%% +1)% +b00000100 2% +b00000101 3% +b00000110 4% +b00000111 5% +b00000111000001100000010100000100 6% +b00001000 7% +b00001000000001110000011000000101 8% +19% +#35 +09% +#40 +b00000000000000000000000000000100 # +b0110 $ +0% +0& +0' +0) +1* +1+ +0, +10 +14 +b00000000000000000000000000000110 5 +b00000000000000000000000000000101 6 +b00000000000000000000000000000100 7 +b00000000000000000000000000000011 8 +b0000000000000011 9 +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011 : +1> +b000011 ? +b0000000011 @ +1A +b11111111111111111111111111111111 B +b11111111111111111111111111111111 C +b11111111111111111111111111111111 D +b11111111111111111111111111111111 E +b1111111111111111 F +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 G +1K +b111111 L +b1111111111 M +1w +1{ +b00000011 ~ +b0011 "! +b000011 $! +b00000000000000000000000000000011 %! +b00000000000000000000000000000100 &! +b00000000000000000000000001111110 '! +b00000000000000000000000001111111 (! +b0000000000000011 )! +b0000000000000011 *! +b0000000000000011 +! +b0000000000000011 ,! +b0000000000000011 -! +1/! +00! +01! +12! +06! +b00000000000000000000000000000101 ?! +0F! +0J! +1N! +0O! +b00000000000000000000000000000111 P! +b00000000000000000000000000000110 Q! +b00000000000000000000000000000101 R! +b00000000000000000000000000000100 S! +b0000000000000100 T! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100 U! +0Y! +b000100 Z! +b0000000100 [! +0\! +b00000000000000000000000000000000 ]! +b00000000000000000000000000000000 ^! +b00000000000000000000000000000000 _! +b00000000000000000000000000000000 `! +b0000000000000000 a! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 b! +0f! +b000000 g! +b0000000000 h! +0i! +b00000000000000000000000000000000 j! +b00000000000000000000000000000000 k! +b00000000000000000000000000000000 l! +b00000000000000000000000000000000 m! +b0000000000000000 n! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 o! +0s! +b000000 t! +b0000000000 u! +1v! +b11111111111111111111111111111111 w! +b11111111111111111111111111111111 x! +b11111111111111111111111111111111 y! +b11111111111111111111111111111111 z! +b1111111111111111 {! +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 |! +1"" +b111111 #" +b1111111111 $" +12" +03" +04" +16" +07" +08" +09" +1:" +b00000100 ;" +b0100 =" +b000100 ?" +b00000000000000000000000000000100 @" +b00000000000000000000000000000101 A" +b00000000000000000000000001111111 B" +b00000000000000000000000010000000 C" +b0000000000000100 D" +b0000000000000100 E" +b0000000000000100 F" +b0000000000000100 G" +b0000000000000100 H" +1L" +1P" +0T" +b00000000000000000000000000000110 Z" +1_" +0`" +1a" +1b" +0f" +1j" +b00000000000000000000000000001000 k" +b00000000000000000000000000000111 l" +b00000000000000000000000000000110 m" +b00000000000000000000000000000101 n" +b0000000000000101 o" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101 p" +1t" +b000101 u" +b0000000101 v" +1w" +b11111111111111111111111111111111 x" +b11111111111111111111111111111111 y" +b11111111111111111111111111111111 z" +b11111111111111111111111111111111 {" +b1111111111111111 |" +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }" +1## +b111111 $# +b1111111111 %# +1O# +1S# +b00000101 V# +b0101 X# +b000101 Z# +b00000000000000000000000000000101 [# +b00000000000000000000000000000110 \# +b00000000000000000000000010000000 ]# +b00000000000000000000000010000001 ^# +b0000000000000101 _# +b0000000000000101 `# +b0000000000000101 a# +b0000000000000101 b# +b0000000000000101 c# +0e# +1f# +0g# +0h# +1l# +b00000000000000000000000000000111 u# +1{# +0|# +0!$ +1"$ +1#$ +0$$ +0'$ +b00000000000000000000000000001001 ($ +b00000000000000000000000000001000 )$ +b00000000000000000000000000000111 *$ +b00000000000000000000000000000110 +$ +b0000000000000110 ,$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110 -$ +01$ +b000110 2$ +b0000000110 3$ +04$ +b00000000000000000000000000000000 5$ +b00000000000000000000000000000000 6$ +b00000000000000000000000000000000 7$ +b00000000000000000000000000000000 8$ +b0000000000000000 9$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 :$ +0>$ +b000000 ?$ +b0000000000 @$ +1A$ +b11111111111111111111111111111111 B$ +b11111111111111111111111111111111 C$ +b11111111111111111111111111111111 D$ +b11111111111111111111111111111111 E$ +b1111111111111111 F$ +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 G$ +1K$ +b111111 L$ +b1111111111 M$ +1i$ +0j$ +1m$ +0n$ +1o$ +b00000110 q$ +b0110 s$ +b000110 u$ +b00000000000000000000000000000110 v$ +b00000000000000000000000000000111 w$ +b00000000000000000000000010000001 x$ +b00000000000000000000000010000010 y$ +b0000000000000110 z$ +b0000000000000110 {$ +b0000000000000110 |$ +b0000000000000110 }$ +b0000000000000110 ~$ +0#% +1$% +1'% +0(% +0)% +1*% +b00000101 2% +b00000110 3% +b00000111 4% +b00001000 5% +b00001000000001110000011000000101 6% +b00001001 7% +b00001001000010000000011100000110 8% +19% +#45 +09% +#50 +b00000000000000000000000000000101 # +1% +0+ +0/ +13 +04 +b00000000000000000000000000000111 5 +b00000000000000000000000000000110 6 +b00000000000000000000000000000101 7 +b00000000000000000000000000000100 8 +b0000000000000100 9 +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100 : +0> +b000100 ? +b0000000100 @ +0A +b00000000000000000000000000000000 B +b00000000000000000000000000000000 C +b00000000000000000000000000000000 D +b00000000000000000000000000000000 E +b0000000000000000 F +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 G +0K +b000000 L +b0000000000 M +0N +b00000000000000000000000000000000 O +b00000000000000000000000000000000 P +b00000000000000000000000000000000 Q +b00000000000000000000000000000000 R +b0000000000000000 S +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 T +0X +b000000 Y +b0000000000 Z +1[ +b11111111111111111111111111111111 \ +b11111111111111111111111111111111 ] +b11111111111111111111111111111111 ^ +b11111111111111111111111111111111 _ +b1111111111111111 ` +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 a +1e +b111111 f +b1111111111 g +1u +0v +0w +1y +0z +0{ +0| +1} +b00000100 ~ +b0100 "! +b000100 $! +b00000000000000000000000000000100 %! +b00000000000000000000000000000101 &! +b00000000000000000000000001111111 '! +b00000000000000000000000010000000 (! +b0000000000000100 )! +b0000000000000100 *! +b0000000000000100 +! +b0000000000000100 ,! +b0000000000000100 -! +11! +15! +09! +b00000000000000000000000000000110 ?! +1@! +1D! +0E! +1F! +1G! +0K! +1O! +b00000000000000000000000000001000 P! +b00000000000000000000000000000111 Q! +b00000000000000000000000000000110 R! +b00000000000000000000000000000101 S! +b0000000000000101 T! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101 U! +1Y! +b000101 Z! +b0000000101 [! +1\! +b11111111111111111111111111111111 ]! +b11111111111111111111111111111111 ^! +b11111111111111111111111111111111 _! +b11111111111111111111111111111111 `! +b1111111111111111 a! +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 b! +1f! +b111111 g! +b1111111111 h! +14" +18" +b00000101 ;" +b0101 =" +b000101 ?" +b00000000000000000000000000000101 @" +b00000000000000000000000000000110 A" +b00000000000000000000000010000000 B" +b00000000000000000000000010000001 C" +b0000000000000101 D" +b0000000000000101 E" +b0000000000000101 F" +b0000000000000101 G" +b0000000000000101 H" +0J" +1K" +0L" +0M" +1Q" +b00000000000000000000000000000111 Z" +1`" +0a" +0d" +1e" +1f" +0g" +0j" +b00000000000000000000000000001001 k" +b00000000000000000000000000001000 l" +b00000000000000000000000000000111 m" +b00000000000000000000000000000110 n" +b0000000000000110 o" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110 p" +0t" +b000110 u" +b0000000110 v" +0w" +b00000000000000000000000000000000 x" +b00000000000000000000000000000000 y" +b00000000000000000000000000000000 z" +b00000000000000000000000000000000 {" +b0000000000000000 |" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }" +0## +b000000 $# +b0000000000 %# +1&# +b11111111111111111111111111111111 '# +b11111111111111111111111111111111 (# +b11111111111111111111111111111111 )# +b11111111111111111111111111111111 *# +b1111111111111111 +# +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 ,# +10# +b111111 1# +b1111111111 2# +1N# +0O# +1R# +0S# +1T# +b00000110 V# +b0110 X# +b000110 Z# +b00000000000000000000000000000110 [# +b00000000000000000000000000000111 \# +b00000000000000000000000010000001 ]# +b00000000000000000000000010000010 ^# +b0000000000000110 _# +b0000000000000110 `# +b0000000000000110 a# +b0000000000000110 b# +b0000000000000110 c# +0f# +1g# +1j# +0k# +0l# +1m# +b00000000000000000000000000001000 u# +1v# +0z# +0{# +1|# +0}# +0#$ +1'$ +b00000000000000000000000000001010 ($ +b00000000000000000000000000001001 )$ +b00000000000000000000000000001000 *$ +b00000000000000000000000000000111 +$ +b0000000000000111 ,$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111 -$ +11$ +b000111 2$ +b0000000111 3$ +14$ +b11111111111111111111111111111111 5$ +b11111111111111111111111111111111 6$ +b11111111111111111111111111111111 7$ +b11111111111111111111111111111111 8$ +b1111111111111111 9$ +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 :$ +1>$ +b111111 ?$ +b1111111111 @$ +1j$ +1n$ +b00000111 q$ +b0111 s$ +b000111 u$ +b00000000000000000000000000000111 v$ +b00000000000000000000000000001000 w$ +b00000000000000000000000010000010 x$ +b00000000000000000000000010000011 y$ +b0000000000000111 z$ +b0000000000000111 {$ +b0000000000000111 |$ +b0000000000000111 }$ +b0000000000000111 ~$ +1"% +1#% +0$% +1%% +1)% +b00000110 2% +b00000111 3% +b00001000 4% +b00001001 5% +b00001001000010000000011100000110 6% +b00001010 7% +b00001010000010010000100000000111 8% +19% +#55 +09% +#60 +b00000000000000000000000000000110 # +b1101 $ +0% +1& +1' +1) +0* +1+ +1, +00 +14 +b00000000000000000000000000001000 5 +b00000000000000000000000000000111 6 +b00000000000000000000000000000110 7 +b00000000000000000000000000000101 8 +b0000000000000101 9 +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101 : +1> +b000101 ? +b0000000101 @ +1A +b11111111111111111111111111111111 B +b11111111111111111111111111111111 C +b11111111111111111111111111111111 D +b11111111111111111111111111111111 E +b1111111111111111 F +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 G +1K +b111111 L +b1111111111 M +1w +1{ +b00000101 ~ +b0101 "! +b000101 $! +b00000000000000000000000000000101 %! +b00000000000000000000000000000110 &! +b00000000000000000000000010000000 '! +b00000000000000000000000010000001 (! +b0000000000000101 )! +b0000000000000101 *! +b0000000000000101 +! +b0000000000000101 ,! +b0000000000000101 -! +0/! +10! +01! +02! +16! +b00000000000000000000000000000111 ?! +0B! +1E! +0F! +0I! +1J! +1K! +0L! +0O! +b00000000000000000000000000001001 P! +b00000000000000000000000000001000 Q! +b00000000000000000000000000000111 R! +b00000000000000000000000000000110 S! +b0000000000000110 T! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110 U! +0Y! +b000110 Z! +b0000000110 [! +0\! +b00000000000000000000000000000000 ]! +b00000000000000000000000000000000 ^! +b00000000000000000000000000000000 _! +b00000000000000000000000000000000 `! +b0000000000000000 a! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 b! +0f! +b000000 g! +b0000000000 h! +1i! +b11111111111111111111111111111111 j! +b11111111111111111111111111111111 k! +b11111111111111111111111111111111 l! +b11111111111111111111111111111111 m! +b1111111111111111 n! +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 o! +1s! +b111111 t! +b1111111111 u! +13" +04" +17" +08" +19" +b00000110 ;" +b0110 =" +b000110 ?" +b00000000000000000000000000000110 @" +b00000000000000000000000000000111 A" +b00000000000000000000000010000001 B" +b00000000000000000000000010000010 C" +b0000000000000110 D" +b0000000000000110 E" +b0000000000000110 F" +b0000000000000110 G" +b0000000000000110 H" +0K" +1L" +1O" +0P" +0Q" +1R" +b00000000000000000000000000001000 Z" +0[" +1\" +0_" +0`" +1a" +0b" +0f" +1j" +b00000000000000000000000000001010 k" +b00000000000000000000000000001001 l" +b00000000000000000000000000001000 m" +b00000000000000000000000000000111 n" +b0000000000000111 o" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111 p" +1t" +b000111 u" +b0000000111 v" +1w" +b11111111111111111111111111111111 x" +b11111111111111111111111111111111 y" +b11111111111111111111111111111111 z" +b11111111111111111111111111111111 {" +b1111111111111111 |" +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }" +1## +b111111 $# +b1111111111 %# +1O# +1S# +b00000111 V# +b0111 X# +b000111 Z# +b00000000000000000000000000000111 [# +b00000000000000000000000000001000 \# +b00000000000000000000000010000010 ]# +b00000000000000000000000010000011 ^# +b0000000000000111 _# +b0000000000000111 `# +b0000000000000111 a# +b0000000000000111 b# +b0000000000000111 c# +1e# +1f# +0g# +1h# +1l# +b00000000000000000000000000001001 u# +1x# +0'$ +b00000000000000000000000000001011 ($ +b00000000000000000000000000001010 )$ +b00000000000000000000000000001001 *$ +b00000000000000000000000000001000 +$ +b0000000000001000 ,$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000 -$ +01$ +b001000 2$ +b0000001000 3$ +04$ +b00000000000000000000000000000000 5$ +b00000000000000000000000000000000 6$ +b00000000000000000000000000000000 7$ +b00000000000000000000000000000000 8$ +b0000000000000000 9$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 :$ +0>$ +b000000 ?$ +b0000000000 @$ +0A$ +b00000000000000000000000000000000 B$ +b00000000000000000000000000000000 C$ +b00000000000000000000000000000000 D$ +b00000000000000000000000000000000 E$ +b0000000000000000 F$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 G$ +0K$ +b000000 L$ +b0000000000 M$ +0N$ +b00000000000000000000000000000000 O$ +b00000000000000000000000000000000 P$ +b00000000000000000000000000000000 Q$ +b00000000000000000000000000000000 R$ +b0000000000000000 S$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 T$ +0X$ +b000000 Y$ +b0000000000 Z$ +1[$ +b11111111111111111111111111111111 \$ +b11111111111111111111111111111111 ]$ +b11111111111111111111111111111111 ^$ +b11111111111111111111111111111111 _$ +b1111111111111111 `$ +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 a$ +1e$ +b111111 f$ +b1111111111 g$ +0h$ +0i$ +0j$ +1k$ +0l$ +0m$ +0n$ +0o$ +0p$ +b00001000 q$ +b1000 s$ +b001000 u$ +b00000000000000000000000000001000 v$ +b00000000000000000000000000001001 w$ +b00000000000000000000000010000011 x$ +b00000000000000000000000010000100 y$ +b0000000000001000 z$ +b0000000000001000 {$ +b0000000000001000 |$ +b0000000000001000 }$ +b0000000000001000 ~$ +b00000111 2% +b00001000 3% +b00001001 4% +b00001010 5% +b00001010000010010000100000000111 6% +b00001011 7% +b00001011000010100000100100001000 8% +19% +#65 +09% +#70 +b00000000000000000000000000000111 # +1% +1* +0+ +0. +1/ +10 +01 +04 +b00000000000000000000000000001001 5 +b00000000000000000000000000001000 6 +b00000000000000000000000000000111 7 +b00000000000000000000000000000110 8 +b0000000000000110 9 +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110 : +0> +b000110 ? +b0000000110 @ +0A +b00000000000000000000000000000000 B +b00000000000000000000000000000000 C +b00000000000000000000000000000000 D +b00000000000000000000000000000000 E +b0000000000000000 F +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 G +0K +b000000 L +b0000000000 M +1N +b11111111111111111111111111111111 O +b11111111111111111111111111111111 P +b11111111111111111111111111111111 Q +b11111111111111111111111111111111 R +b1111111111111111 S +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 T +1X +b111111 Y +b1111111111 Z +1v +0w +1z +0{ +1| +b00000110 ~ +b0110 "! +b000110 $! +b00000000000000000000000000000110 %! +b00000000000000000000000000000111 &! +b00000000000000000000000010000001 '! +b00000000000000000000000010000010 (! +b0000000000000110 )! +b0000000000000110 *! +b0000000000000110 +! +b0000000000000110 ,! +b0000000000000110 -! +00! +11! +14! +05! +06! +17! +b00000000000000000000000000001000 ?! +0@! +0A! +0D! +0E! +1F! +0G! +0K! +1O! +b00000000000000000000000000001010 P! +b00000000000000000000000000001001 Q! +b00000000000000000000000000001000 R! +b00000000000000000000000000000111 S! +b0000000000000111 T! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111 U! +1Y! +b000111 Z! +b0000000111 [! +1\! +b11111111111111111111111111111111 ]! +b11111111111111111111111111111111 ^! +b11111111111111111111111111111111 _! +b11111111111111111111111111111111 `! +b1111111111111111 a! +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 b! +1f! +b111111 g! +b1111111111 h! +14" +18" +b00000111 ;" +b0111 =" +b000111 ?" +b00000000000000000000000000000111 @" +b00000000000000000000000000001000 A" +b00000000000000000000000010000010 B" +b00000000000000000000000010000011 C" +b0000000000000111 D" +b0000000000000111 E" +b0000000000000111 F" +b0000000000000111 G" +b0000000000000111 H" +1J" +1K" +0L" +1M" +1Q" +b00000000000000000000000000001001 Z" +0j" +b00000000000000000000000000001011 k" +b00000000000000000000000000001010 l" +b00000000000000000000000000001001 m" +b00000000000000000000000000001000 n" +b0000000000001000 o" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000 p" +0t" +b001000 u" +b0000001000 v" +0w" +b00000000000000000000000000000000 x" +b00000000000000000000000000000000 y" +b00000000000000000000000000000000 z" +b00000000000000000000000000000000 {" +b0000000000000000 |" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }" +0## +b000000 $# +b0000000000 %# +0&# +b00000000000000000000000000000000 '# +b00000000000000000000000000000000 (# +b00000000000000000000000000000000 )# +b00000000000000000000000000000000 *# +b0000000000000000 +# +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 ,# +00# +b000000 1# +b0000000000 2# +03# +b00000000000000000000000000000000 4# +b00000000000000000000000000000000 5# +b00000000000000000000000000000000 6# +b00000000000000000000000000000000 7# +b0000000000000000 8# +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 9# +0=# +b000000 ># +b0000000000 ?# +1@# +b11111111111111111111111111111111 A# +b11111111111111111111111111111111 B# +b11111111111111111111111111111111 C# +b11111111111111111111111111111111 D# +b1111111111111111 E# +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 F# +1J# +b111111 K# +b1111111111 L# +0M# +0N# +0O# +1P# +0Q# +0R# +0S# +0T# +0U# +b00001000 V# +b1000 X# +b001000 Z# +b00000000000000000000000000001000 [# +b00000000000000000000000000001001 \# +b00000000000000000000000010000011 ]# +b00000000000000000000000010000100 ^# +b0000000000001000 _# +b0000000000001000 `# +b0000000000001000 a# +b0000000000001000 b# +b0000000000001000 c# +b00000000000000000000000000001010 u# +1z# +1{# +0|# +1}# +1#$ +1'$ +b00000000000000000000000000001100 ($ +b00000000000000000000000000001011 )$ +b00000000000000000000000000001010 *$ +b00000000000000000000000000001001 +$ +b0000000000001001 ,$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001 -$ +11$ +b001001 2$ +b0000001001 3$ +14$ +b11111111111111111111111111111111 5$ +b11111111111111111111111111111111 6$ +b11111111111111111111111111111111 7$ +b11111111111111111111111111111111 8$ +b1111111111111111 9$ +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 :$ +1>$ +b111111 ?$ +b1111111111 @$ +1j$ +1n$ +b00001001 q$ +b1001 s$ +b001001 u$ +b00000000000000000000000000001001 v$ +b00000000000000000000000000001010 w$ +b00000000000000000000000010000100 x$ +b00000000000000000000000010000101 y$ +b0000000000001001 z$ +b0000000000001001 {$ +b0000000000001001 |$ +b0000000000001001 }$ +b0000000000001001 ~$ +0"% +0#% +1$% +0%% +0)% +b00001000 2% +b00001001 3% +b00001010 4% +b00001011 5% +b00001011000010100000100100001000 6% +b00001100 7% +b00001100000010110000101000001001 8% +19% +#75 +09% +#80 +b00000000000000000000000000001000 # +b1100 $ +0% +0& +0' +0) +0* +1+ +0, +00 +14 +b00000000000000000000000000001010 5 +b00000000000000000000000000001001 6 +b00000000000000000000000000001000 7 +b00000000000000000000000000000111 8 +b0000000000000111 9 +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000111 : +1> +b000111 ? +b0000000111 @ +1A +b11111111111111111111111111111111 B +b11111111111111111111111111111111 C +b11111111111111111111111111111111 D +b11111111111111111111111111111111 E +b1111111111111111 F +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 G +1K +b111111 L +b1111111111 M +1w +1{ +b00000111 ~ +b0111 "! +b000111 $! +b00000000000000000000000000000111 %! +b00000000000000000000000000001000 &! +b00000000000000000000000010000010 '! +b00000000000000000000000010000011 (! +b0000000000000111 )! +b0000000000000111 *! +b0000000000000111 +! +b0000000000000111 ,! +b0000000000000111 -! +1/! +10! +01! +12! +16! +b00000000000000000000000000001001 ?! +0O! +b00000000000000000000000000001011 P! +b00000000000000000000000000001010 Q! +b00000000000000000000000000001001 R! +b00000000000000000000000000001000 S! +b0000000000001000 T! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000 U! +0Y! +b001000 Z! +b0000001000 [! +0\! +b00000000000000000000000000000000 ]! +b00000000000000000000000000000000 ^! +b00000000000000000000000000000000 _! +b00000000000000000000000000000000 `! +b0000000000000000 a! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 b! +0f! +b000000 g! +b0000000000 h! +0i! +b00000000000000000000000000000000 j! +b00000000000000000000000000000000 k! +b00000000000000000000000000000000 l! +b00000000000000000000000000000000 m! +b0000000000000000 n! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 o! +0s! +b000000 t! +b0000000000 u! +0v! +b00000000000000000000000000000000 w! +b00000000000000000000000000000000 x! +b00000000000000000000000000000000 y! +b00000000000000000000000000000000 z! +b0000000000000000 {! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 |! +0"" +b000000 #" +b0000000000 $" +1%" +b11111111111111111111111111111111 &" +b11111111111111111111111111111111 '" +b11111111111111111111111111111111 (" +b11111111111111111111111111111111 )" +b1111111111111111 *" +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 +" +1/" +b111111 0" +b1111111111 1" +02" +03" +04" +15" +06" +07" +08" +09" +0:" +b00001000 ;" +b1000 =" +b001000 ?" +b00000000000000000000000000001000 @" +b00000000000000000000000000001001 A" +b00000000000000000000000010000011 B" +b00000000000000000000000010000100 C" +b0000000000001000 D" +b0000000000001000 E" +b0000000000001000 F" +b0000000000001000 G" +b0000000000001000 H" +b00000000000000000000000000001010 Z" +1_" +1`" +0a" +1b" +1f" +1j" +b00000000000000000000000000001100 k" +b00000000000000000000000000001011 l" +b00000000000000000000000000001010 m" +b00000000000000000000000000001001 n" +b0000000000001001 o" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001 p" +1t" +b001001 u" +b0000001001 v" +1w" +b11111111111111111111111111111111 x" +b11111111111111111111111111111111 y" +b11111111111111111111111111111111 z" +b11111111111111111111111111111111 {" +b1111111111111111 |" +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }" +1## +b111111 $# +b1111111111 %# +1O# +1S# +b00001001 V# +b1001 X# +b001001 Z# +b00000000000000000000000000001001 [# +b00000000000000000000000000001010 \# +b00000000000000000000000010000100 ]# +b00000000000000000000000010000101 ^# +b0000000000001001 _# +b0000000000001001 `# +b0000000000001001 a# +b0000000000001001 b# +b0000000000001001 c# +0e# +0f# +1g# +0h# +0l# +b00000000000000000000000000001011 u# +0{# +1|# +1!$ +0"$ +0#$ +1$$ +0'$ +b00000000000000000000000000001101 ($ +b00000000000000000000000000001100 )$ +b00000000000000000000000000001011 *$ +b00000000000000000000000000001010 +$ +b0000000000001010 ,$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001010 -$ +01$ +b001010 2$ +b0000001010 3$ +04$ +b00000000000000000000000000000000 5$ +b00000000000000000000000000000000 6$ +b00000000000000000000000000000000 7$ +b00000000000000000000000000000000 8$ +b0000000000000000 9$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 :$ +0>$ +b000000 ?$ +b0000000000 @$ +1A$ +b11111111111111111111111111111111 B$ +b11111111111111111111111111111111 C$ +b11111111111111111111111111111111 D$ +b11111111111111111111111111111111 E$ +b1111111111111111 F$ +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 G$ +1K$ +b111111 L$ +b1111111111 M$ +1i$ +0j$ +1m$ +0n$ +1o$ +b00001010 q$ +b1010 s$ +b001010 u$ +b00000000000000000000000000001010 v$ +b00000000000000000000000000001011 w$ +b00000000000000000000000010000101 x$ +b00000000000000000000000010000110 y$ +b0000000000001010 z$ +b0000000000001010 {$ +b0000000000001010 |$ +b0000000000001010 }$ +b0000000000001010 ~$ +1#% +0$% +0'% +1(% +1)% +0*% +b00001001 2% +b00001010 3% +b00001011 4% +b00001100 5% +b00001100000010110000101000001001 6% +b00001101 7% +b00001101000011000000101100001010 8% +19% +#85 +09% +#90 +b00000000000000000000000000001001 # +1% +04 +b00000000000000000000000000001011 5 +b00000000000000000000000000001010 6 +b00000000000000000000000000001001 7 +b00000000000000000000000000001000 8 +b0000000000001000 9 +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000 : +0> +b001000 ? +b0000001000 @ +0A +b00000000000000000000000000000000 B +b00000000000000000000000000000000 C +b00000000000000000000000000000000 D +b00000000000000000000000000000000 E +b0000000000000000 F +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 G +0K +b000000 L +b0000000000 M +0N +b00000000000000000000000000000000 O +b00000000000000000000000000000000 P +b00000000000000000000000000000000 Q +b00000000000000000000000000000000 R +b0000000000000000 S +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 T +0X +b000000 Y +b0000000000 Z +0[ +b00000000000000000000000000000000 \ +b00000000000000000000000000000000 ] +b00000000000000000000000000000000 ^ +b00000000000000000000000000000000 _ +b0000000000000000 ` +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 a +0e +b000000 f +b0000000000 g +1h +b11111111111111111111111111111111 i +b11111111111111111111111111111111 j +b11111111111111111111111111111111 k +b11111111111111111111111111111111 l +b1111111111111111 m +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 n +1r +b111111 s +b1111111111 t +0u +0v +0w +1x +0y +0z +0{ +0| +0} +b00001000 ~ +b1000 "! +b001000 $! +b00000000000000000000000000001000 %! +b00000000000000000000000000001001 &! +b00000000000000000000000010000011 '! +b00000000000000000000000010000100 (! +b0000000000001000 )! +b0000000000001000 *! +b0000000000001000 +! +b0000000000001000 ,! +b0000000000001000 -! +b00000000000000000000000000001010 ?! +1@! +1D! +1E! +0F! +1G! +1K! +1O! +b00000000000000000000000000001100 P! +b00000000000000000000000000001011 Q! +b00000000000000000000000000001010 R! +b00000000000000000000000000001001 S! +b0000000000001001 T! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001 U! +1Y! +b001001 Z! +b0000001001 [! +1\! +b11111111111111111111111111111111 ]! +b11111111111111111111111111111111 ^! +b11111111111111111111111111111111 _! +b11111111111111111111111111111111 `! +b1111111111111111 a! +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 b! +1f! +b111111 g! +b1111111111 h! +14" +18" +b00001001 ;" +b1001 =" +b001001 ?" +b00000000000000000000000000001001 @" +b00000000000000000000000000001010 A" +b00000000000000000000000010000100 B" +b00000000000000000000000010000101 C" +b0000000000001001 D" +b0000000000001001 E" +b0000000000001001 F" +b0000000000001001 G" +b0000000000001001 H" +0J" +0K" +1L" +0M" +0Q" +b00000000000000000000000000001011 Z" +0`" +1a" +1d" +0e" +0f" +1g" +0j" +b00000000000000000000000000001101 k" +b00000000000000000000000000001100 l" +b00000000000000000000000000001011 m" +b00000000000000000000000000001010 n" +b0000000000001010 o" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001010 p" +0t" +b001010 u" +b0000001010 v" +0w" +b00000000000000000000000000000000 x" +b00000000000000000000000000000000 y" +b00000000000000000000000000000000 z" +b00000000000000000000000000000000 {" +b0000000000000000 |" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 }" +0## +b000000 $# +b0000000000 %# +1&# +b11111111111111111111111111111111 '# +b11111111111111111111111111111111 (# +b11111111111111111111111111111111 )# +b11111111111111111111111111111111 *# +b1111111111111111 +# +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 ,# +10# +b111111 1# +b1111111111 2# +1N# +0O# +1R# +0S# +1T# +b00001010 V# +b1010 X# +b001010 Z# +b00000000000000000000000000001010 [# +b00000000000000000000000000001011 \# +b00000000000000000000000010000101 ]# +b00000000000000000000000010000110 ^# +b0000000000001010 _# +b0000000000001010 `# +b0000000000001010 a# +b0000000000001010 b# +b0000000000001010 c# +1f# +0g# +0j# +1k# +1l# +0m# +b00000000000000000000000000001100 u# +0z# +1{# +0|# +0}# +1#$ +1'$ +b00000000000000000000000000001110 ($ +b00000000000000000000000000001101 )$ +b00000000000000000000000000001100 *$ +b00000000000000000000000000001011 +$ +b0000000000001011 ,$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001011 -$ +11$ +b001011 2$ +b0000001011 3$ +14$ +b11111111111111111111111111111111 5$ +b11111111111111111111111111111111 6$ +b11111111111111111111111111111111 7$ +b11111111111111111111111111111111 8$ +b1111111111111111 9$ +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 :$ +1>$ +b111111 ?$ +b1111111111 @$ +1j$ +1n$ +b00001011 q$ +b1011 s$ +b001011 u$ +b00000000000000000000000000001011 v$ +b00000000000000000000000000001100 w$ +b00000000000000000000000010000110 x$ +b00000000000000000000000010000111 y$ +b0000000000001011 z$ +b0000000000001011 {$ +b0000000000001011 |$ +b0000000000001011 }$ +b0000000000001011 ~$ +1"% +0#% +1$% +1%% +0)% +b00001010 2% +b00001011 3% +b00001100 4% +b00001101 5% +b00001101000011000000101100001010 6% +b00001110 7% +b00001110000011010000110000001011 8% +19% +#95 +09% +#100 +b00000000000000000000000000001010 # +b1111 $ +0% +1& +1' +1) +1* +0+ +1, +10 +14 +b00000000000000000000000000001100 5 +b00000000000000000000000000001011 6 +b00000000000000000000000000001010 7 +b00000000000000000000000000001001 8 +b0000000000001001 9 +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001001 : +1> +b001001 ? +b0000001001 @ +1A +b11111111111111111111111111111111 B +b11111111111111111111111111111111 C +b11111111111111111111111111111111 D +b11111111111111111111111111111111 E +b1111111111111111 F +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 G +1K +b111111 L +b1111111111 M +1w +1{ +b00001001 ~ +b1001 "! +b001001 $! +b00000000000000000000000000001001 %! +b00000000000000000000000000001010 &! +b00000000000000000000000010000100 '! +b00000000000000000000000010000101 (! +b0000000000001001 )! +b0000000000001001 *! +b0000000000001001 +! +b0000000000001001 ,! +b0000000000001001 -! +0/! +00! +11! +02! +06! +b00000000000000000000000000001011 ?! +1B! +0E! +1F! +1I! +0J! +0K! +1L! +0O! +b00000000000000000000000000001101 P! +b00000000000000000000000000001100 Q! +b00000000000000000000000000001011 R! +b00000000000000000000000000001010 S! +b0000000000001010 T! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001010 U! +0Y! +b001010 Z! +b0000001010 [! +0\! +b00000000000000000000000000000000 ]! +b00000000000000000000000000000000 ^! +b00000000000000000000000000000000 _! +b00000000000000000000000000000000 `! +b0000000000000000 a! +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 b! +0f! +b000000 g! +b0000000000 h! +1i! +b11111111111111111111111111111111 j! +b11111111111111111111111111111111 k! +b11111111111111111111111111111111 l! +b11111111111111111111111111111111 m! +b1111111111111111 n! +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 o! +1s! +b111111 t! +b1111111111 u! +13" +04" +17" +08" +19" +b00001010 ;" +b1010 =" +b001010 ?" +b00000000000000000000000000001010 @" +b00000000000000000000000000001011 A" +b00000000000000000000000010000101 B" +b00000000000000000000000010000110 C" +b0000000000001010 D" +b0000000000001010 E" +b0000000000001010 F" +b0000000000001010 G" +b0000000000001010 H" +1K" +0L" +0O" +1P" +1Q" +0R" +b00000000000000000000000000001100 Z" +1[" +0_" +1`" +0a" +0b" +1f" +1j" +b00000000000000000000000000001110 k" +b00000000000000000000000000001101 l" +b00000000000000000000000000001100 m" +b00000000000000000000000000001011 n" +b0000000000001011 o" +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001011 p" +1t" +b001011 u" +b0000001011 v" +1w" +b11111111111111111111111111111111 x" +b11111111111111111111111111111111 y" +b11111111111111111111111111111111 z" +b11111111111111111111111111111111 {" +b1111111111111111 |" +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 }" +1## +b111111 $# +b1111111111 %# +1O# +1S# +b00001011 V# +b1011 X# +b001011 Z# +b00000000000000000000000000001011 [# +b00000000000000000000000000001100 \# +b00000000000000000000000010000110 ]# +b00000000000000000000000010000111 ^# +b0000000000001011 _# +b0000000000001011 `# +b0000000000001011 a# +b0000000000001011 b# +b0000000000001011 c# +1e# +0f# +1g# +1h# +0l# +b00000000000000000000000000001101 u# +1|# +1"$ +0&$ +0'$ +b00000000000000000000000000001111 ($ +b00000000000000000000000000001110 )$ +b00000000000000000000000000001101 *$ +b00000000000000000000000000001100 +$ +b0000000000001100 ,$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001100 -$ +01$ +b001100 2$ +b0000001100 3$ +04$ +b00000000000000000000000000000000 5$ +b00000000000000000000000000000000 6$ +b00000000000000000000000000000000 7$ +b00000000000000000000000000000000 8$ +b0000000000000000 9$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 :$ +0>$ +b000000 ?$ +b0000000000 @$ +0A$ +b00000000000000000000000000000000 B$ +b00000000000000000000000000000000 C$ +b00000000000000000000000000000000 D$ +b00000000000000000000000000000000 E$ +b0000000000000000 F$ +b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 G$ +0K$ +b000000 L$ +b0000000000 M$ +1N$ +b11111111111111111111111111111111 O$ +b11111111111111111111111111111111 P$ +b11111111111111111111111111111111 Q$ +b11111111111111111111111111111111 R$ +b1111111111111111 S$ +b11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 T$ +1X$ +b111111 Y$ +b1111111111 Z$ +1h$ +0i$ +0j$ +1l$ +0m$ +0n$ +0o$ +1p$ +b00001100 q$ +b1100 s$ +b001100 u$ +b00000000000000000000000000001100 v$ +b00000000000000000000000000001101 w$ +b00000000000000000000000010000111 x$ +b00000000000000000000000010001000 y$ +b0000000000001100 z$ +b0000000000001100 {$ +b0000000000001100 |$ +b0000000000001100 }$ +b0000000000001100 ~$ +0$% +0(% +1,% +b00001011 2% +b00001100 3% +b00001101 4% +b00001110 5% +b00001110000011010000110000001011 6% +b00001111 7% +b00001111000011100000110100001100 8% +19% diff --git a/test_regress/t/t_trace_type_dupes_structs.py b/test_regress/t/t_trace_type_dupes_structs.py new file mode 100755 index 000000000..bb8b460f3 --- /dev/null +++ b/test_regress/t/t_trace_type_dupes_structs.py @@ -0,0 +1,24 @@ +#!/usr/bin/env python3 +# DESCRIPTION: Verilator: Verilog Test driver/expect definition +# +# Copyright 2024 by Wilson Snyder. This program is free software; you +# can redistribute it and/or modify it under the terms of either the GNU +# Lesser General Public License Version 3 or the Perl Artistic License +# Version 2.0. +# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0 + +import vltest_bootstrap + +test.scenarios("simulator_st") +test.top_filename = "t/t_trace_type_dupes.v" +test.sim_time = 2000000 # NOCOMMIT -- for benchmarking, leave in? + +test.compile( + # artificially low trace splitting for force cross-split type function usage + verilator_flags2=["--trace", "--trace-structs", "--output-split-ctrace 10"]) + +test.execute() + +test.vcd_identical(test.trace_filename, test.golden_filename) + +test.passes()