1#include "StepDirectory.h"
3#include "LayerDirectory.h"
8#include "../../Text/Utf8Sanitizer.h"
11namespace 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 bool StepDirectory::Save(
const std::filesystem::path& directory)
177 auto stepDir = directory / m_name;
178 if (!create_directory(stepDir))
return false;
181 auto edaPath = stepDir /
"eda";
182 if (!create_directory(edaPath))
return false;
183 std::ofstream edaDataFile(edaPath /
"data");
184 if (!m_edaData.Save(edaDataFile))
return false;
188 std::ofstream attrlistFile(stepDir /
"attrlist");
189 if (!m_attrListFile.Save(attrlistFile))
return false;
190 attrlistFile.close();
193 std::ofstream profileFile(stepDir /
"profile");
194 if (!m_profileFile.Save(profileFile))
return false;
198 std::ofstream stephdrFile(stepDir /
"stephdr");
199 if (!m_stepHdrFile.Save(stephdrFile))
return false;
203 auto layersPath = stepDir /
"layers";
204 if (!create_directory(layersPath))
return false;
205 for (
auto& kvLayer : m_layersByName)
207 if (!kvLayer.second->Save(layersPath))
return false;
211 auto netlistsPath = stepDir /
"netlists";
212 if (!create_directory(netlistsPath))
return false;
213 for (
auto& kvNetlist : m_netlistsByName)
215 if (!kvNetlist.second->Save(netlistsPath))
return false;
221 std::unique_ptr<Odb::Lib::Protobuf::StepDirectory> StepDirectory::to_protobuf()
const
223 std::unique_ptr<Odb::Lib::Protobuf::StepDirectory> pStepDirectoryMessage(
new Odb::Lib::Protobuf::StepDirectory);
224 pStepDirectoryMessage->set_name(Odb::Lib::Text::ToUtf8(m_name));
225 pStepDirectoryMessage->set_path(Odb::Lib::Text::ToUtf8(m_path.string()));
226 pStepDirectoryMessage->mutable_edadatafile()->CopyFrom(*m_edaData.to_protobuf());
227 pStepDirectoryMessage->mutable_attrlistfile()->CopyFrom(*m_attrListFile.to_protobuf());
228 pStepDirectoryMessage->mutable_profilefile()->CopyFrom(*m_profileFile.to_protobuf());
229 pStepDirectoryMessage->mutable_stephdrfile()->CopyFrom(*m_stepHdrFile.to_protobuf());
231 for (
const auto& kvNetlistFile : m_netlistsByName)
233 (*pStepDirectoryMessage->mutable_netlistsbyname())[Odb::Lib::Text::ToUtf8(kvNetlistFile.first)] = *kvNetlistFile.second->to_protobuf();
236 for (
const auto& kvLayerDirectoryRecord : m_layersByName)
238 (*pStepDirectoryMessage->mutable_layersbyname())[Odb::Lib::Text::ToUtf8(kvLayerDirectoryRecord.first)] = *kvLayerDirectoryRecord.second->to_protobuf();
241 return pStepDirectoryMessage;
244 void StepDirectory::from_protobuf(
const Odb::Lib::Protobuf::StepDirectory& message)
246 m_name = message.name();
247 m_path = message.path();
248 m_edaData.from_protobuf(message.edadatafile());
249 m_attrListFile.from_protobuf(message.attrlistfile());
250 m_profileFile.from_protobuf(message.profilefile());
251 m_stepHdrFile.from_protobuf(message.stephdrfile());
253 for (
const auto& kvNetlistFile : message.netlistsbyname())
255 auto pNetlistFile = std::make_shared<NetlistFile>(std::filesystem::path(kvNetlistFile.second.path()));
256 pNetlistFile->from_protobuf(kvNetlistFile.second);
257 m_netlistsByName[kvNetlistFile.first] = pNetlistFile;
260 for (
const auto& kvLayerDirectoryRecord : message.layersbyname())
262 auto pLayerDirectory = std::make_shared<LayerDirectory>(std::filesystem::path(kvLayerDirectoryRecord.second.path()));
263 pLayerDirectory->from_protobuf(kvLayerDirectoryRecord.second);
264 m_layersByName[kvLayerDirectoryRecord.first] = pLayerDirectory;
268 bool StepDirectory::ParseNetlistFiles(std::filesystem::path netlistsPath)
270 loginfo(
"Parsing netlist files...");
272 std::size_t netListDirectoriesFound = 0;
274 if (std::filesystem::exists(netlistsPath))
276 if (std::filesystem::is_directory(netlistsPath))
279 for (
auto& d : std::filesystem::directory_iterator(netlistsPath))
281 if (std::filesystem::is_directory(d))
283 netListDirectoriesFound++;
285 auto pNetlist = std::make_shared<NetlistFile>(d.path());
286 if (pNetlist->Parse())
288 m_netlistsByName[pNetlist->GetName()] = pNetlist;
293 logerror(
"Failed to parse netlist directory: " + pNetlist->GetName());
300 if (netListDirectoriesFound == 0)
302 logwarn(
"No netlist directories found");
304 else if (netListDirectoriesFound == m_netlistsByName.size())
306 loginfo(
"netlist directories parsed successfully");
312 const ComponentsFile* StepDirectory::GetTopComponentsFile()
const
314 auto findIt = m_layersByName.find(ComponentsFile::TOP_COMPONENTS_LAYER_NAME);
315 if (findIt != m_layersByName.end())
317 return &(findIt->second->GetComponentsFile());
325 const ComponentsFile* StepDirectory::GetBottomComponentsFile()
const
327 auto findIt = m_layersByName.find(ComponentsFile::BOTTOM_COMPONENTS_LAYER_NAME);
328 if (findIt != m_layersByName.end())
330 return &(findIt->second->GetComponentsFile());