Coverage for pyEDAA / OutputFilter / Xilinx / RouteDesign.py: 100%
227 statements
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-23 22:13 +0000
« prev ^ index » next coverage.py v7.13.1, created at 2026-01-23 22:13 +0000
1# ==================================================================================================================== #
2# _____ ____ _ _ ___ _ _ _____ _ _ _ #
3# _ __ _ _| ____| _ \ / \ / \ / _ \ _ _| |_ _ __ _ _| |_| ___(_) | |_ ___ _ __ #
4# | '_ \| | | | _| | | | |/ _ \ / _ \ | | | | | | | __| '_ \| | | | __| |_ | | | __/ _ \ '__| #
5# | |_) | |_| | |___| |_| / ___ \ / ___ \ | |_| | |_| | |_| |_) | |_| | |_| _| | | | || __/ | #
6# | .__/ \__, |_____|____/_/ \_\/_/ \_(_)___/ \__,_|\__| .__/ \__,_|\__|_| |_|_|\__\___|_| #
7# |_| |___/ |_| #
8# ==================================================================================================================== #
9# Authors: #
10# Patrick Lehmann #
11# #
12# License: #
13# ==================================================================================================================== #
14# Copyright 2025-2026 Electronic Design Automation Abstraction (EDA²) #
15# #
16# Licensed under the Apache License, Version 2.0 (the "License"); #
17# you may not use this file except in compliance with the License. #
18# You may obtain a copy of the License at #
19# #
20# http://www.apache.org/licenses/LICENSE-2.0 #
21# #
22# Unless required by applicable law or agreed to in writing, software #
23# distributed under the License is distributed on an "AS IS" BASIS, #
24# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #
25# See the License for the specific language governing permissions and #
26# limitations under the License. #
27# #
28# SPDX-License-Identifier: Apache-2.0 #
29# ==================================================================================================================== #
30#
31"""A filtering anc classification processor for AMD/Xilinx Vivado Synthesis outputs."""
32from re import compile, Pattern
33from typing import Generator, ClassVar, List, Type, Dict, Tuple
35from pyTooling.Decorators import export
36from pyTooling.Warning import WarningCollector
38from pyEDAA.OutputFilter.Xilinx import Line, VivadoMessage, LineKind
39from pyEDAA.OutputFilter.Xilinx.Common2 import TaskWithPhases, Phase, SubPhase, UnknownSubPhase, PhaseWithChildren, \
40 SubPhaseWithChildren
41from pyEDAA.OutputFilter.Xilinx.Common2 import MAJOR, MAJOR_MINOR, MAJOR_MINOR_MICRO
42from pyEDAA.OutputFilter.Xilinx.PlaceDesign import SubSubPhase
45@export
46class Phase_BuildRTDesign(Phase):
47 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR} Build RT Design")
48 _FINISH: ClassVar[str] = "Phase {phaseIndex} Build RT Design | Checksum:"
49 _TIME: ClassVar[str] = "Time (s):"
52@export
53class SubPhase_CreateTimer(SubPhase):
54 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Create Timer")
55 _FINISH: ClassVar[str] = "Phase {phaseIndex}.{subPhaseIndex} Create Timer | Checksum:"
56 _TIME: ClassVar[str] = "Time (s):"
59@export
60class SubPhase_FixTopologyConstraints(SubPhase):
61 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Fix Topology Constraints")
62 _FINISH: ClassVar[str] = "Phase {phaseIndex}.{subPhaseIndex} Fix Topology Constraints | Checksum:"
63 _TIME: ClassVar[str] = "Time (s):"
66@export
67class SubPhase_PreRouteCleanup(SubPhase):
68 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Pre Route Cleanup")
69 _FINISH: ClassVar[str] = "Phase {phaseIndex}.{subPhaseIndex} Pre Route Cleanup | Checksum:"
70 _TIME: ClassVar[str] = "Time (s):"
73@export
74class SubPhase_GlobalClockNetRouting(SubPhase):
75 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Global Clock Net Routing")
76 _FINISH: ClassVar[str] = "Phase {phaseIndex}.{subPhaseIndex} Global Clock Net Routing | Checksum:"
77 _TIME: ClassVar[str] = "Time (s):"
80@export
81class SubPhase_UpdateTiming(SubPhase):
82 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Update Timing")
83 _FINISH: ClassVar[str] = "Phase {phaseIndex}.{subPhaseIndex} Update Timing | Checksum:"
84 _TIME: ClassVar[str] = "Time (s):"
87@export
88class SubPhase_SoftConstraintPins_FastBudgeting(SubPhase):
89 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Soft Constraint Pins - Fast Budgeting")
90 _FINISH: ClassVar[str] = "Phase {phaseIndex}.{subPhaseIndex} Soft Constraint Pins - Fast Budgeting | Checksum:"
91 _TIME: ClassVar[str] = "Time (s):"
94@export
95class SubSubPhase_UpdateTiming(SubSubPhase):
96 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR_MICRO} Update Timing")
97 _FINISH: ClassVar[str] = "Phase {phaseIndex}.{subPhaseIndex}.{subSubPhaseIndex} Update Timing | Checksum:"
98 _TIME: ClassVar[str] = "Time (s):"
101@export
102class SubPhase_UpdateTimingForBusSkew(SubPhaseWithChildren):
103 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Update Timing for Bus Skew")
104 _FINISH: ClassVar[str] = "Phase {phaseIndex}.{subPhaseIndex} Update Timing for Bus Skew | Checksum:"
105 _TIME: ClassVar[str] = "Time (s):"
107 _PARSERS: ClassVar[Tuple[Type[SubSubPhase], ...]] = (
108 SubSubPhase_UpdateTiming,
109 )
112@export
113class Phase_RouterInitialization(PhaseWithChildren):
114 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR} Router Initialization")
115 _FINISH: ClassVar[str] = "Phase {phaseIndex} Router Initialization | Checksum:"
116 _TIME: ClassVar[str] = "Time (s):"
118 _PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = (
119 SubPhase_CreateTimer,
120 SubPhase_FixTopologyConstraints,
121 SubPhase_PreRouteCleanup,
122 SubPhase_GlobalClockNetRouting,
123 SubPhase_UpdateTiming,
124 SubPhase_UpdateTimingForBusSkew,
125 SubPhase_SoftConstraintPins_FastBudgeting
126 )
129@export
130class SubPhase_GlobalRouting(SubPhase):
131 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Global Routing")
132 _FINISH: ClassVar[str] = "Phase {phaseIndex}.{subPhaseIndex} Global Routing | Checksum:"
133 _TIME: ClassVar[str] = "Time (s):"
136@export
137class SubPhase_InitialNetRouting(SubPhase):
138 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Initial Net Routing")
139 _FINISH: ClassVar[str] = "Phase {phaseIndex}.{subPhaseIndex} Initial Net Routing | Checksum:"
140 _TIME: ClassVar[str] = "Time (s):"
143@export
144class Phase_Initial_Routing(PhaseWithChildren):
145 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR} Initial Routing")
146 _FINISH: ClassVar[str] = "Phase {phaseIndex} Initial Routing | Checksum:"
147 _TIME: ClassVar[str] = "Time (s):"
149 _PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = (
150 SubPhase_GlobalRouting,
151 SubPhase_InitialNetRouting
152 )
155@export
156class Phase_GlobalRouting(Phase):
157 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR} Global Routing")
158 _FINISH: ClassVar[str] = "Phase {phaseIndex} Global Routing | Checksum:"
159 _TIME: ClassVar[str] = "Time (s):"
162@export
163class SubPhase_GlobalIteration0(SubPhase):
164 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Global Iteration 0")
165 _FINISH: ClassVar[str] = "Phase {phaseIndex}.{subPhaseIndex} Global Iteration 0 | Checksum:"
166 _TIME: ClassVar[str] = "Time (s):"
169@export
170class SubPhase_AdditionalIterationForHold(SubPhase):
171 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Additional Iteration for Hold")
172 _FINISH: ClassVar[str] = "Phase {phaseIndex}.{subPhaseIndex} Additional Iteration for Hold | Checksum:"
173 _TIME: ClassVar[str] = "Time (s):"
176@export
177class SubPhase_GlobalIteration1(SubPhase):
178 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Global Iteration 1")
179 _FINISH: ClassVar[str] = "Phase {phaseIndex}.{subPhaseIndex} Global Iteration 1 | Checksum:"
180 _TIME: ClassVar[str] = "Time (s):"
183@export
184class SubPhase_GlobalIteration2(SubPhase):
185 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Global Iteration 2")
186 _FINISH: ClassVar[str] = "Phase {phaseIndex}.{subPhaseIndex} Global Iteration 2 | Checksum:"
187 _TIME: ClassVar[str] = "Time (s):"
190@export
191class Phase_RipUpAndReroute(PhaseWithChildren):
192 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR} Rip-up And Reroute")
193 _FINISH: ClassVar[str] = "Phase {phaseIndex} Rip-up And Reroute | Checksum:"
194 _TIME: ClassVar[str] = "Time (s):"
196 _PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = (
197 SubPhase_GlobalIteration0,
198 SubPhase_AdditionalIterationForHold,
199 SubPhase_GlobalIteration1,
200 SubPhase_GlobalIteration2
201 )
204@export
205class SubPhase_InitialNetRoutingPass(SubPhase):
206 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Initial Net Routing Pass")
207 _FINISH: ClassVar[str] = "Phase {phaseIndex}.{subPhaseIndex} Initial Net Routing Pass | Checksum:"
208 _TIME: ClassVar[str] = "Time (s):"
211@export
212class Phase_InitialRouting(PhaseWithChildren):
213 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR} Initial Routing")
214 _FINISH: ClassVar[str] = "Phase {phaseIndex} Initial Routing | Checksum:"
215 _TIME: ClassVar[str] = "Time (s):"
217 _PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = (
218 SubPhase_InitialNetRoutingPass,
219 SubPhase_GlobalRouting,
220 SubPhase_InitialNetRouting
221 )
224@export
225class SubPhase_DelayCleanUp(SubPhase):
226 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Delay CleanUp")
227 _FINISH: ClassVar[str] = "Phase {phaseIndex}.{subPhaseIndex} Delay CleanUp | Checksum:"
228 _TIME: ClassVar[str] = "Time (s):"
231@export
232class SubPhase_ClockSkewOptimization(SubPhase):
233 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Clock Skew Optimization")
234 _FINISH: ClassVar[str] = "Phase {phaseIndex}.{subPhaseIndex} Clock Skew Optimization | Checksum:"
235 _TIME: ClassVar[str] = "Time (s):"
238@export
239class Phase_DelayAndSkewOptimization(PhaseWithChildren):
240 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR} Delay and Skew Optimization")
241 _FINISH: ClassVar[str] = "Phase {phaseIndex} Delay and Skew Optimization | Checksum:"
242 _TIME: ClassVar[str] = "Time (s):"
244 _PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = (
245 SubPhase_DelayCleanUp,
246 SubPhase_ClockSkewOptimization
247 )
250@export
251class SubPhase_HoldFixIter(SubPhase):
252 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Hold Fix Iter")
253 _FINISH: ClassVar[str] = "Phase {phaseIndex}.{subPhaseIndex} Hold Fix Iter | Checksum:"
254 _TIME: ClassVar[str] = "Time (s):"
257@export
258class Phase_PostHoldFix(PhaseWithChildren):
259 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR} Post Hold Fix")
260 _FINISH: ClassVar[str] = "Phase {phaseIndex} Post Hold Fix | Checksum:"
261 _TIME: ClassVar[str] = "Time (s):"
263 _PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = (
264 SubPhase_HoldFixIter,
265 )
268@export
269class SubPhase_DelayCleanUp(SubPhase):
270 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Delay CleanUp")
271 _FINISH: ClassVar[str] = "Phase {phaseIndex}.{subPhaseIndex} Delay CleanUp | Checksum:"
272 _TIME: ClassVar[str] = "Time (s):"
275@export
276class SubPhase_ClockSkewOptimization(SubPhase):
277 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Clock Skew Optimization")
278 _FINISH: ClassVar[str] = "Phase {phaseIndex}.{subPhaseIndex} Clock Skew Optimization | Checksum:"
279 _TIME: ClassVar[str] = "Time (s):"
282@export
283class Phase_DelayAndSkewOptimization(PhaseWithChildren):
284 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR} Delay and Skew Optimization")
285 _FINISH: ClassVar[str] = "Phase {phaseIndex} Delay and Skew Optimization | Checksum:"
286 _TIME: ClassVar[str] = "Time (s):"
288 _PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = (
289 SubPhase_DelayCleanUp,
290 SubPhase_ClockSkewOptimization
291 )
294@export
295class Phase_RouteFinalize_1(Phase):
296 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR} Route finalize")
297 _FINISH: ClassVar[str] = "Phase {phaseIndex} Route finalize | Checksum:"
298 _TIME: ClassVar[str] = "Time (s):"
301@export
302class Phase_RouteFinalize_2(Phase):
303 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR} Route finalize")
304 _FINISH: ClassVar[str] = "Phase {phaseIndex} Route finalize | Checksum:"
305 _TIME: ClassVar[str] = "Time (s):"
308@export
309class SubPhase_HoldFixIter(SubPhase):
310 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Hold Fix Iter")
311 _FINISH: ClassVar[str] = "Phase {phaseIndex}.{subPhaseIndex} Hold Fix Iter | Checksum:"
312 _TIME: ClassVar[str] = "Time (s):"
315@export
316class Phase_PostHoldFix(PhaseWithChildren):
317 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR} Post Hold Fix")
318 _FINISH: ClassVar[str] = "Phase {phaseIndex} Post Hold Fix | Checksum:"
319 _TIME: ClassVar[str] = "Time (s):"
321 _PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = (
322 SubPhase_HoldFixIter,
323 )
326@export
327class Phase_VerifyingRoutedNets(Phase):
328 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR} Verifying routed nets")
329 _FINISH: ClassVar[str] = "Phase {phaseIndex} Verifying routed nets | Checksum:"
330 _TIME: ClassVar[str] = "Time (s):"
333@export
334class Phase_DepositingRoutes(Phase):
335 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR} Depositing Routes")
336 _FINISH: ClassVar[str] = "Phase {phaseIndex} Depositing Routes | Checksum:"
337 _TIME: ClassVar[str] = "Time (s):"
340@export
341class Phase_VerifyingRoutedNets(Phase):
342 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR} Verifying routed nets")
343 _FINISH: ClassVar[str] = "Phase {phaseIndex} Verifying routed nets | Checksum:"
344 _TIME: ClassVar[str] = "Time (s):"
347@export
348class Phase_ResolveXTalk(Phase):
349 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR} Resolve XTalk")
350 _FINISH: ClassVar[str] = "Phase {phaseIndex} Resolve XTalk | Checksum:"
351 _TIME: ClassVar[str] = "Time (s):"
354@export
355class Phase_DepositingRoutes(Phase):
356 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR} Depositing Routes")
357 _FINISH: ClassVar[str] = "Phase {phaseIndex} Depositing Routes | Checksum:"
358 _TIME: ClassVar[str] = "Time (s):"
361@export
362class Phase_PostProcessRouting(Phase):
363 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR} Post Process Routing")
364 _FINISH: ClassVar[str] = "Phase {phaseIndex} Post Process Routing | Checksum:"
365 _TIME: ClassVar[str] = "Time (s):"
368@export
369class Phase_PostRouterTiming(Phase):
370 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR} Post Router Timing")
371 _FINISH: ClassVar[str] = "Phase {phaseIndex} Post Router Timing | Checksum:"
372 _TIME: ClassVar[str] = "Time (s):"
375@export
376class Phase_PostRouteEventProcessing(Phase):
377 _START: ClassVar[Pattern] = compile(f"^Phase {MAJOR} Post-Route Event Processing")
378 _FINISH: ClassVar[str] = "Phase {phaseIndex} Post-Route Event Processing | Checksum:"
379 _TIME: ClassVar[str] = "Time (s):"
382@export
383class RoutingTask(TaskWithPhases):
384 _START: ClassVar[str] = "Starting Routing Task"
385 _FINISH: ClassVar[str] = "Ending Routing Task"
387 _PARSERS: ClassVar[Tuple[Type[Phase], ...]] = (
388 Phase_BuildRTDesign,
389 Phase_RouterInitialization,
390 Phase_GlobalRouting,
391 Phase_InitialRouting,
392 Phase_RipUpAndReroute,
393 Phase_DelayAndSkewOptimization,
394 Phase_PostHoldFix,
395 Phase_RouteFinalize_1,
396 Phase_VerifyingRoutedNets,
397 Phase_DepositingRoutes,
398 Phase_ResolveXTalk,
399 Phase_RouteFinalize_2,
400 Phase_PostRouterTiming,
401 Phase_PostProcessRouting,
402 Phase_PostRouterTiming, # FIXME: duplicate
403 Phase_PostRouteEventProcessing
404 )