Skip to content

Commit 6f4b99d

Browse files
authored
Merge pull request #8292 from The-OpenROAD-Project-staging/secure-undo-rename
Added undoEco support for rename() methods in dbInst, dbNet, and dbModNet
2 parents 40649df + f1f0123 commit 6f4b99d

File tree

16 files changed

+286
-26
lines changed

16 files changed

+286
-26
lines changed

src/dbSta/test/cpp/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,3 @@ gtest_discover_tests(TestHconn
2222

2323
add_dependencies(build_and_test TestHconn
2424
)
25-

src/dbSta/test/cpp/TestHconn.cpp

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ void DbStrDebugHierarchy(dbBlock* block, std::stringstream& str_db)
8686
bt->getName().c_str(),
8787
bt->getNet() ? bt->getNet()->getName().c_str() : "",
8888
bt->getNet() ? bt->getNet()->getId() : 0,
89-
bt->getModNet() ? bt->getModNet()->getName() : "",
89+
bt->getModNet() ? bt->getModNet()->getName().c_str() : "",
9090
bt->getModNet() ? bt->getModNet()->getId() : 0);
9191
str_db << tmp_str;
9292
}
@@ -117,7 +117,7 @@ void DbStrDebugHierarchy(dbBlock* block, std::stringstream& str_db)
117117
bterm->getName().c_str(),
118118
bterm->getNet() ? bterm->getNet()->getName().c_str() : "",
119119
bterm->getNet() ? bterm->getNet()->getId() : -1,
120-
bterm->getModNet() ? bterm->getModNet()->getName() : "",
120+
bterm->getModNet() ? bterm->getModNet()->getName().c_str() : "",
121121
bterm->getModNet() ? bterm->getModNet()->getId() : -1);
122122
str_db << tmp_str;
123123
}
@@ -132,8 +132,9 @@ void DbStrDebugHierarchy(dbBlock* block, std::stringstream& str_db)
132132
tmp_str,
133133
"\t\tPort %s Net %s (%d)\n",
134134
module_port->getName(),
135-
(module_port->getModNet()) ? (module_port->getModNet()->getName())
136-
: "No-modnet",
135+
(module_port->getModNet())
136+
? (module_port->getModNet()->getName().c_str())
137+
: "No-modnet",
137138
(module_port->getModNet()) ? module_port->getModNet()->getId() : -1);
138139
str_db << tmp_str;
139140
sprintf(tmp_str,
@@ -166,8 +167,9 @@ void DbStrDebugHierarchy(dbBlock* block, std::stringstream& str_db)
166167
"\t\t\tModIterm : %s (%u) Mod Net %s (%u) \n",
167168
miterm_pin->getName(),
168169
miterm_pin->getId(),
169-
miterm_pin->getModNet() ? (miterm_pin->getModNet()->getName())
170-
: "No-net",
170+
miterm_pin->getModNet()
171+
? (miterm_pin->getModNet()->getName().c_str())
172+
: "No-net",
171173
miterm_pin->getModNet() ? miterm_pin->getModNet()->getId() : 0);
172174
str_db << tmp_str;
173175
}
@@ -190,7 +192,8 @@ void DbStrDebugHierarchy(dbBlock* block, std::stringstream& str_db)
190192
mterm->getName().c_str(),
191193
iterm->getId(),
192194
iterm->getNet() ? iterm->getNet()->getName().c_str() : "unk-dbnet",
193-
iterm->getModNet() ? iterm->getModNet()->getName() : "unk-modnet",
195+
iterm->getModNet() ? iterm->getModNet()->getName().c_str()
196+
: "unk-modnet",
194197
iterm->getModNet() ? iterm->getModNet()->getId() : -1);
195198
str_db << tmp_str;
196199
}
@@ -207,8 +210,10 @@ void DbStrDebugHierarchy(dbBlock* block, std::stringstream& str_db)
207210
str_db << tmp_str;
208211
dbSet<dbModNet> mod_nets = cur_obj->getModNets();
209212
for (auto mod_net : mod_nets) {
210-
sprintf(
211-
tmp_str, "\t\tNet: %s (%u)\n", mod_net->getName(), mod_net->getId());
213+
sprintf(tmp_str,
214+
"\t\tNet: %s (%u)\n",
215+
mod_net->getName().c_str(),
216+
mod_net->getId());
212217
str_db << tmp_str;
213218
sprintf(tmp_str,
214219
"\t\tConnections -> modIterms/modbterms/bterms/iterms:\n");

src/odb/include/odb/db.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8292,7 +8292,8 @@ class dbModNet : public dbObject
82928292
dbSet<dbITerm> getITerms();
82938293
dbSet<dbBTerm> getBTerms();
82948294
unsigned connectionCount();
8295-
const char* getName() const;
8295+
std::string getName() const;
8296+
const char* getConstName() const;
82968297
void rename(const char* new_name);
82978298
void disconnectAllTerms();
82988299

src/odb/src/codeGenerator/parser.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,14 @@ def parse_user_code(self):
7171
"""Parse using the user_code_tag
7272
7373
Used for a file where the default is generated code and user
74-
code is taggged."""
74+
code is tagged."""
7575
_get_sections(self.lines, self.user_code_tag, self.user_code)
7676

7777
def parse_source_code(self, file_name):
7878
"""Parse using the file using the generator_code_tag
7979
8080
Used for a file where the default is user code and generated
81-
code is taggged."""
81+
code is tagged."""
8282
with open(file_name, "r", encoding="ascii") as source_file:
8383
db_lines = source_file.readlines()
8484
_get_sections(db_lines, self.generator_code_tag, self.generator_code)

src/odb/src/db/dbInst.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -368,6 +368,17 @@ bool dbInst::rename(const char* name)
368368
return false;
369369
}
370370

371+
if (block->_journal) {
372+
debugPrint(getImpl()->getLogger(),
373+
utl::ODB,
374+
"DB_ECO",
375+
1,
376+
"ECO: inst {}, rename to {}",
377+
getId(),
378+
name);
379+
block->_journal->updateField(this, _dbInst::NAME, inst->_name, name);
380+
}
381+
371382
block->_inst_hash.remove(inst);
372383
free((void*) inst->_name);
373384
inst->_name = safe_strdup(name);

src/odb/src/db/dbInst.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ class _dbInst : public _dbObject
4646
enum Field // dbJournalField name
4747
{
4848
FLAGS,
49-
ORIGIN
49+
ORIGIN,
50+
NAME
5051
};
5152

5253
_dbInstFlags _flags;

src/odb/src/db/dbJournal.cpp

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#include "dbCapNode.h"
1212
#include "dbITerm.h"
1313
#include "dbInst.h"
14+
#include "dbModNet.h"
1415
#include "dbNet.h"
1516
#include "dbRSeg.h"
1617
#include "odb/db.h"
@@ -916,6 +917,10 @@ void dbJournal::redo_updateField()
916917
redo_updateCapNodeField();
917918
break;
918919

920+
case dbModNetObj:
921+
redo_updateModNetField();
922+
break;
923+
919924
default:
920925
break;
921926
}
@@ -1086,6 +1091,55 @@ void dbJournal::redo_updateNetField()
10861091
break;
10871092
}
10881093

1094+
case _dbNet::NAME: {
1095+
std::string prev_name;
1096+
_log.pop(prev_name);
1097+
std::string new_name;
1098+
_log.pop(new_name);
1099+
debugPrint(_logger,
1100+
utl::ODB,
1101+
"DB_ECO",
1102+
2,
1103+
"REDO ECO: dbNetObj {}, updateName from {} to {}",
1104+
net_id,
1105+
prev_name.c_str(),
1106+
new_name.c_str());
1107+
((dbNet*) net)->rename(new_name.c_str());
1108+
break;
1109+
}
1110+
1111+
default:
1112+
break;
1113+
}
1114+
}
1115+
1116+
void dbJournal::redo_updateModNetField()
1117+
{
1118+
uint modnet_id;
1119+
_log.pop(modnet_id);
1120+
_dbModNet* modnet = (_dbModNet*) dbModNet::getModNet(_block, modnet_id);
1121+
1122+
int field;
1123+
_log.pop(field);
1124+
1125+
switch ((_dbModNet::Field) field) {
1126+
case _dbModNet::NAME: {
1127+
std::string prev_name;
1128+
_log.pop(prev_name);
1129+
std::string new_name;
1130+
_log.pop(new_name);
1131+
debugPrint(_logger,
1132+
utl::ODB,
1133+
"DB_ECO",
1134+
2,
1135+
"REDO ECO: dbModNetObj {}, updateName from {} to {}",
1136+
modnet_id,
1137+
prev_name.c_str(),
1138+
new_name.c_str());
1139+
((dbModNet*) modnet)->rename(new_name.c_str());
1140+
break;
1141+
}
1142+
10891143
default:
10901144
break;
10911145
}
@@ -1148,6 +1202,23 @@ void dbJournal::redo_updateInstField()
11481202
break;
11491203
}
11501204

1205+
case _dbInst::NAME: {
1206+
std::string prev_name;
1207+
_log.pop(prev_name);
1208+
std::string new_name;
1209+
_log.pop(new_name);
1210+
debugPrint(_logger,
1211+
utl::ODB,
1212+
"DB_ECO",
1213+
2,
1214+
"REDO ECO: dbInstObj {}, updateName from {} to {}",
1215+
inst_id,
1216+
prev_name.c_str(),
1217+
new_name.c_str());
1218+
((dbInst*) inst)->rename(new_name.c_str());
1219+
break;
1220+
}
1221+
11511222
default:
11521223
break;
11531224
}
@@ -2290,6 +2361,10 @@ void dbJournal::undo_updateField()
22902361
undo_updateCapNodeField();
22912362
break;
22922363

2364+
case dbModNetObj:
2365+
undo_updateModNetField();
2366+
break;
2367+
22932368
default: {
22942369
_logger->critical(utl::ODB,
22952370
445,
@@ -2317,6 +2392,24 @@ void dbJournal::undo_updateNetField()
23172392
_log.pop(new_flags);
23182393
break;
23192394
}
2395+
2396+
case _dbNet::NAME: {
2397+
std::string prev_name;
2398+
_log.pop(prev_name);
2399+
std::string new_name;
2400+
_log.pop(new_name);
2401+
debugPrint(_logger,
2402+
utl::ODB,
2403+
"DB_ECO",
2404+
2,
2405+
"UNDO ECO: dbNetObj {}, updateName from {} to {}",
2406+
net_id,
2407+
new_name.c_str(),
2408+
prev_name.c_str());
2409+
((dbNet*) net)->rename(prev_name.c_str());
2410+
break;
2411+
}
2412+
23202413
default: {
23212414
_logger->critical(
23222415
utl::ODB, 408, "No undo_updateNetField support for field {}", field);
@@ -2325,6 +2418,38 @@ void dbJournal::undo_updateNetField()
23252418
}
23262419
}
23272420

2421+
void dbJournal::undo_updateModNetField()
2422+
{
2423+
uint modnet_id;
2424+
_log.pop(modnet_id);
2425+
_dbModNet* modnet = (_dbModNet*) dbModNet::getModNet(_block, modnet_id);
2426+
2427+
int field;
2428+
_log.pop(field);
2429+
2430+
switch ((_dbModNet::Field) field) {
2431+
case _dbModNet::NAME: {
2432+
std::string prev_name;
2433+
_log.pop(prev_name);
2434+
std::string new_name;
2435+
_log.pop(new_name);
2436+
debugPrint(_logger,
2437+
utl::ODB,
2438+
"DB_ECO",
2439+
3,
2440+
"UNDO ECO: dbModNet {}, updateName from {} to {}",
2441+
modnet_id,
2442+
new_name.c_str(),
2443+
prev_name.c_str());
2444+
((dbModNet*) modnet)->rename(prev_name.c_str());
2445+
break;
2446+
}
2447+
2448+
default:
2449+
break;
2450+
}
2451+
}
2452+
23282453
void dbJournal::undo_updateInstField()
23292454
{
23302455
uint inst_id;
@@ -2362,6 +2487,24 @@ void dbJournal::undo_updateInstField()
23622487
((dbInst*) inst)->setOrigin(prev_x, prev_y);
23632488
break;
23642489
}
2490+
2491+
case _dbInst::NAME: {
2492+
std::string prev_name;
2493+
_log.pop(prev_name);
2494+
std::string new_name;
2495+
_log.pop(new_name);
2496+
debugPrint(_logger,
2497+
utl::ODB,
2498+
"DB_ECO",
2499+
2,
2500+
"UNDO ECO: dbInstObj {}, updateName from {} to {}",
2501+
inst_id,
2502+
new_name.c_str(),
2503+
prev_name.c_str());
2504+
((dbInst*) inst)->rename(prev_name.c_str());
2505+
break;
2506+
}
2507+
23652508
default: {
23662509
_logger->critical(
23672510
utl::ODB, 409, "No undo_updateInstField support for field {}", field);

src/odb/src/db/dbJournal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ class dbJournal
128128
void redo_updateField();
129129
void redo_updateBlockField();
130130
void redo_updateNetField();
131+
void redo_updateModNetField();
131132
void redo_updateInstField();
132133
void redo_updateITermField();
133134
void redo_updateRSegField();
@@ -142,6 +143,7 @@ class dbJournal
142143
void undo_swapObject();
143144
void undo_updateField();
144145
void undo_updateNetField();
146+
void undo_updateModNetField();
145147
void undo_updateInstField();
146148
void undo_updateITermField();
147149
void undo_updateRSegField();

src/odb/src/db/dbModNet.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,13 @@ dbModule* dbModNet::getParent() const
154154

155155
// User Code Begin dbModNetPublicMethods
156156

157-
const char* dbModNet::getName() const
157+
std::string dbModNet::getName() const
158+
{
159+
_dbModNet* obj = (_dbModNet*) this;
160+
return obj->_name;
161+
}
162+
163+
const char* dbModNet::getConstName() const
158164
{
159165
_dbModNet* obj = (_dbModNet*) this;
160166
return obj->_name;
@@ -171,6 +177,18 @@ void dbModNet::rename(const char* new_name)
171177
}
172178

173179
_dbBlock* block = (_dbBlock*) obj->getOwner();
180+
181+
if (block->_journal) {
182+
debugPrint(getImpl()->getLogger(),
183+
utl::ODB,
184+
"DB_ECO",
185+
1,
186+
"ECO: mod_net {}, rename to {}",
187+
getId(),
188+
new_name);
189+
block->_journal->updateField(this, _dbModNet::NAME, obj->_name, new_name);
190+
}
191+
174192
_dbModule* parent = block->_module_tbl->getPtr(obj->_parent);
175193
parent->_modnet_hash.erase(obj->_name);
176194
free((void*) (obj->_name));

src/odb/src/db/dbModNet.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,13 @@ class _dbModNet : public _dbObject
3838
dbId<_dbModBTerm> _modbterms;
3939
dbId<_dbITerm> _iterms;
4040
dbId<_dbBTerm> _bterms;
41+
42+
// User Code Begin Fields
43+
enum Field // dbJournalField name
44+
{
45+
NAME
46+
};
47+
// User Code End Fields
4148
};
4249
dbIStream& operator>>(dbIStream& stream, _dbModNet& obj);
4350
dbOStream& operator<<(dbOStream& stream, const _dbModNet& obj);

0 commit comments

Comments
 (0)