| /* |
| * Copyright 2020-2022 F4PGA Authors |
| * |
| * 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. |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| * |
| */ |
| |
| #include "uhdmcommonfrontend.h" |
| |
| namespace UHDM |
| { |
| extern void visit_object(vpiHandle obj_h, int indent, const char *relation, std::set<const BaseClass *> *visited, std::ostream &out, |
| bool shallowVisit = false); |
| } |
| |
| namespace systemverilog_plugin |
| { |
| |
| using namespace ::Yosys; |
| |
| struct UhdmAstFrontend : public UhdmCommonFrontend { |
| UhdmAstFrontend() : UhdmCommonFrontend("uhdm", "read UHDM file") {} |
| void help() override |
| { |
| // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| |
| log("\n"); |
| log(" read_uhdm [options] [filename]\n"); |
| log("\n"); |
| log("Load design from a UHDM file into the current design\n"); |
| log("\n"); |
| this->print_read_options(); |
| } |
| AST::AstNode *parse(std::string filename) override |
| { |
| UHDM::Serializer serializer; |
| |
| std::vector<vpiHandle> restoredDesigns = serializer.Restore(filename); |
| UHDM::SynthSubset *synthSubset = |
| make_new_object_with_optional_extra_true_arg<UHDM::SynthSubset>(&serializer, this->shared.nonSynthesizableObjects, false); |
| synthSubset->listenDesigns(restoredDesigns); |
| delete synthSubset; |
| if (this->shared.debug_flag || !this->report_directory.empty()) { |
| for (auto design : restoredDesigns) { |
| std::ofstream null_stream; |
| UHDM::visit_object(design, 1, "", &this->shared.report.unhandled, this->shared.debug_flag ? std::cout : null_stream); |
| } |
| } |
| UhdmAst uhdm_ast(this->shared); |
| AST::AstNode *current_ast = uhdm_ast.visit_designs(restoredDesigns); |
| if (!this->report_directory.empty()) { |
| this->shared.report.write(this->report_directory); |
| } |
| for (auto design : restoredDesigns) |
| vpi_release_handle(design); |
| |
| serializer.Purge(); |
| return current_ast; |
| } |
| void call_log_header(RTLIL::Design *design) override { log_header(design, "Executing UHDM frontend.\n"); } |
| } UhdmAstFrontend; |
| |
| } // namespace systemverilog_plugin |