Skip to content

Commit 8754fe6

Browse files
committed
[memory][scs][parser] Don't generate arcs from sc-element classes
1 parent b8bb91f commit 8754fe6

File tree

5 files changed

+159
-105
lines changed

5 files changed

+159
-105
lines changed

sc-memory/sc-memory/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ add_dependencies(sc-memory
5757
)
5858

5959
if(${SC_CLANG_FORMAT_CODE})
60+
target_clangformat_setup(SCsParser)
6061
target_clangformat_setup(sc-memory)
6162
endif()
6263

sc-memory/sc-memory/include/sc-memory/scs/scs_parser.hpp

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class ParsedElement
4444
_SC_EXTERN ScType const & GetType() const;
4545

4646
_SC_EXTERN Visibility GetVisibility() const;
47+
_SC_EXTERN bool IsMetaElement() const;
4748

4849
_SC_EXTERN std::string const & GetValue() const;
4950

@@ -60,18 +61,21 @@ class ParsedElement
6061
bool m_isReversed : 1; // flag used just for an connectors
6162
std::string m_value; // string representation of content/link value
6263
bool m_isURL : 1; // flag used to determine if ScLink value is an URL
64+
bool m_isMetaElement;
6365
};
6466

6567
class ElementHandle
6668
{
6769
public:
6870
_SC_EXTERN explicit ElementHandle(ElementID id);
6971
_SC_EXTERN ElementHandle();
70-
_SC_EXTERN ElementHandle(ElementID id, bool isLocal);
72+
_SC_EXTERN ElementHandle(ElementID id, Visibility visibility, bool isMetaElement = false);
7173
_SC_EXTERN ElementHandle(ElementHandle const & other) = default;
7274

7375
_SC_EXTERN ElementID operator*() const;
76+
_SC_EXTERN Visibility GetVisibility() const;
7477
_SC_EXTERN bool IsLocal() const;
78+
_SC_EXTERN bool IsMetaElement() const;
7579
_SC_EXTERN bool IsValid() const;
7680
_SC_EXTERN bool operator==(ElementHandle const & other) const;
7781
_SC_EXTERN bool operator!=(ElementHandle const & other) const;
@@ -82,7 +86,8 @@ class ElementHandle
8286
static const ElementID INVALID_ID = std::numeric_limits<ElementID>::max();
8387

8488
ElementID m_id;
85-
bool m_isLocal;
89+
Visibility m_visibility;
90+
bool m_isMetaElement;
8691
};
8792

8893
struct ParsedTriple
@@ -115,7 +120,7 @@ class Parser
115120
_SC_EXTERN Parser();
116121

117122
_SC_EXTERN bool Parse(std::string const & str);
118-
_SC_EXTERN ParsedElement const & GetParsedElement(ElementHandle const & elID) const;
123+
_SC_EXTERN ParsedElement const & GetParsedElement(ElementHandle const & handle) const;
119124
_SC_EXTERN TripleVector const & GetParsedTriples() const;
120125
_SC_EXTERN std::string const & GetParseError() const;
121126
_SC_EXTERN AliasHandles const & GetAliases() const;
@@ -124,13 +129,21 @@ class Parser
124129
void ForEachParsedElement(TFunc && fn) const
125130
{
126131
for (auto const & el : m_parsedElementsLocal)
132+
{
133+
if (el.IsMetaElement())
134+
continue;
127135
fn(el);
136+
}
128137
for (auto const & el : m_parsedElements)
138+
{
139+
if (el.IsMetaElement())
140+
continue;
129141
fn(el);
142+
}
130143
}
131144

132145
protected:
133-
ParsedElement & GetParsedElementRef(ElementHandle const & elID);
146+
ParsedElement & GetParsedElementRef(ElementHandle const & handle);
134147

135148
ElementHandle ResolveAlias(std::string const & name);
136149
ElementHandle ProcessIdentifier(std::string const & name);
@@ -144,10 +157,12 @@ class Parser
144157
void ProcessContourBegin();
145158
void ProcessContourEnd(ElementHandle const & contourHandle);
146159

147-
void ProcessTriple(ElementHandle const & source, ElementHandle const & connector, ElementHandle const & target);
160+
void ProcessTriple(ElementHandle const & sourceHandle, ElementHandle const & connectorHandle, ElementHandle const & targetHandle);
148161
void ProcessAssign(std::string const & alias, ElementHandle const & value);
149162

150163
private:
164+
ParsedElementVector & GetContainerByElementVisibilityRef(Visibility visibility);
165+
ParsedElementVector const & GetContainerByElementVisibility(Visibility visibility) const;
151166
ElementHandle AppendElement(
152167
std::string idtf,
153168
ScType const & type = ScType::Unknown,

sc-memory/sc-memory/src/sc_scs_helper.cpp

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -44,34 +44,39 @@ class StructGenerator
4444

4545
// generate triples
4646
auto const & triples = parser.GetParsedTriples();
47+
std::unordered_set<std::string> typeArcsCache;
4748
for (auto const & t : triples)
4849
{
49-
auto const & src = parser.GetParsedElement(t.m_source);
50+
auto const & source = parser.GetParsedElement(t.m_source);
5051
auto const & connector = parser.GetParsedElement(t.m_connector);
51-
auto const & trg = parser.GetParsedElement(t.m_target);
52+
auto const & target = parser.GetParsedElement(t.m_target);
5253

53-
auto const & srcAddrResult = ResolveElement(src);
54-
auto const & trgAddrResult = ResolveElement(trg);
54+
auto const & sourceResult = ResolveElement(source);
55+
auto const & targetResult = ResolveElement(target);
5556

56-
if (!connector.GetType().IsConnector())
57-
SC_THROW_EXCEPTION(utils::ExceptionInvalidType, "Specified sc-connector in triple has incorrect type.");
57+
ScType const & connectorType = connector.GetType();
58+
std::string const & connectorIdtf = connector.GetIdtf();
59+
if (!connectorType.IsConnector())
60+
SC_THROW_EXCEPTION(
61+
utils::ExceptionInvalidType,
62+
"Specified in triple sc-connector `" << connectorIdtf << "` has incorrect type `"
63+
<< std::string(connectorType) << "`.");
5864

59-
ScAddr const arcAddr = m_ctx.GenerateConnector(connector.GetType(), srcAddrResult.first, trgAddrResult.first);
60-
m_idtfCache.insert({connector.GetIdtf(), arcAddr});
65+
ScAddr const arcAddr = m_ctx.GenerateConnector(connectorType, sourceResult.first, targetResult.first);
66+
m_idtfCache.insert({connectorIdtf, arcAddr});
6167

6268
if (m_outputStructure.IsValid())
6369
{
64-
AppendToOutputStructure(srcAddrResult.first, arcAddr, trgAddrResult.first);
65-
AppendToOutputStructure(srcAddrResult.second);
66-
AppendToOutputStructure(trgAddrResult.second);
70+
AppendToOutputStructure(sourceResult.first, arcAddr, sourceResult.first);
71+
AppendToOutputStructure(sourceResult.second);
72+
AppendToOutputStructure(targetResult.second);
6773
}
6874
}
6975

7076
parser.ForEachParsedElement(
7177
[this](scs::ParsedElement const & el)
7278
{
73-
if (m_idtfCache.find(el.GetIdtf()) == m_idtfCache.end() && !el.GetType().IsConnector()
74-
&& !scs::TypeResolver::IsKeynodeType(el.GetIdtf()))
79+
if (m_idtfCache.find(el.GetIdtf()) == m_idtfCache.cend() && !el.GetType().IsConnector())
7580
ResolveElement(el);
7681
});
7782
}
@@ -167,7 +172,9 @@ class StructGenerator
167172
resultAddr = m_ctx.GenerateNode(type);
168173
}
169174
else
170-
SC_THROW_EXCEPTION(utils::ExceptionInvalidState, "Incorrect element type at this state.");
175+
SC_THROW_EXCEPTION(
176+
utils::ExceptionInvalidState,
177+
"Incorrect element type `" << std::string(type) << "` for element `" << el.GetIdtf() << "`.");
171178

172179
// setup system identifier
173180
if (el.GetVisibility() == scs::Visibility::System)
@@ -177,9 +184,7 @@ class StructGenerator
177184
result = {quintuple.addr2, quintuple.addr3, quintuple.addr4, quintuple.addr5};
178185
}
179186
else if (el.GetVisibility() == scs::Visibility::Global)
180-
{
181187
result = SetSCsGlobalIdtf(el.GetIdtf(), resultAddr);
182-
}
183188
}
184189
else
185190
{
@@ -190,12 +195,15 @@ class StructGenerator
190195
if (oldType.CanExtendTo(newType))
191196
m_ctx.SetElementSubtype(resultAddr, newType);
192197
else if (!newType.CanExtendTo(oldType))
193-
SC_THROW_EXCEPTION(utils::ExceptionInvalidType, "Duplicate element type for " + el.GetIdtf());
198+
SC_THROW_EXCEPTION(
199+
utils::ExceptionInvalidType,
200+
"Can't extend type `" << std::string(oldType) << "` to type `" << std::string(newType)
201+
<< "` for element `" << el.GetIdtf() << "`.");
194202
}
195203
}
196204

197205
// anyway save in cache
198-
m_idtfCache.insert(std::make_pair(idtf, resultAddr));
206+
m_idtfCache.insert({idtf, resultAddr});
199207
}
200208

201209
return {resultAddr, result};

0 commit comments

Comments
 (0)