Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion src/interface/python/py_ircx/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ add_library(py_ircx ${PY_IRCX_SRC})
target_link_libraries(py_ircx
PUBLIC
ircx
OpenMP::OpenMP_CXX
pybind11::pybind11
)
target_include_directories(py_ircx
Expand Down
21 changes: 2 additions & 19 deletions src/interface/python/py_ircx/py_ircx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
#include <filesystem>
#include <stdexcept>

#include "ParasiticXEngine.hpp"
#include "RCX.hpp"

namespace python_interface {
Expand Down Expand Up @@ -67,19 +66,6 @@ bool read_rcx_corner(const std::string& corner_name,
return rcx().readCorner(corner_name, itf_file.c_str(), captab_file.c_str());
}

bool read_rcx_itf(const std::vector<std::string>& itf_files)
{
if (itf_files.empty()) {
throw std::invalid_argument("itf_files is empty.");
}

for (const auto& itf_file : itf_files) {
require_file_exists(itf_file, "itf_file");
}

return rcx().readItf(itf_files);
}

bool read_rcx_mapping(const std::string& mapping_file)
{
require_file_exists(mapping_file, "mapping_file");
Expand Down Expand Up @@ -114,15 +100,12 @@ bool extract_rcx_parasitics()
bool run_rcx(const std::string& config)
{
require_file_exists(config, "config");

auto* parasitic_x_engine = ircx::ParasiticXEngine::get_or_create_parasitic_x_engine();
return parasitic_x_engine != nullptr && parasitic_x_engine->run_rcx(config);
return rcx().runFromConfig(config);
}

bool report_rcx(const std::string& output_dir)
{
auto* parasitic_x_engine = ircx::ParasiticXEngine::get_or_create_parasitic_x_engine();
return parasitic_x_engine != nullptr && parasitic_x_engine->report_rcx(output_dir);
return rcx().reportSpef(output_dir);
}

} // namespace python_interface
2 changes: 0 additions & 2 deletions src/interface/python/py_ircx/py_ircx.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,13 @@
#pragma once

#include <string>
#include <vector>

namespace python_interface {

bool init_rcx(unsigned thread_number);
bool read_rcx_corner(const std::string& corner_name,
const std::string& itf_file,
const std::string& captab_file);
bool read_rcx_itf(const std::vector<std::string>& itf_files);
bool read_rcx_mapping(const std::string& mapping_file);

bool adapt_rcx_db();
Expand Down
1 change: 0 additions & 1 deletion src/interface/python/py_ircx/py_register_ircx.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ void register_ircx(py::module& m)
m.def("init_rcx", init_rcx, py::arg("thread_number") = 64);
m.def("read_rcx_corner", read_rcx_corner, py::arg("corner_name"),
py::arg("itf_file"), py::arg("captab_file"));
m.def("read_rcx_itf", read_rcx_itf, py::arg("itf_files"));
m.def("read_rcx_mapping", read_rcx_mapping, py::arg("mapping_file"));

m.def("adapt_rcx_db", adapt_rcx_db);
Expand Down
2 changes: 0 additions & 2 deletions src/operation/iRCX/api/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,8 @@ target_link_libraries(ircx_engine
PRIVATE
def_service
idb
ircx_config
lef_service
log
OpenMP::OpenMP_CXX
)

target_include_directories(ircx_engine
Expand Down
65 changes: 2 additions & 63 deletions src/operation/iRCX/api/ParasiticXEngine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,21 +14,13 @@
//
// See the Mulan PSL v2 for more details.
// ***************************************************************************************
#include <filesystem>
#include <mutex>
#include <system_error>

#include <omp.h>

#include "ParasiticXEngine.hpp"
#include "RCX.hpp"
#include "RCXConfig.hh"
#include "log/Log.hh"

namespace ircx {

namespace fs = std::filesystem;

ParasiticXEngine* ParasiticXEngine::_instance = nullptr;

ParasiticXEngine* ParasiticXEngine::get_or_create_parasitic_x_engine()
Expand Down Expand Up @@ -64,65 +56,12 @@ void ParasiticXEngine::set_rcx(RCX* rcx)

bool ParasiticXEngine::run_rcx(const std::string& config)
{
if (_rcx == nullptr) {
return false;
}

RCXConfig rcx_config;
if (!rcx_config.loadFromFile(config)) {
return false;
}

const auto& corners = rcx_config.get_corners();
_rcx->set_num_threads(rcx_config.get_thread_num());
omp_set_num_threads(_rcx->num_threads());

unsigned result = 1;
for (const auto& corner : corners) {
result &= _rcx->readCorner(corner.name, corner.itf_file.c_str(), corner.captab_file.c_str());
}
result &= _rcx->readMapping(rcx_config.get_mapping_file().c_str());
if (!result) {
return false;
}

result &= _rcx->adaptDB();
result &= _rcx->buildTopology();
result &= _rcx->buildEnvironment();
result &= _rcx->buildProcessVariation();
result &= _rcx->extractParasitics();
if (!result) {
return false;
}

const std::string output_dir = rcx_config.get_output_dir().empty() ? "." : rcx_config.get_output_dir();
std::error_code ec;
fs::create_directories(output_dir, ec);
if (ec) {
LOG_ERROR << "Failed to create RCX output directory " << output_dir << ": " << ec.message();
return false;
}

result &= _rcx->reportSpef(output_dir);

return result;
return _rcx != nullptr && _rcx->runFromConfig(config);
}

bool ParasiticXEngine::report_rcx(const std::string& output_dir)
{
if (_rcx == nullptr) {
return false;
}

const std::string resolved_output_dir = output_dir.empty() ? "." : output_dir;
std::error_code ec;
fs::create_directories(resolved_output_dir, ec);
if (ec) {
LOG_ERROR << "Failed to create RCX output directory " << resolved_output_dir << ": " << ec.message();
return false;
}

return _rcx->reportSpef(resolved_output_dir);
return _rcx != nullptr && _rcx->reportSpef(output_dir.empty() ? "." : output_dir);
}

} // namespace ircx
4 changes: 4 additions & 0 deletions src/operation/iRCX/api/ParasiticXIDBAdapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,10 @@ bool ParasiticXIDBAdapter::adapt(LayoutData& layout_data,
return false;
}

layout_data.clear();
spef_context.clear();
layer_table.clearDesignLayers();

IdbLayers* idb_layers = idb_layout->get_layers();
adaptLayerTable(idb_layers);
adaptRoutingLayer(idb_layers);
Expand Down
20 changes: 20 additions & 0 deletions src/operation/iRCX/source/module/database/LayerTable.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,26 @@ namespace ircx {
class LayerTable {
public:
// Registration
void clear() {
clearDesignLayers();
clearProcessLayers();
clearMappings();
}

void clearDesignLayers() {
design_id_to_name_.clear();
design_name_to_id_.clear();
}

void clearProcessLayers() {
process_id_to_name_.clear();
process_name_to_id_.clear();
}

void clearMappings() {
design_to_process_name_.clear();
process_to_design_name_.clear();
}

void registerDesignLayer(Size id, Str name) {
design_id_to_name_[id] = name;
Expand Down
9 changes: 9 additions & 0 deletions src/operation/iRCX/source/module/database/LayoutData.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,15 @@ struct Net {
};

struct LayoutData {
void clear() {
design_name.clear();
die_shape = {};
micron_to_dbu = 1;
routing_layers.clear();
net_vec.clear();
special_net = {};
}

// Design metadata
Str design_name;
GtlRectI die_shape;
Expand Down
8 changes: 8 additions & 0 deletions src/operation/iRCX/source/module/database/SpefContext.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,14 @@ namespace ircx {
// by the layout adapter.
//
struct SpefContext {
void clear() {
net_names.clear();
port_names.clear();
port_io.clear();
instance_names.clear();
instance_to_cell.clear();
}

// Ordered lists for SPEF *NAME_MAP output.
// Index 0 = first entry; SPEF IDs start at *1.
std::vector<Str> net_names;
Expand Down
Loading
Loading