common modules: eos-s3: add analysis stage

Signed-off-by: Paweł Czarnecki <pczarnecki@antmicro.com>
This commit is contained in:
Paweł Czarnecki 2022-06-17 12:03:35 +02:00 committed by Unai Martinez-Corral
parent 6dafe0b6d1
commit e88f714877
4 changed files with 133 additions and 3 deletions

View File

@ -8,7 +8,8 @@
"eos-s3/btn_counter/btn_counter.v" "eos-s3/btn_counter/btn_counter.v"
], ],
"synth_log": "synth.log", "synth_log": "synth.log",
"pack_log": "pack.log" "pack_log": "pack.log",
"analysis_log": "analysis.log"
}, },
"EOS3FF512-PDN64": { "EOS3FF512-PDN64": {
"default_target": "bitstream", "default_target": "bitstream",
@ -18,8 +19,7 @@
"sdc-in": "eos-s3/btn_counter/dummy.sdc" "sdc-in": "eos-s3/btn_counter/dummy.sdc"
}, },
"values": { "values": {
"part": "ql-eos-s3", "part": "ql-eos-s3"
"package": "PD64"
} }
} }
} }

View File

@ -174,6 +174,8 @@ def vpr(mode: str, vprargs: VprArgs, cwd=None):
modeargs = ['--place'] modeargs = ['--place']
elif mode == 'route': elif mode == 'route':
modeargs = ['--route'] modeargs = ['--route']
elif mode == 'analysis':
modeargs = ['--analysis']
return sub(*([ return sub(*([
'vpr', 'vpr',

View File

@ -0,0 +1,88 @@
#!/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 shutil import move as sh_mv
from f4pga.common import *
from f4pga.module import Module, ModuleContext
def analysis_merged_post_implementation_file(ctx: ModuleContext):
return str(Path(ctx.takes.eblif).with_suffix('')) + '_merged_post_implementation.v'
def analysis_post_implementation_file(ctx: ModuleContext):
return str(Path(ctx.takes.eblif).with_suffix('')) + '_post_synthesis.v'
class analysisModule(Module):
def map_io(self, ctx: ModuleContext):
return {
'merged_post_implementation_v': analysis_merged_post_implementation_file(ctx),
'post_implementation_v': analysis_post_implementation_file(ctx)
}
def execute(self, ctx: ModuleContext):
build_dir = str(Path(ctx.takes.eblif).parent)
vpr_options = []
if ctx.values.vpr_options:
vpr_options = options_dict_to_list(ctx.values.vpr_options)
yield 'Analysis with VPR...'
vpr(
'analysis',
VprArgs(
ctx.share,
ctx.takes.eblif,
ctx.values,
sdc_file=ctx.takes.sdc
),
cwd=build_dir
)
if ctx.is_output_explicit('merged_post_implementation_v'):
sh_mv(analysis_merged_post_implementation_file(ctx), ctx.outputs.merged_post_implementation_v)
if ctx.is_output_explicit('post_implementation_v'):
sh_mv(analysis_post_implementation_file(ctx), 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

View File

@ -11,6 +11,7 @@
"iomux_binary": "common:generic_script_wrapper", "iomux_binary": "common:generic_script_wrapper",
"place": "common:place", "place": "common:place",
"route": "common:route", "route": "common:route",
"analysis": "common:analysis",
"fasm": "common:fasm", "fasm": "common:fasm",
"bitstream": "common:generic_script_wrapper" "bitstream": "common:generic_script_wrapper"
}, },
@ -270,6 +271,45 @@
} }
} }
}, },
"analysis": {
"values": {
"device": "ql-eos-s3",
"device_alt": "ql-eos-s3_wlcsp",
"pinmap": "${shareDir}/arch/ql-eos-s3_wlcsp/pinmap_PD64.csv",
"arch_def": "${shareDir}/arch/ql-eos-s3_wlcsp/arch.timing.xml",
"rr_graph_lookahead_bin": "${shareDir}/arch/ql-eos-s3_wlcsp/rr_graph_ql-eos-s3_wlcsp.lookahead.bin",
"rr_graph_real_bin": "${shareDir}/arch/ql-eos-s3_wlcsp/rr_graph_ql-eos-s3_wlcsp.rr_graph.real.bin",
"vpr_place_delay": "${shareDir}/arch/ql-eos-s3_wlcsp/rr_graph_ql-eos-s3_wlcsp.place_delay.bin",
"vpr_grid_layout_name": "ql-eos-s3",
"vpr_options": {
"gen_post_synthesis_netlist": "on",
"gen_post_implementation_merged_netlist": "on",
"post_synth_netlist_unconn_inputs": "nets",
"post_synth_netlist_unconn_outputs": "nets",
"verify_file_digests": "off",
"max_router_iterations": 500,
"routing_failure_predictor": "off",
"router_high_fanout_threshold": -1,
"constant_net_method": "route",
"route_chan_width": 100,
"clock_modeling": "route",
"place_delay_model": "delta_override",
"router_lookahead": "extended_map",
"check_route": "quick",
"strict_checks": "off",
"allow_dangling_combinational_nodes": "on",
"disable_errors": "check_unbuffered_edges:check_route",
"congested_routing_iteration_threshold": "0.8",
"incremental_reroute_delay_ripup": "off",
"base_cost_type": "delay_normalized_length_bounded",
"bb_factor": "10",
"initial_pres_fac": "4.0",
"check_rr_graph": "off",
"pack_high_fanout_threshold": "PB-lOGIC:18",
"suppress_warnings": "${noisyWarnings},sum_pin_class:check_unbuffered_edges:load_rr_indexed_data_T_values:check_rr_node:trans_per_R:check_route:set_rr_graph_tool_comment "
}
}
},
"bitstream": { "bitstream": {
"params": { "params": {
"stage_name": "bitstream", "stage_name": "bitstream",