Skip to content

Commit 172fd9c

Browse files
Version 1.4.28. sc_bv supported
1 parent f1b040a commit 172fd9c

File tree

12 files changed

+403
-33
lines changed

12 files changed

+403
-33
lines changed

sc_tool/lib/rtti_sysc/SystemCRTTI.cpp

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,21 +91,30 @@ llvm::APSInt getScUIntValue(const void *objPtr)
9191
llvm::APSInt getScBigIntValue(const void *objPtr)
9292
{
9393
auto* obj = (const sc_signed*)(objPtr);
94-
llvm::APSInt val(obj->length(), true);
95-
// FIXME:
96-
val = obj->to_int64();
94+
llvm::APSInt val(obj->length(), false);
95+
// 64bit is OK as no larger integer literls supported in CPP
96+
val = obj->to_int64();
9797
return val;
9898
}
9999

100100
llvm::APSInt getScBigUIntValue(const void *objPtr)
101101
{
102102
auto* obj = (const sc_unsigned*)(objPtr);
103103
llvm::APSInt val(obj->length(), true);
104-
// FIXME:
104+
// 64bit is OK as no larger integer literls supported in CPP
105105
val = obj->to_uint64();
106106
return val;
107107
}
108108

109+
llvm::APSInt getScBitVectorValue(const void *objPtr)
110+
{
111+
auto* obj = (const sc_bv_base*)(objPtr);
112+
llvm::APSInt val(obj->length(), true);
113+
// 64bit is OK as no larger integer literls supported in CPP
114+
val = obj->to_uint64();
115+
return val;
116+
}
117+
109118
process_type_info getProcessTypeInfo(const sc_core::sc_object *procPtr)
110119
{
111120
const sc_process_b *pb = dynamic_cast<const sc_process_b*>(procPtr);

sc_tool/lib/rtti_sysc/SystemCRTTI.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ llvm::APSInt getScIntValue(const void *objPtr);
5757
llvm::APSInt getScUIntValue(const void *objPtr);
5858
llvm::APSInt getScBigIntValue(const void *objPtr);
5959
llvm::APSInt getScBigUIntValue(const void *objPtr);
60+
llvm::APSInt getScBitVectorValue(const void *objPtr);
6061

6162
/// Get list of processes sensitive to given port
6263
std::vector<sc_elab::port_sens_proc>

sc_tool/lib/sc_tool/SCToolFrontendAction.cpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,20 @@ Object* getParentModule(SCDesign& designDB, Object* memberObj)
7474

7575
if (parentObj == nullptr) {
7676
parentObj = modParent;
77+
7778
} else
79+
// TODO: check me
80+
if (memberObj == modParent) {
81+
// If there is a module inside of MIF, it could have two pointers
82+
// and one of them is the same object
83+
ScDiag::reportScDiag(ScDiag::SYNTH_PARENT_SAME_OBJECT);
84+
continue;
85+
//~TODO
86+
} else
7887
if (parentObj != modParent) {
7988
// Pointers to this object located in different modules
89+
parentObj->PrintDebugString();
90+
modParent->PrintDebugString();
8091
memberObj->PrintDebugString();
8192
ScDiag::reportScDiag(ScDiag::SYNTH_MULTI_POINTER_DIFF);
8293
return nullptr;
@@ -112,8 +123,8 @@ Object* getOuterArray(SCDesign& designDB, Object* memberObj)
112123
return arrayObj;
113124
}
114125

115-
const std::string SCElabASTConsumer::TOOL_VERSION = "1.4.27";
116-
const std::string SCElabASTConsumer::TOOL_DATE = "31 May,2022";
126+
const std::string SCElabASTConsumer::TOOL_VERSION = "1.4.28";
127+
const std::string SCElabASTConsumer::TOOL_DATE = "Jun 06,2022";
117128

118129
void SCElabASTConsumer::HandleTranslationUnit(clang::ASTContext &astCtx)
119130
{

sc_tool/lib/sc_tool/diag/ScToolDiagnostic.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ class ScDiag {
206206
SYNTH_RECORD_CTOR_NONEMPTY = 234,
207207
CPP_DEFINED_LOCAL_PARAM = 235,
208208
SYNTH_INCORRECT_FUNC_CALL = 236,
209+
SYNTH_PARENT_SAME_OBJECT = 237,
209210

210211
SC_FATAL_ELAB_TYPES_NS = 300,
211212
SC_WARN_ELAB_UNSUPPORTED_TYPE,
@@ -664,6 +665,10 @@ class ScDiag {
664665
idFormatMap[SYNTH_MULTI_POINTER_DIFF] =
665666
{clang::DiagnosticIDs::Fatal,
666667
"Pointers to dynamically allocated object declared in different modules"};
668+
idFormatMap[SYNTH_PARENT_SAME_OBJECT] =
669+
{clang::DiagnosticIDs::Warning,
670+
"One of dynamically allocated object parent is the same object"};
671+
667672
idFormatMap[CPP_DIFF_POINTER_COMP] =
668673
{clang::DiagnosticIDs::Fatal,
669674
"Pointers to different objects comparison"};

sc_tool/lib/sc_tool/dyn_elab/Reflection.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,9 @@ llvm::APSInt IntegerObject::getAPSInt() const
390390
else if (isScBigUInt(thisType)) {
391391
return getScBigUIntValue(objPtr);
392392
}
393+
else if (isScBitVector(thisType)) {
394+
return getScBitVectorValue(objPtr);
395+
}
393396
}
394397

395398
assert(false);

sc_tool/lib/sc_tool/expr/ScGenerateExpr.cpp

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2396,20 +2396,33 @@ void ScGenerateExpr::parseMemberCall(CXXMemberCallExpr* expr, SValue& tval,
23962396
// No type cast required for @to_bool as it applied for @bit_ref only
23972397
codeWriter->copyTerm(thisExpr, expr);
23982398

2399+
} else
2400+
if (fname.find("length") != string::npos) {
2401+
// Get length form template parameter for @sc_bv/sc_(big)(u)int
2402+
// not work for channel of these types
2403+
if (auto length = getTemplateArgAsInt(tval.getType(), 0)) {
2404+
codeWriter->putLiteral(expr, SValue(*length, 10));
2405+
} else {
2406+
SCT_INTERNAL_ERROR(expr->getBeginLoc(),
2407+
"Cannot get type width for length()");
2408+
}
2409+
} else
2410+
if (fname.find("is_01") != string::npos) {
2411+
// For @sc_bv type, always return true
2412+
codeWriter->putLiteral(expr, SValue(SValue::boolToAPSInt(1), 10));
2413+
23992414
} else
24002415
if (fname.find("operator") != string::npos) {
24012416
// ->operator=, ++, --, +=, -=, ... not supported for now
24022417
// as it is not widely used form, it difficult to implement for arrays
2403-
ScDiag::reportScDiag(expr->getSourceRange().getBegin(),
2418+
ScDiag::reportScDiag(expr->getBeginLoc(),
24042419
ScDiag::SYNTH_UNSUPPORTED_OPER) << fname
24052420
<< "ScGenerateExpr::parseMemberCall";
2406-
24072421
} else {
2408-
ScDiag::reportScDiag(expr->getSourceRange().getBegin(),
2422+
ScDiag::reportScDiag(expr->getBeginLoc(),
24092423
ScDiag::SYNTH_UNSUPPORTED_OPER) << fname
24102424
<< "ScGenerateExpr::parseMemberCall";
24112425
}
2412-
24132426
} else
24142427
if (isScChannel(thisType)) {
24152428
// Channel object
@@ -2567,7 +2580,8 @@ void ScGenerateExpr::parseOperatorCall(CXXOperatorCallExpr* expr, SValue& val)
25672580

25682581
// Check LHS is temporary expression materialized into in memory value
25692582
// Required for @sc_biguint/@sc_bigint
2570-
bool lhsIsTempExpr = isa<MaterializeTemporaryExpr>(lexpr);
2583+
bool lhsIsTempExpr = isa<MaterializeTemporaryExpr>(lexpr) &&
2584+
(isScBigInt(thisType) || isScBigUInt(thisType));
25712585

25722586
if (isAssignOperator) {
25732587
// Assignment "operator=" for all types including SC data types

sc_tool/lib/sc_tool/expr/ScParseExprValue.cpp

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2199,18 +2199,9 @@ void ScParseExprValue::parseMemberCall(CXXMemberCallExpr* callExpr, SValue& tval
21992199
if (auto convDecl = dyn_cast<CXXConversionDecl>(methodDecl)) {
22002200
// Type conversion
22012201
QualType convType = convDecl->getConversionType().getCanonicalType();
2202-
2203-
if (auto builtinType = dyn_cast<BuiltinType>(convType)) {
2204-
auto tKind = builtinType->getKind();
2205-
2206-
if (tKind == BuiltinType::Kind::ULongLong ||
2207-
tKind == BuiltinType::Kind::LongLong ) {
2208-
// Return this value, no get value from state here
2209-
val = ttval;
2210-
2211-
} else {
2212-
SCT_INTERNAL_ERROR (callExpr->getBeginLoc(), "Unknown cast");
2213-
}
2202+
if ( isa<BuiltinType>(convType) ) {
2203+
// Return this value, no get value from state here
2204+
val = ttval;
22142205
}
22152206
} else
22162207
if (fname == "bit" || fname == "operator[]") {
@@ -2305,6 +2296,21 @@ void ScParseExprValue::parseMemberCall(CXXMemberCallExpr* callExpr, SValue& tval
23052296
val = SValue(SValue::boolToAPSInt(val.getBoolValue()), 10);
23062297
}
23072298

2299+
} else
2300+
if (fname.find("length") != string::npos) {
2301+
// Get length form template parameter for @sc_bv/sc_(big)(u)int
2302+
// not work for channel of these types
2303+
if (auto length = getTemplateArgAsInt(tval.getType(), 0)) {
2304+
val = SValue(*length, 10);
2305+
} else {
2306+
SCT_INTERNAL_ERROR(callExpr->getBeginLoc(),
2307+
"Cannot get type width for length()");
2308+
}
2309+
} else
2310+
if (fname.find("is_01") != string::npos) {
2311+
// For @sc_bv type, always return true
2312+
val = SValue(SValue::boolToAPSInt(1), 10);
2313+
23082314
} else
23092315
if (fname.find("operator") != string::npos) {
23102316
// ->operator=, ++, --, +=, -=, ... not supported for now

sc_tool/lib/sc_tool/utils/ScTypeTraits.cpp

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,7 @@ class DeclDB {
103103
clang::QualType scUIntBaseType;
104104
clang::QualType scUnsignedType;
105105
clang::QualType scSignedType;
106+
clang::QualType scBitVector;
106107

107108
clang::QualType scModuleType;
108109
clang::QualType scPortBaseType;
@@ -173,6 +174,10 @@ DeclDB::DeclDB(const clang::ASTContext &ctx)
173174
SCT_TOOL_ASSERT(matches.size() == 1, "Error declaration match");
174175
scUnsignedType = matches[0].getNodeAs<CXXRecordDecl>("sc_unsigned")->getTypeForDecl()->getCanonicalTypeInternal();
175176

177+
matches = match(cxxRecordDecl(hasName("sc_dt::sc_bv_base"), isDefinition()).bind("sc_bv_base"), astCtx);
178+
SCT_TOOL_ASSERT(matches.size() == 1, "Error declaration match");
179+
scBitVector = matches[0].getNodeAs<CXXRecordDecl>("sc_bv_base")->getTypeForDecl()->getCanonicalTypeInternal();
180+
176181
matches = match(cxxRecordDecl(hasName("sc_core::sc_module"), isDefinition()).bind("sc_module"), astCtx);
177182
SCT_TOOL_ASSERT(matches.size() == 1, "Error declaration match");
178183
scModuleType = matches[0].getNodeAs<CXXRecordDecl>("sc_module")->getTypeForDecl()->getCanonicalTypeInternal();
@@ -317,12 +322,18 @@ bool isScBigUInt(clang::QualType type)
317322
return isDerivedFrom(type, db->scUnsignedType);
318323
}
319324

325+
bool isScBitVector(clang::QualType type)
326+
{
327+
type = getPureType(type);
328+
return isDerivedFrom(type, db->scBitVector);
329+
}
330+
320331
bool isAnyScInteger(clang::QualType type)
321332
{
322333
if (type.isNull()) return false;
323334

324335
return isScInt(type) || isScUInt(type) ||
325-
isScBigInt(type) || isScBigUInt(type);
336+
isScBigInt(type) || isScBigUInt(type) || isScBitVector(type);
326337
}
327338

328339
bool isAnyScIntegerRef(QualType type, bool checkPointer)
@@ -342,6 +353,7 @@ bool isAnyScIntegerRef(QualType type, bool checkPointer)
342353
std::string typeStr = type.getAsString();
343354
return (typeStr.find("sc_uint_base") != std::string::npos ||
344355
typeStr.find("sc_int_base") != std::string::npos ||
356+
typeStr.find("sc_bv_base") != std::string::npos ||
345357
typeStr.find("sc_uint_bitref") != std::string::npos ||
346358
typeStr.find("sc_int_bitref") != std::string::npos ||
347359
typeStr.find("sc_uint_subref") != std::string::npos ||
@@ -364,8 +376,7 @@ bool isScNotSupported(QualType type, bool checkPointer)
364376
type = getPureType(type);
365377

366378
std::string typeStr = type.getAsString();
367-
return (typeStr.find("sc_bv") != std::string::npos ||
368-
typeStr.find("sc_lv") != std::string::npos ||
379+
return (typeStr.find("sc_lv") != std::string::npos ||
369380
typeStr.find("sc_bit") != std::string::npos ||
370381
typeStr.find("sc_logic") != std::string::npos ||
371382
typeStr.find("sc_fix") != std::string::npos ||
@@ -497,7 +508,7 @@ llvm::Optional<std::pair<size_t, bool>> getIntTraits(clang::QualType type,
497508
return std::pair<size_t, bool>(width, isUnsigned);
498509

499510
} else
500-
if (auto width = getScUintBiguint(type)) {
511+
if (auto width = getScUintBiguintBitVec(type)) {
501512
return std::pair<size_t, bool>(width.getValue(), true);
502513

503514
} else
@@ -543,13 +554,12 @@ llvm::Optional<size_t> getAnyTypeWidth(clang::QualType type, bool checkPointer,
543554
return llvm::None;
544555
}
545556

546-
// Is @sc_uint or @sc_biguint types
547-
Optional<size_t> getScUintBiguint(QualType type)
557+
Optional<size_t> getScUintBiguintBitVec(QualType type)
548558
{
549559
if (type.isNull()) return llvm::None;
550560
type = getPureType(type);
551561

552-
if (isScUInt(type) || isScBigUInt(type)) {
562+
if (isScUInt(type) || isScBigUInt(type) || isScBitVector(type)) {
553563
auto rdecl = type->getAsCXXRecordDecl();
554564
SCT_TOOL_ASSERT (rdecl, "SC integer is not record");
555565

@@ -563,7 +573,6 @@ Optional<size_t> getScUintBiguint(QualType type)
563573
return Optional<size_t>();
564574
}
565575

566-
// Is @sc_int or @sc_bigint types
567576
Optional<size_t> getScIntBigint(QualType type)
568577
{
569578
if (type.isNull()) return llvm::None;

sc_tool/lib/sc_tool/utils/ScTypeTraits.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@ bool isScInt(clang::QualType type);
5252
bool isScUInt(clang::QualType type);
5353
bool isScBigInt(clang::QualType type);
5454
bool isScBigUInt(clang::QualType type);
55+
// Check for @sc_bv
56+
bool isScBitVector(clang::QualType type);
5557

5658
// Is any of SystemC integer type
5759
bool isAnyScInteger(clang::QualType type);
@@ -70,8 +72,8 @@ bool isAnyInteger(clang::QualType type);
7072
/// \param checkPointer -- check if it is pointer to array
7173
bool isScIntegerArray(clang::QualType type, bool checkPointer = true);
7274

73-
/// Check @sc_uint or @sc_biguint type and optionally return bit number
74-
llvm::Optional<size_t> getScUintBiguint(clang::QualType type);
75+
/// Check @sc_uint or @sc_biguint or @sc_bv type and optionally return bit number
76+
llvm::Optional<size_t> getScUintBiguintBitVec(clang::QualType type);
7577
/// Check @sc_int or @sc_bigint type and optionally return bit number
7678
llvm::Optional<size_t> getScIntBigint(clang::QualType type);
7779

tests/method/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,9 @@ svc_target(method_sc_types GOLDEN method_sc_types.sv)
182182
add_executable(method_sc_types_fail test_sc_types_fail.cpp)
183183
svc_target(method_sc_types_fail WILL_FAIL)
184184

185+
add_executable(method_sc_bv test_sc_bv.cpp)
186+
svc_target(method_sc_bv GOLDEN method_sc_bv.sv)
187+
185188
add_executable(method_auto_type test_auto_type.cpp)
186189
svc_target(method_auto_type GOLDEN method_auto_type.sv)
187190

0 commit comments

Comments
 (0)