Skip to content

Commit 668fa69

Browse files
vloncarjmduarte
andauthored
print_vivado_report function for nicer reports (#730)
* print_vivado_report function for fancier reports * Fancy reports (#51) * fix uram divide by 0 * add test * fix parsing of vsynth in 2020.1; add test * Update test_report.py * exclude pregenerated reports --------- Co-authored-by: Javier Duarte <[email protected]>
1 parent 6d8e4ca commit 668fa69

File tree

8 files changed

+1745
-51
lines changed

8 files changed

+1745
-51
lines changed

.pre-commit-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
exclude: ^hls4ml\/templates\/(vivado|quartus)\/(ap_types|ac_types)\/
1+
exclude: (^hls4ml\/templates\/(vivado|quartus)\/(ap_types|ac_types)\/|^test/pytest/test_report/)
22

33
repos:
44
- repo: https://github.com/psf/black

hls4ml/report/__init__.py

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
from __future__ import absolute_import
2-
3-
from hls4ml.report.vivado_report import read_vivado_report
4-
from hls4ml.report.vivado_report import parse_vivado_report
5-
6-
from hls4ml.report.quartus_report import read_quartus_report
7-
from hls4ml.report.quartus_report import parse_quartus_report
1+
from hls4ml.report.quartus_report import parse_quartus_report # noqa: F401
2+
from hls4ml.report.quartus_report import read_quartus_report # noqa: F401
3+
from hls4ml.report.vivado_report import parse_vivado_report # noqa: F401
4+
from hls4ml.report.vivado_report import print_vivado_report # noqa: F401
5+
from hls4ml.report.vivado_report import read_vivado_report # noqa: F401

hls4ml/report/vivado_report.py

Lines changed: 395 additions & 43 deletions
Large diffs are not rendered by default.

test/pytest/test_report.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import os
2+
import shutil
3+
from pathlib import Path
4+
5+
import pytest
6+
from tensorflow.keras.layers import Dense
7+
from tensorflow.keras.models import Sequential
8+
9+
import hls4ml
10+
11+
test_root_path = Path(__file__).parent
12+
13+
14+
@pytest.mark.parametrize('backend', ['Vivado'])
15+
def test_report(backend, capsys):
16+
model = Sequential()
17+
model.add(Dense(5, input_shape=(16,), name='fc1', activation='relu'))
18+
19+
config = hls4ml.utils.config_from_keras_model(model, granularity='model')
20+
21+
output_dir = str(test_root_path / f'hls4mlprj_report_{backend}')
22+
23+
hls_model = hls4ml.converters.convert_from_keras_model(
24+
model, io_type='io_stream', hls_config=config, output_dir=output_dir, part='xc7z020clg400-1', backend=backend
25+
)
26+
hls_model.write()
27+
28+
# to actually generate the reports (using Vivado 2020.1)
29+
# hls_model.build(synth=True, vsynth=True)
30+
31+
# copy pregenerated reports
32+
os.makedirs(f'hls4mlprj_report_{backend}/myproject_prj/solution1/syn/report', exist_ok=True)
33+
shutil.copy('test_report/vivado_hls.app', f'{output_dir}/myproject_prj/vivado_hls.app')
34+
shutil.copy('test_report/myproject_csynth.rpt', f'{output_dir}/myproject_prj/solution1/syn/report/myproject_csynth.rpt')
35+
shutil.copy('test_report/myproject_csynth.xml', f'{output_dir}/myproject_prj/solution1/syn/report/myproject_csynth.xml')
36+
shutil.copy('test_report/vivado_synth.rpt', f'{output_dir}/vivado_synth.rpt')
37+
38+
report = hls4ml.report.parse_vivado_report(output_dir) # or report = hls_model.build(...)
39+
40+
capsys.readouterr() # capture to clear
41+
hls4ml.report.print_vivado_report(report)
42+
captured = capsys.readouterr() # capture again to test
43+
44+
assert (
45+
captured.out
46+
== '\n'
47+
+ '======================================================\n'
48+
+ '== C Synthesis report\n'
49+
+ '======================================================\n\n'
50+
+ ' - Performance estimates:\n'
51+
+ ' Best-case latency: 10 (50.0 ns)\n'
52+
+ ' Worst-case latency: 10 (50.0 ns)\n'
53+
+ ' Interval Min: 8\n'
54+
+ ' Interval Max: 8\n'
55+
+ ' Estimated Clock Period: 4.049\n\n'
56+
+ ' - Resource estimates:\n'
57+
+ ' BRAM_18K: 0 / 280 (0.0%)\n'
58+
+ ' DSP48E: 73 / 220 (33.2%)\n'
59+
+ ' FF: 7969 / 106400 (7.5%)\n'
60+
+ ' LUT: 2532 / 53200 (4.8%)\n'
61+
+ ' URAM: N/A\n\n'
62+
+ '======================================================\n'
63+
+ '== Vivado Synthesis report\n'
64+
+ '======================================================\n\n'
65+
+ ' - Resource utilization:\n'
66+
+ ' BRAM_18K: 0\n'
67+
+ ' DSP48E: 66\n'
68+
+ ' FF: 2428\n'
69+
+ ' LUT: 1526\n'
70+
+ ' URAM: N/A\n\n'
71+
)
Lines changed: 196 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
2+
3+
================================================================
4+
== Vivado HLS Report for 'myproject'
5+
================================================================
6+
* Date: Sat Mar 18 22:59:37 2023
7+
8+
* Version: 2020.1 (Build 2897737 on Wed May 27 20:21:37 MDT 2020)
9+
* Project: myproject_prj
10+
* Solution: solution1
11+
* Product family: zynq
12+
* Target device: xc7z020-clg400-1
13+
14+
15+
================================================================
16+
== Performance Estimates
17+
================================================================
18+
+ Timing:
19+
* Summary:
20+
+--------+---------+----------+------------+
21+
| Clock | Target | Estimated| Uncertainty|
22+
+--------+---------+----------+------------+
23+
|ap_clk | 5.00 ns | 4.049 ns | 0.62 ns |
24+
+--------+---------+----------+------------+
25+
26+
+ Latency:
27+
* Summary:
28+
+---------+---------+-----------+-----------+-----+-----+----------+
29+
| Latency (cycles) | Latency (absolute) | Interval | Pipeline |
30+
| min | max | min | max | min | max | Type |
31+
+---------+---------+-----------+-----------+-----+-----+----------+
32+
| 10| 10| 50.000 ns | 50.000 ns | 8| 8| dataflow |
33+
+---------+---------+-----------+-----------+-----+-----+----------+
34+
35+
+ Detail:
36+
* Instance:
37+
+-----------------------------------------------------+----------------------------------------------------+---------+---------+-----------+-----------+-----+-----+----------+
38+
| | | Latency (cycles) | Latency (absolute) | Interval | Pipeline |
39+
| Instance | Module | min | max | min | max | min | max | Type |
40+
+-----------------------------------------------------+----------------------------------------------------+---------+---------+-----------+-----------+-----+-----+----------+
41+
|dense_array_array_ap_fixed_16_6_5_3_0_5u_config2_U0 |dense_array_array_ap_fixed_16_6_5_3_0_5u_config2_s | 7| 7| 35.000 ns | 35.000 ns | 7| 7| none |
42+
|relu_array_array_ap_fixed_5u_relu_config3_U0 |relu_array_array_ap_fixed_5u_relu_config3_s | 2| 2| 10.000 ns | 10.000 ns | 1| 1| function |
43+
+-----------------------------------------------------+----------------------------------------------------+---------+---------+-----------+-----------+-----+-----+----------+
44+
45+
* Loop:
46+
N/A
47+
48+
49+
50+
================================================================
51+
== Utilization Estimates
52+
================================================================
53+
* Summary:
54+
+-----------------+---------+-------+--------+-------+-----+
55+
| Name | BRAM_18K| DSP48E| FF | LUT | URAM|
56+
+-----------------+---------+-------+--------+-------+-----+
57+
|DSP | -| -| -| -| -|
58+
|Expression | -| -| 0| 2| -|
59+
|FIFO | 0| -| 25| 140| -|
60+
|Instance | 0| 73| 7944| 2390| -|
61+
|Memory | -| -| -| -| -|
62+
|Multiplexer | -| -| -| -| -|
63+
|Register | -| -| -| -| -|
64+
+-----------------+---------+-------+--------+-------+-----+
65+
|Total | 0| 73| 7969| 2532| 0|
66+
+-----------------+---------+-------+--------+-------+-----+
67+
|Available | 280| 220| 106400| 53200| 0|
68+
+-----------------+---------+-------+--------+-------+-----+
69+
|Utilization (%) | 0| 33| 7| 4| 0|
70+
+-----------------+---------+-------+--------+-------+-----+
71+
72+
+ Detail:
73+
* Instance:
74+
+-----------------------------------------------------+----------------------------------------------------+---------+-------+------+------+-----+
75+
| Instance | Module | BRAM_18K| DSP48E| FF | LUT | URAM|
76+
+-----------------------------------------------------+----------------------------------------------------+---------+-------+------+------+-----+
77+
|dense_array_array_ap_fixed_16_6_5_3_0_5u_config2_U0 |dense_array_array_ap_fixed_16_6_5_3_0_5u_config2_s | 0| 73| 7860| 2134| 0|
78+
|relu_array_array_ap_fixed_5u_relu_config3_U0 |relu_array_array_ap_fixed_5u_relu_config3_s | 0| 0| 84| 256| 0|
79+
+-----------------------------------------------------+----------------------------------------------------+---------+-------+------+------+-----+
80+
|Total | | 0| 73| 7944| 2390| 0|
81+
+-----------------------------------------------------+----------------------------------------------------+---------+-------+------+------+-----+
82+
83+
* DSP48E:
84+
N/A
85+
86+
* Memory:
87+
N/A
88+
89+
* FIFO:
90+
+-------------------------+---------+---+----+-----+------+-----+---------+
91+
| Name | BRAM_18K| FF| LUT| URAM| Depth| Bits| Size:D*B|
92+
+-------------------------+---------+---+----+-----+------+-----+---------+
93+
|layer2_out_V_data_0_V_U | 0| 5| 0| -| 1| 16| 16|
94+
|layer2_out_V_data_1_V_U | 0| 5| 0| -| 1| 16| 16|
95+
|layer2_out_V_data_2_V_U | 0| 5| 0| -| 1| 16| 16|
96+
|layer2_out_V_data_3_V_U | 0| 5| 0| -| 1| 16| 16|
97+
|layer2_out_V_data_4_V_U | 0| 5| 0| -| 1| 16| 16|
98+
+-------------------------+---------+---+----+-----+------+-----+---------+
99+
|Total | 0| 25| 0| 0| 5| 80| 80|
100+
+-------------------------+---------+---+----+-----+------+-----+---------+
101+
102+
* Expression:
103+
+--------------+----------+-------+---+----+------------+------------+
104+
| Variable Name| Operation| DSP48E| FF| LUT| Bitwidth P0| Bitwidth P1|
105+
+--------------+----------+-------+---+----+------------+------------+
106+
|ap_idle | and | 0| 0| 2| 1| 1|
107+
+--------------+----------+-------+---+----+------------+------------+
108+
|Total | | 0| 0| 2| 1| 1|
109+
+--------------+----------+-------+---+----+------------+------------+
110+
111+
* Multiplexer:
112+
N/A
113+
114+
* Register:
115+
N/A
116+
117+
118+
119+
================================================================
120+
== Interface
121+
================================================================
122+
* Summary:
123+
+------------------------------+-----+-----+------------+-----------------------+--------------+
124+
| RTL Ports | Dir | Bits| Protocol | Source Object | C Type |
125+
+------------------------------+-----+-----+------------+-----------------------+--------------+
126+
|fc1_input_V_data_0_V_TDATA | in | 16| axis | fc1_input_V_data_0_V | pointer |
127+
|fc1_input_V_data_0_V_TVALID | in | 1| axis | fc1_input_V_data_0_V | pointer |
128+
|fc1_input_V_data_0_V_TREADY | out | 1| axis | fc1_input_V_data_0_V | pointer |
129+
|fc1_input_V_data_1_V_TDATA | in | 16| axis | fc1_input_V_data_1_V | pointer |
130+
|fc1_input_V_data_1_V_TVALID | in | 1| axis | fc1_input_V_data_1_V | pointer |
131+
|fc1_input_V_data_1_V_TREADY | out | 1| axis | fc1_input_V_data_1_V | pointer |
132+
|fc1_input_V_data_2_V_TDATA | in | 16| axis | fc1_input_V_data_2_V | pointer |
133+
|fc1_input_V_data_2_V_TVALID | in | 1| axis | fc1_input_V_data_2_V | pointer |
134+
|fc1_input_V_data_2_V_TREADY | out | 1| axis | fc1_input_V_data_2_V | pointer |
135+
|fc1_input_V_data_3_V_TDATA | in | 16| axis | fc1_input_V_data_3_V | pointer |
136+
|fc1_input_V_data_3_V_TVALID | in | 1| axis | fc1_input_V_data_3_V | pointer |
137+
|fc1_input_V_data_3_V_TREADY | out | 1| axis | fc1_input_V_data_3_V | pointer |
138+
|fc1_input_V_data_4_V_TDATA | in | 16| axis | fc1_input_V_data_4_V | pointer |
139+
|fc1_input_V_data_4_V_TVALID | in | 1| axis | fc1_input_V_data_4_V | pointer |
140+
|fc1_input_V_data_4_V_TREADY | out | 1| axis | fc1_input_V_data_4_V | pointer |
141+
|fc1_input_V_data_5_V_TDATA | in | 16| axis | fc1_input_V_data_5_V | pointer |
142+
|fc1_input_V_data_5_V_TVALID | in | 1| axis | fc1_input_V_data_5_V | pointer |
143+
|fc1_input_V_data_5_V_TREADY | out | 1| axis | fc1_input_V_data_5_V | pointer |
144+
|fc1_input_V_data_6_V_TDATA | in | 16| axis | fc1_input_V_data_6_V | pointer |
145+
|fc1_input_V_data_6_V_TVALID | in | 1| axis | fc1_input_V_data_6_V | pointer |
146+
|fc1_input_V_data_6_V_TREADY | out | 1| axis | fc1_input_V_data_6_V | pointer |
147+
|fc1_input_V_data_7_V_TDATA | in | 16| axis | fc1_input_V_data_7_V | pointer |
148+
|fc1_input_V_data_7_V_TVALID | in | 1| axis | fc1_input_V_data_7_V | pointer |
149+
|fc1_input_V_data_7_V_TREADY | out | 1| axis | fc1_input_V_data_7_V | pointer |
150+
|fc1_input_V_data_8_V_TDATA | in | 16| axis | fc1_input_V_data_8_V | pointer |
151+
|fc1_input_V_data_8_V_TVALID | in | 1| axis | fc1_input_V_data_8_V | pointer |
152+
|fc1_input_V_data_8_V_TREADY | out | 1| axis | fc1_input_V_data_8_V | pointer |
153+
|fc1_input_V_data_9_V_TDATA | in | 16| axis | fc1_input_V_data_9_V | pointer |
154+
|fc1_input_V_data_9_V_TVALID | in | 1| axis | fc1_input_V_data_9_V | pointer |
155+
|fc1_input_V_data_9_V_TREADY | out | 1| axis | fc1_input_V_data_9_V | pointer |
156+
|fc1_input_V_data_10_V_TDATA | in | 16| axis | fc1_input_V_data_10_V | pointer |
157+
|fc1_input_V_data_10_V_TVALID | in | 1| axis | fc1_input_V_data_10_V | pointer |
158+
|fc1_input_V_data_10_V_TREADY | out | 1| axis | fc1_input_V_data_10_V | pointer |
159+
|fc1_input_V_data_11_V_TDATA | in | 16| axis | fc1_input_V_data_11_V | pointer |
160+
|fc1_input_V_data_11_V_TVALID | in | 1| axis | fc1_input_V_data_11_V | pointer |
161+
|fc1_input_V_data_11_V_TREADY | out | 1| axis | fc1_input_V_data_11_V | pointer |
162+
|fc1_input_V_data_12_V_TDATA | in | 16| axis | fc1_input_V_data_12_V | pointer |
163+
|fc1_input_V_data_12_V_TVALID | in | 1| axis | fc1_input_V_data_12_V | pointer |
164+
|fc1_input_V_data_12_V_TREADY | out | 1| axis | fc1_input_V_data_12_V | pointer |
165+
|fc1_input_V_data_13_V_TDATA | in | 16| axis | fc1_input_V_data_13_V | pointer |
166+
|fc1_input_V_data_13_V_TVALID | in | 1| axis | fc1_input_V_data_13_V | pointer |
167+
|fc1_input_V_data_13_V_TREADY | out | 1| axis | fc1_input_V_data_13_V | pointer |
168+
|fc1_input_V_data_14_V_TDATA | in | 16| axis | fc1_input_V_data_14_V | pointer |
169+
|fc1_input_V_data_14_V_TVALID | in | 1| axis | fc1_input_V_data_14_V | pointer |
170+
|fc1_input_V_data_14_V_TREADY | out | 1| axis | fc1_input_V_data_14_V | pointer |
171+
|fc1_input_V_data_15_V_TDATA | in | 16| axis | fc1_input_V_data_15_V | pointer |
172+
|fc1_input_V_data_15_V_TVALID | in | 1| axis | fc1_input_V_data_15_V | pointer |
173+
|fc1_input_V_data_15_V_TREADY | out | 1| axis | fc1_input_V_data_15_V | pointer |
174+
|layer3_out_V_data_0_V_TDATA | out | 16| axis | layer3_out_V_data_0_V | pointer |
175+
|layer3_out_V_data_0_V_TVALID | out | 1| axis | layer3_out_V_data_0_V | pointer |
176+
|layer3_out_V_data_0_V_TREADY | in | 1| axis | layer3_out_V_data_0_V | pointer |
177+
|layer3_out_V_data_1_V_TDATA | out | 16| axis | layer3_out_V_data_1_V | pointer |
178+
|layer3_out_V_data_1_V_TVALID | out | 1| axis | layer3_out_V_data_1_V | pointer |
179+
|layer3_out_V_data_1_V_TREADY | in | 1| axis | layer3_out_V_data_1_V | pointer |
180+
|layer3_out_V_data_2_V_TDATA | out | 16| axis | layer3_out_V_data_2_V | pointer |
181+
|layer3_out_V_data_2_V_TVALID | out | 1| axis | layer3_out_V_data_2_V | pointer |
182+
|layer3_out_V_data_2_V_TREADY | in | 1| axis | layer3_out_V_data_2_V | pointer |
183+
|layer3_out_V_data_3_V_TDATA | out | 16| axis | layer3_out_V_data_3_V | pointer |
184+
|layer3_out_V_data_3_V_TVALID | out | 1| axis | layer3_out_V_data_3_V | pointer |
185+
|layer3_out_V_data_3_V_TREADY | in | 1| axis | layer3_out_V_data_3_V | pointer |
186+
|layer3_out_V_data_4_V_TDATA | out | 16| axis | layer3_out_V_data_4_V | pointer |
187+
|layer3_out_V_data_4_V_TVALID | out | 1| axis | layer3_out_V_data_4_V | pointer |
188+
|layer3_out_V_data_4_V_TREADY | in | 1| axis | layer3_out_V_data_4_V | pointer |
189+
|ap_clk | in | 1| ap_ctrl_hs | myproject | return value |
190+
|ap_rst_n | in | 1| ap_ctrl_hs | myproject | return value |
191+
|ap_start | in | 1| ap_ctrl_hs | myproject | return value |
192+
|ap_done | out | 1| ap_ctrl_hs | myproject | return value |
193+
|ap_ready | out | 1| ap_ctrl_hs | myproject | return value |
194+
|ap_idle | out | 1| ap_ctrl_hs | myproject | return value |
195+
+------------------------------+-----+-----+------------+-----------------------+--------------+
196+

0 commit comments

Comments
 (0)