| /* |
| Copyright 2019 Alain Dargelas |
| |
| Licensed under the Apache License, Version 2.0 (the "License"); |
| you may not use this file except in compliance with the License. |
| You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| */ |
| |
| /* |
| * File: DesignElaboration.h |
| * Author: alain |
| * |
| * Created on July 12, 2017, 8:55 PM |
| */ |
| |
| #ifndef DESIGNELABORATION_H |
| #define DESIGNELABORATION_H |
| |
| #include "DesignCompile/ElaborationStep.h" |
| #include "Expression/ExprBuilder.h" |
| |
| namespace SURELOG { |
| |
| class DesignElaboration : public ElaborationStep { |
| public: |
| DesignElaboration(CompileDesign* compileDesign); |
| DesignElaboration(const DesignElaboration& orig) = delete; |
| virtual ~DesignElaboration(); |
| |
| bool createModuleAndPackageDefinitions(); |
| |
| bool elaborate(); |
| |
| private: |
| bool createBuiltinPrimitives_(); |
| bool setupConfigurations_(); |
| bool identifyTopModules_(); |
| bool elaborateAllModules_(bool onlyTopLevel); |
| void reportElaboration_(); |
| bool elaborateModule_(std::string moduleName, FileContent* fileContent, |
| bool onlyTopLevel); |
| void checkElaboration_(); |
| void collectParams_(std::vector<std::string>& params, FileContent* fC, |
| NodeId nodeId, ModuleInstance* instance, |
| NodeId parentParamOverride); |
| void elaborateInstance_(FileContent* fC, NodeId nodeId, |
| NodeId parentParamOverride, |
| ModuleInstanceFactory* factory, |
| ModuleInstance* parent, Config* config); |
| void recurseInstanceLoop_(std::vector<int>& from, std::vector<int>& to, |
| std::vector<int>& indexes, unsigned int pos, |
| DesignComponent* def, FileContent* fC, |
| NodeId subInstanceId, NodeId paramOverride, |
| ModuleInstanceFactory* factory, |
| ModuleInstance* parent, Config* config, |
| std::string instanceName, std::string modName, |
| std::vector<ModuleInstance*>& allSubInstances); |
| void recurseBuildInstanceClause_(std::string parentPath, Config* config, |
| std::set<Config*>& stack); |
| void reduceUnnamedBlocks_(); |
| void checkConfigurations_(); |
| Config* getInstConfig(std::string name); |
| Config* getCellConfig(std::string name); |
| std::vector<std::pair<std::string, FileContent*>> m_topLevelModules; |
| std::set<std::string> m_uniqueTopLevelModules; |
| ExprBuilder m_exprBuilder; |
| ModuleDefinitionFactory* m_moduleDefFactory; |
| ModuleInstanceFactory* m_moduleInstFactory; |
| std::set<std::string> m_toplevelConfigModules; |
| std::map<std::string, Config> m_instConfig; |
| std::map<std::string, Config> m_cellConfig; |
| std::map<std::string, UseClause> m_instUseClause; |
| std::map<std::string, UseClause> m_cellUseClause; |
| }; |
| |
| }; // namespace SURELOG |
| |
| #endif /* DESIGNELABORATION_H */ |