Commit 2380229d by lvzhengyang

add create/delete Block

parent 374c8b04
...@@ -9,7 +9,9 @@ ...@@ -9,7 +9,9 @@
namespace odb { namespace odb {
class dbDatabase; class dbDatabase;
class dbBlock;
class lefin; class lefin;
class defin;
} }
// Logger symbol: MGR // Logger symbol: MGR
...@@ -46,14 +48,16 @@ class DbMgr { ...@@ -46,14 +48,16 @@ class DbMgr {
public: public:
DbMgr(); DbMgr();
~DbMgr(); // dbDatadase::destroy() ~DbMgr(); // dbDatadase::destroy()
bool readLibDB(const char* path, const char* libname, bool readLibDB(const char* lef_path,
bool isTech=false, bool isLib=true); const char* libname,
bool isTech=false,
bool isLib=true);
bool haveBlockDB(const std::string block);
bool createBlockDB(const char* block_name);
bool deleteBlockDB(const char* block_name);
/* /*
bool readBlockDBs(); bool readBlockDef();
bool addBlockDB();
bool deleteBlockDB();
*/ */
bool haveBlockDB(std::string block);
void setLogger(utl::Logger* logger); void setLogger(utl::Logger* logger);
void init(utl::Logger* logger); void init(utl::Logger* logger);
...@@ -73,8 +77,12 @@ private: ...@@ -73,8 +77,12 @@ private:
std::unordered_map<std::string, odb::dbDatabase*> block_dbs_; std::unordered_map<std::string, odb::dbDatabase*> block_dbs_;
utl::Logger* logger_; utl::Logger* logger_;
// parsers /* parsers */
// use OpenDB's lef/def parser
std::unique_ptr<odb::lefin> lef_parser_; std::unique_ptr<odb::lefin> lef_parser_;
std::unique_ptr<odb::defin> def_parser_;
// use Limbo's verilog parser
}; };
} // namespace db_mgr } // namespace db_mgr
} // namespace eda } // namespace eda
......
#include "db_mgr/db_mgr.h" #include "db_mgr/db_mgr.h"
#include "db.h" #include "db.h"
#include "lefin.h" #include "lefin.h"
#include "defin.h"
#include "utl/Logger.h" #include "utl/Logger.h"
namespace eda { namespace eda {
...@@ -8,7 +9,9 @@ namespace db_mgr { ...@@ -8,7 +9,9 @@ namespace db_mgr {
DbMgr::DbMgr() DbMgr::DbMgr()
: lib_db_(nullptr), : lib_db_(nullptr),
logger_(nullptr) logger_(nullptr),
lef_parser_(nullptr),
def_parser_(nullptr)
{ {
block_dbs_.clear(); block_dbs_.clear();
} }
...@@ -34,7 +37,7 @@ DbMgr::~DbMgr() ...@@ -34,7 +37,7 @@ DbMgr::~DbMgr()
} }
} }
bool DbMgr::haveBlockDB(std::string block) bool DbMgr::haveBlockDB(const std::string block)
{ {
if (block_dbs_.empty()) return false; if (block_dbs_.empty()) return false;
return block_dbs_.find(block) != block_dbs_.end(); return block_dbs_.find(block) != block_dbs_.end();
...@@ -45,23 +48,50 @@ void DbMgr::setLogger(utl::Logger* logger) ...@@ -45,23 +48,50 @@ void DbMgr::setLogger(utl::Logger* logger)
logger_ = logger; logger_ = logger;
} }
bool DbMgr::readLibDB(const char* path, const char* libname, bool DbMgr::readLibDB(const char* lef_path, const char* libname,
bool isTech, bool isLib) bool isTech, bool isLib)
{ {
if (isTech && isLib) { if (isTech && isLib) {
lef_parser_->createTechAndLib(libname, path); lef_parser_->createTechAndLib(libname, lef_path);
} else if (isTech && !isLib) { } else if (isTech && !isLib) {
lef_parser_->createTech(path); lef_parser_->createTech(lef_path);
} else if (!isTech && isLib) { } else if (!isTech && isLib) {
lef_parser_->createLib(libname, path); lef_parser_->createLib(libname, lef_path);
} else { } else {
logger_->warn(utl::MGR, 1, logger_->warn(utl::MGR, 1,
"Failed to read {}. LEF file must be Tech or Lib.", "Failed to read {}. LEF file must be Tech or Lib.",
path); lef_path);
return false; return false;
} }
return true; return true;
} }
bool DbMgr::createBlockDB(const char* block_name)
{
if (haveBlockDB(block_name)) {
logger_->error(utl::MGR, 2, "Cannot create existing block: {}", block_name);
return false;
}
odb::dbDatabase* block_db = odb::dbDatabase::duplicate(lib_db_);
block_dbs_.emplace(std::make_pair(block_name, block_db));
logger_->info(utl::MGR, 3, "Create Block: {}. Ensure lib has been successfully read.",
block_name);
return true;
}
bool DbMgr::deleteBlockDB(const char* block_name)
{
if (!haveBlockDB(block_name)) {
logger_->error(utl::MGR, 4, "Failed to delete non-existed block {}.",
block_name);
return false;
}
odb::dbDatabase::destroy(block_dbs_.find(block_name)->second);
block_dbs_.erase(block_name);
logger_->info(utl::MGR, 4, "Delete Block: {}.",
block_name);
return true;
}
} // namespace db_mgr } // namespace db_mgr
} // namespace eda } // namespace eda
...@@ -26,6 +26,16 @@ bool read_lef(const char* file_path, const char* libname, ...@@ -26,6 +26,16 @@ bool read_lef(const char* file_path, const char* libname,
return getDbMgr()->readLibDB(file_path, libname, isTech, isLib); return getDbMgr()->readLibDB(file_path, libname, isTech, isLib);
} }
bool create_blk_db(const char* block_name)
{
return getDbMgr()->createBlockDB(block_name);
}
bool delete_blk_db(const char* block_name)
{
return getDbMgr()->deleteBlockDB(block_name);
}
} // namespace db_mgr } // namespace db_mgr
%} // inline %} // inline
...@@ -28,4 +28,24 @@ proc read_lef { args } { ...@@ -28,4 +28,24 @@ proc read_lef { args } {
db_mgr::read_lef $lef_name $lib_name $is_tech $is_lib db_mgr::read_lef $lef_name $lib_name $is_tech $is_lib
}
define_cmd_args "create_block" { block_name }
proc create_block { args } {
parse_key_args "create_block" args keys {} flags {}
foreach block $args {
db_mgr::create_blk_db $block
}
}
define_cmd_args "delete_block" { block_name }
proc delete_block { args } {
parse_key_args "delete_block" args keys {} flags {}
foreach block $args {
db_mgr::delete_blk_db $block
}
} }
\ No newline at end of file
read_lef -tech ../test/Nangate45/Nangate45_tech.lef
read_lef ../test/Nangate45/Nangate45.lef
read_lef ../test/Nangate45/Nangate45_stdcell.lef
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment