1 #include "StepDirectory.h"
2 #include "StepDirectory.h"
3 #include "StepDirectory.h"
5 #include "LayerDirectory.h"
11 namespace Odb::Lib::FileModel::Design
13 StepDirectory::StepDirectory(std::filesystem::path path)
18 StepDirectory::~StepDirectory()
20 m_layersByName.clear();
21 m_netlistsByName.clear();
24 std::string StepDirectory::GetName()
29 std::filesystem::path StepDirectory::GetPath()
34 const EdaDataFile& StepDirectory::GetEdaDataFile()
const {
return m_edaData; }
35 const LayerDirectory::StringMap& StepDirectory::GetLayersByName()
const {
return m_layersByName; }
36 const NetlistFile::StringMap& StepDirectory::GetNetlistsByName()
const {
return m_netlistsByName; }
38 const AttrListFile& StepDirectory::GetAttrListFile()
const
40 return m_attrListFile;
43 const FeaturesFile& StepDirectory::GetProfileFile()
const
48 const StepHdrFile& StepDirectory::GetStepHdrFile()
const
53 bool StepDirectory::Parse()
55 if (!std::filesystem::exists(m_path))
return false;
56 else if (!std::filesystem::is_directory(m_path))
return false;
58 m_name = std::filesystem::path(m_path).filename().string();
60 loginfo(
"Parsing step directory: " + m_name +
"...");
62 auto layersPath = m_path /
"layers";
63 if (!ParseLayerFiles(layersPath))
return false;
65 auto netlistsPath = m_path /
"netlists";
66 if (!ParseNetlistFiles(netlistsPath))
return false;
68 auto edaPath = m_path /
"eda";
69 if (!ParseEdaDataFiles(edaPath))
return false;
71 auto attrListPath = m_path;
72 if (!ParseAttrListFile(attrListPath))
return false;
74 auto profilePath = m_path;
75 if (!ParseProfileFile(profilePath))
return false;
77 auto stepHdrPath = m_path;
78 if (!ParseStepHdrFile(stepHdrPath))
return false;
80 loginfo(
"Parsing step directory: " + m_name +
" complete");
85 bool StepDirectory::ParseLayerFiles(std::filesystem::path layersPath)
87 loginfo(
"Parsing layer directories...");
89 if (!std::filesystem::exists(layersPath))
return false;
90 else if (!std::filesystem::is_directory(layersPath))
return false;
92 for (
auto& d : std::filesystem::directory_iterator(layersPath))
94 if (std::filesystem::is_directory(d))
96 auto pLayer = std::make_shared<LayerDirectory>(d.path());
99 loginfo(
"Parsing layer: " + pLayer->GetName() +
" complete");
101 m_layersByName[pLayer->GetName()] = pLayer;
110 loginfo(
"Parsing layer directories complete");
115 bool StepDirectory::ParseEdaDataFiles(std::filesystem::path edaPath)
117 loginfo(
"Parsing eda/data file...");
119 if (!std::filesystem::exists(edaPath))
return false;
120 else if (!std::filesystem::is_directory(edaPath))
return false;
123 auto success = m_edaData.Parse(edaPath);
125 loginfo(
"Parsing eda/data file complete");
130 bool StepDirectory::ParseAttrListFile(std::filesystem::path attrListFileDirectory)
132 loginfo(
"Parsing attrlist file...");
134 if (!std::filesystem::exists(attrListFileDirectory))
return false;
135 if (!std::filesystem::is_directory(attrListFileDirectory))
return false;
138 auto success = m_attrListFile.Parse(attrListFileDirectory);
140 loginfo(
"Parsing attrlist file complete");
145 bool StepDirectory::ParseProfileFile(std::filesystem::path profileFileDirectory)
147 loginfo(
"Parsing profile file...");
149 if (!std::filesystem::exists(profileFileDirectory))
return false;
150 if (!std::filesystem::is_directory(profileFileDirectory))
return false;
153 auto success = m_profileFile.Parse(profileFileDirectory, PROFILE_FILENAME);
155 loginfo(
"Parsing profile file complete");
160 bool StepDirectory::ParseStepHdrFile(std::filesystem::path stepHdrFileDirectory)
162 loginfo(
"Parsing stephdr file...");
164 if (!std::filesystem::exists(stepHdrFileDirectory))
return false;
165 if (!std::filesystem::is_directory(stepHdrFileDirectory))
return false;
168 auto success = m_stepHdrFile.Parse(stepHdrFileDirectory);
170 loginfo(
"Parsing stephdr file complete");
175 std::unique_ptr<Odb::Lib::Protobuf::StepDirectory> StepDirectory::to_protobuf()
const
177 std::unique_ptr<Odb::Lib::Protobuf::StepDirectory> pStepDirectoryMessage(
new Odb::Lib::Protobuf::StepDirectory);
178 pStepDirectoryMessage->set_name(m_name);
179 pStepDirectoryMessage->set_path(m_path.string());
180 pStepDirectoryMessage->mutable_edadatafile()->CopyFrom(*m_edaData.to_protobuf());
181 pStepDirectoryMessage->mutable_attrlistfile()->CopyFrom(*m_attrListFile.to_protobuf());
182 pStepDirectoryMessage->mutable_profilefile()->CopyFrom(*m_profileFile.to_protobuf());
183 pStepDirectoryMessage->mutable_stephdrfile()->CopyFrom(*m_stepHdrFile.to_protobuf());
185 for (
const auto& kvNetlistFile : m_netlistsByName)
187 (*pStepDirectoryMessage->mutable_netlistsbyname())[kvNetlistFile.first] = *kvNetlistFile.second->to_protobuf();
190 for (
const auto& kvLayerDirectoryRecord : m_layersByName)
192 (*pStepDirectoryMessage->mutable_layersbyname())[kvLayerDirectoryRecord.first] = *kvLayerDirectoryRecord.second->to_protobuf();
195 return pStepDirectoryMessage;
198 void StepDirectory::from_protobuf(
const Odb::Lib::Protobuf::StepDirectory& message)
200 m_name = message.name();
201 m_path = message.path();
202 m_edaData.from_protobuf(message.edadatafile());
203 m_attrListFile.from_protobuf(message.attrlistfile());
204 m_profileFile.from_protobuf(message.profilefile());
205 m_stepHdrFile.from_protobuf(message.stephdrfile());
207 for (
const auto& kvNetlistFile : message.netlistsbyname())
209 auto pNetlistFile = std::make_shared<NetlistFile>(std::filesystem::path(kvNetlistFile.second.path()));
210 pNetlistFile->from_protobuf(kvNetlistFile.second);
211 m_netlistsByName[kvNetlistFile.first] = pNetlistFile;
214 for (
const auto& kvLayerDirectoryRecord : message.layersbyname())
216 auto pLayerDirectory = std::make_shared<LayerDirectory>(std::filesystem::path(kvLayerDirectoryRecord.second.path()));
217 pLayerDirectory->from_protobuf(kvLayerDirectoryRecord.second);
218 m_layersByName[kvLayerDirectoryRecord.first] = pLayerDirectory;
222 bool StepDirectory::ParseNetlistFiles(std::filesystem::path netlistsPath)
224 loginfo(
"Parsing netlist files...");
226 std::size_t netListDirectoriesFound = 0;
228 if (std::filesystem::exists(netlistsPath))
230 if (std::filesystem::is_directory(netlistsPath))
233 for (
auto& d : std::filesystem::directory_iterator(netlistsPath))
235 if (std::filesystem::is_directory(d))
237 netListDirectoriesFound++;
239 auto pNetlist = std::make_shared<NetlistFile>(d.path());
240 if (pNetlist->Parse())
242 m_netlistsByName[pNetlist->GetName()] = pNetlist;
247 logerror(
"Failed to parse netlist directory: " + pNetlist->GetName());
254 if (netListDirectoriesFound == 0)
256 logwarn(
"No netlist directories found");
258 else if (netListDirectoriesFound == m_netlistsByName.size())
260 loginfo(
"netlist directories parsed successfully");
266 const ComponentsFile* StepDirectory::GetTopComponentsFile()
const
268 auto findIt = m_layersByName.find(ComponentsFile::TOP_COMPONENTS_LAYER_NAME);
269 if (findIt != m_layersByName.end())
271 return &(findIt->second->GetComponentsFile());
279 const ComponentsFile* StepDirectory::GetBottomComponentsFile()
const
281 auto findIt = m_layersByName.find(ComponentsFile::BOTTOM_COMPONENTS_LAYER_NAME);
282 if (findIt != m_layersByName.end())
284 return &(findIt->second->GetComponentsFile());