| #!/usr/bin/env python3 | |
| # -*- coding: utf-8 -*- | |
| # | |
| # Copyright (C) 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 | |
| from pathlib import Path | |
| from f4pga.flows.tools.vpr import vpr_specific_values, vpr, VprArgs | |
| from f4pga.flows.module import Module, ModuleContext | |
| class analysisModule(Module): | |
| def map_io(self, ctx: ModuleContext): | |
| return { | |
| "merged_post_implementation_v": p_analysis_merged_post_implementation_file(ctx), | |
| "post_implementation_v": p_analysis_post_implementation_file(ctx), | |
| } | |
| def execute(self, ctx: ModuleContext): | |
| build_dir = Path(ctx.takes.eblif).parent | |
| yield "Analysis with VPR..." | |
| vpr( | |
| "analysis", | |
| VprArgs( | |
| share=ctx.share, | |
| eblif=ctx.takes.eblif, | |
| arch_def=ctx.values.arch_def, | |
| lookahead=ctx.values.rr_graph_lookahead_bin, | |
| rr_graph=ctx.values.rr_graph_real_bin, | |
| place_delay=ctx.values.vpr_place_delay, | |
| device_name=ctx.values.vpr_grid_layout_name, | |
| vpr_options=ctx.values.vpr_options if ctx.values.vpr_options else {}, | |
| sdc_file=ctx.takes.sdc, | |
| ), | |
| cwd=build_dir, | |
| ) | |
| if ctx.is_output_explicit("merged_post_implementation_v"): | |
| Path(p_analysis_merged_post_implementation_file(ctx)).rename(ctx.outputs.merged_post_implementation_v) | |
| if ctx.is_output_explicit("post_implementation_v"): | |
| Path(p_analysis_post_implementation_file(ctx)).rename(ctx.outputs.post_implementation_v) | |
| yield "Saving log..." | |
| save_vpr_log("analysis.log", build_dir=build_dir) | |
| def __init__(self, _): | |
| self.name = "analysis" | |
| self.no_of_phases = 2 | |
| self.takes = ["eblif", "route", "sdc?"] | |
| self.produces = ["merged_post_implementation_v", "post_implementation_v", "analysis_log"] | |
| self.values = ["device", "vpr_options?"] + vpr_specific_values | |
| ModuleClass = analysisModule | |
| def p_analysis_merged_post_implementation_file(ctx: ModuleContext): | |
| return str(Path(ctx.takes.eblif).with_suffix("")) + "_merged_post_implementation.v" | |
| def p_analysis_post_implementation_file(ctx: ModuleContext): | |
| return str(Path(ctx.takes.eblif).with_suffix("")) + "_post_synthesis.v" |