Commit 2380229d by lvzhengyang

add create/delete Block

parent 374c8b04
......@@ -9,7 +9,9 @@
namespace odb {
class dbDatabase;
class dbBlock;
class lefin;
class defin;
}
// Logger symbol: MGR
......@@ -46,14 +48,16 @@ class DbMgr {
public:
DbMgr();
~DbMgr(); // dbDatadase::destroy()
bool readLibDB(const char* path, const char* libname,
bool isTech=false, bool isLib=true);
bool readLibDB(const char* lef_path,
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 addBlockDB();
bool deleteBlockDB();
bool readBlockDef();
*/
bool haveBlockDB(std::string block);
void setLogger(utl::Logger* logger);
void init(utl::Logger* logger);
......@@ -73,8 +77,12 @@ private:
std::unordered_map<std::string, odb::dbDatabase*> block_dbs_;
utl::Logger* logger_;
// parsers
/* parsers */
// use OpenDB's lef/def parser
std::unique_ptr<odb::lefin> lef_parser_;
std::unique_ptr<odb::defin> def_parser_;
// use Limbo's verilog parser
};
} // namespace db_mgr
} // namespace eda
......
#include "db_mgr/db_mgr.h"
#include "db.h"
#include "lefin.h"
#include "defin.h"
#include "utl/Logger.h"
namespace eda {
......@@ -8,7 +9,9 @@ namespace db_mgr {
DbMgr::DbMgr()
: lib_db_(nullptr),
logger_(nullptr)
logger_(nullptr),
lef_parser_(nullptr),
def_parser_(nullptr)
{
block_dbs_.clear();
}
......@@ -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;
return block_dbs_.find(block) != block_dbs_.end();
......@@ -45,23 +48,50 @@ void DbMgr::setLogger(utl::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)
{
if (isTech && isLib) {
lef_parser_->createTechAndLib(libname, path);
lef_parser_->createTechAndLib(libname, lef_path);
} else if (isTech && !isLib) {
lef_parser_->createTech(path);
lef_parser_->createTech(lef_path);
} else if (!isTech && isLib) {
lef_parser_->createLib(libname, path);
lef_parser_->createLib(libname, lef_path);
} else {
logger_->warn(utl::MGR, 1,
"Failed to read {}. LEF file must be Tech or Lib.",
path);
lef_path);
return false;
}
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 eda
......@@ -26,6 +26,16 @@ bool read_lef(const char* file_path, const char* libname,
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
%} // inline
......@@ -29,3 +29,23 @@ proc read_lef { args } {
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