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
0 commit comments