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