Skip to content

Commit 25f50d1

Browse files
committed
odb: add 3dbxWriter
Signed-off-by: Rafael Moresco <[email protected]>
1 parent 2c4588b commit 25f50d1

File tree

4 files changed

+201
-0
lines changed

4 files changed

+201
-0
lines changed

src/odb/src/3dblox/3dblox.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "dbvParser.h"
1818
#include "dbvWriter.h"
1919
#include "dbxParser.h"
20+
#include "dbxWriter.h"
2021
#include "objects.h"
2122
#include "odb/db.h"
2223
#include "odb/dbTransform.h"
@@ -184,6 +185,12 @@ void ThreeDBlox::writeDbx(const std::string& dbx_file, odb::dbChip* chip)
184185
writeDbv(current_dir_path + chip->getName() + ".3dbv", chip);
185186
}
186187

188+
void ThreeDBlox::writeDbx(const std::string& dbx_file)
189+
{
190+
DbxWriter writer(logger_);
191+
writer.writeFile(dbx_file, db_);
192+
}
193+
187194
void ThreeDBlox::calculateSize(dbChip* chip)
188195
{
189196
Rect box;

src/odb/src/3dblox/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ add_library(3dblox
1010
dbxParser.cpp
1111
baseWriter.cpp
1212
dbvWriter.cpp
13+
dbxWriter.cpp
1314
3dblox.cpp
1415
checker.cpp
1516
)

src/odb/src/3dblox/dbxWriter.cpp

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
// SPDX-License-Identifier: BSD-3-Clause
2+
// Copyright (c) 2019-2025, The OpenROAD Authors
3+
4+
#include "dbxWriter.h"
5+
6+
#include <yaml-cpp/emitterstyle.h>
7+
#include <yaml-cpp/node/node.h>
8+
#include <yaml-cpp/yaml.h>
9+
10+
#include <string>
11+
#include <vector>
12+
13+
#include "baseWriter.h"
14+
#include "odb/db.h"
15+
#include "utl/Logger.h"
16+
17+
namespace odb {
18+
19+
DbxWriter::DbxWriter(utl::Logger* logger) : BaseWriter(logger)
20+
{
21+
}
22+
23+
void DbxWriter::writeFile(const std::string& filename, odb::dbDatabase* db)
24+
{
25+
// TODO: Connect the following
26+
// DbvWriter dbvwriter(logger_);
27+
// dbvwriter.writeChiplet(
28+
// std::string(db->getChip()->getName()) + ".3dbv", db, db->getChip());
29+
YAML::Node root;
30+
writeYamlContent(root, db->getChip());
31+
writeYamlToFile(filename, root);
32+
}
33+
34+
void DbxWriter::writeChiplet(odb::dbChip* chiplet)
35+
{
36+
YAML::Node root;
37+
// TODO: Connect the following
38+
// DbvWriter dbvwriter(logger_);
39+
// dbvwriter.writeChiplet(
40+
// std::string(chiplet->getName()) + ".3dbv", chiplet->getDb(), chiplet);
41+
writeYamlContent(root, chiplet);
42+
writeYamlToFile(std::string(chiplet->getName()), root);
43+
}
44+
45+
void DbxWriter::writeYamlContent(YAML::Node& root, odb::dbChip* chiplet)
46+
{
47+
YAML::Node header_node = root["Header"];
48+
writeHeader(header_node, chiplet->getDb());
49+
YAML::Node includes_node = header_node["include"];
50+
includes_node.push_back(std::string(chiplet->getName()) + ".3dbv");
51+
52+
YAML::Node design_node = root["Design"];
53+
writeDesign(design_node, chiplet);
54+
55+
YAML::Node instances_node = root["ChipletInst"];
56+
writeChipletInsts(instances_node, chiplet);
57+
58+
YAML::Node stack_node = root["Stack"];
59+
writeStack(stack_node, chiplet);
60+
61+
YAML::Node connections_node = root["Connection"];
62+
writeConnections(connections_node, chiplet);
63+
}
64+
65+
void DbxWriter::writeDesign(YAML::Node& design_node, odb::dbChip* chiplet)
66+
{
67+
design_node["name"] = chiplet->getName();
68+
}
69+
70+
void DbxWriter::writeChipletInsts(YAML::Node& instances_node,
71+
odb::dbChip* chiplet)
72+
{
73+
for (auto inst : chiplet->getChipInsts()) {
74+
YAML::Node instance_node = instances_node[std::string(inst->getName())];
75+
writeChipletInst(instance_node, inst);
76+
}
77+
}
78+
79+
void DbxWriter::writeChipletInst(YAML::Node& instance_node,
80+
odb::dbChipInst* inst)
81+
{
82+
auto master_name = inst->getMasterChip()->getName();
83+
instance_node["reference"] = master_name;
84+
}
85+
86+
void DbxWriter::writeStack(YAML::Node& stack_node, odb::dbChip* chiplet)
87+
{
88+
for (auto inst : chiplet->getChipInsts()) {
89+
YAML::Node stack_instance_node = stack_node[std::string(inst->getName())];
90+
writeStackInstance(stack_instance_node, inst);
91+
}
92+
}
93+
94+
void DbxWriter::writeStackInstance(YAML::Node& stack_instance_node,
95+
odb::dbChipInst* inst)
96+
{
97+
const double u = inst->getDb()->getDbuPerMicron();
98+
const double loc_x = inst->getLoc().x() / u;
99+
const double loc_y = inst->getLoc().y() / u;
100+
YAML::Node loc_out;
101+
loc_out.SetStyle(YAML::EmitterStyle::Flow);
102+
loc_out.push_back(loc_x);
103+
loc_out.push_back(loc_y);
104+
stack_instance_node["loc"] = loc_out;
105+
stack_instance_node["z"] = inst->getLoc().z() / u;
106+
stack_instance_node["orient"] = inst->getOrient().getString();
107+
}
108+
109+
void DbxWriter::writeConnections(YAML::Node& connections_node,
110+
odb::dbChip* chiplet)
111+
{
112+
for (auto conn : chiplet->getChipConns()) {
113+
YAML::Node connection_node = connections_node[std::string(conn->getName())];
114+
writeConnection(connection_node, conn);
115+
}
116+
}
117+
118+
void DbxWriter::writeConnection(YAML::Node& connection_node,
119+
odb::dbChipConn* conn)
120+
{
121+
const double u = conn->getDb()->getDbuPerMicron();
122+
connection_node["top"]
123+
= buildPath(conn->getTopRegionPath(), conn->getTopRegion());
124+
connection_node["bot"]
125+
= buildPath(conn->getBottomRegionPath(), conn->getBottomRegion());
126+
connection_node["thicness"] = conn->getThickness() / u;
127+
}
128+
129+
std::string DbxWriter::buildPath(const std::vector<dbChipInst*>& path_insts,
130+
odb::dbChipRegionInst* region)
131+
{
132+
if (region == nullptr) {
133+
return "~";
134+
}
135+
136+
std::string path;
137+
for (auto inst : path_insts) {
138+
if (!path.empty()) {
139+
path += "/";
140+
}
141+
path += inst->getName();
142+
}
143+
144+
if (!path.empty()) {
145+
path += ".regions." + region->getChipRegion()->getName();
146+
}
147+
return path;
148+
}
149+
150+
} // namespace odb

src/odb/src/3dblox/dbxWriter.h

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// SPDX-License-Identifier: BSD-3-Clause
2+
// Copyright (c) 2019-2025, The OpenROAD Authors
3+
4+
#pragma once
5+
6+
#include <yaml-cpp/node/node.h>
7+
8+
#include <string>
9+
#include <vector>
10+
11+
#include "baseWriter.h"
12+
#include "odb/db.h"
13+
14+
namespace utl {
15+
class Logger;
16+
}
17+
18+
namespace odb {
19+
20+
class DbxWriter : public BaseWriter
21+
{
22+
public:
23+
DbxWriter(utl::Logger* logger);
24+
25+
void writeFile(const std::string& filename, odb::dbDatabase* db) override;
26+
void writeChiplet(odb::dbChip* chiplet);
27+
28+
private:
29+
void writeYamlContent(YAML::Node& root, odb::dbChip* chiplet);
30+
void writeDesign(YAML::Node& design_node, odb::dbChip* chiplet);
31+
void writeDesignExternal(YAML::Node& external_node, odb::dbChip* chiplet);
32+
void writeChipletInsts(YAML::Node& instances_node, odb::dbChip* chiplet);
33+
void writeChipletInst(YAML::Node& instance_node, odb::dbChipInst* inst);
34+
void writeStack(YAML::Node& stack_node, odb::dbChip* chiplet);
35+
void writeStackInstance(YAML::Node& stack_instance_node,
36+
odb::dbChipInst* inst);
37+
void writeConnections(YAML::Node& connections_node, odb::dbChip* chiplet);
38+
void writeConnection(YAML::Node& connection_node, odb::dbChipConn* conn);
39+
std::string buildPath(const std::vector<dbChipInst*>& path_insts,
40+
odb::dbChipRegionInst* region);
41+
};
42+
43+
} // namespace odb

0 commit comments

Comments
 (0)