RouteDesign.py

Summary

Lines:

230 of 230 covered (100.0%)

Coverage:

100.0%

Directory:

Xilinx

Source

pyEDAA/OutputFilter/Xilinx/RouteDesign.pycoveredpartialuncoveredexcludednot executable
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 ClassVar, Type, Tuple
34
35from pyTooling.Decorators import export
36
37from pyEDAA.OutputFilter.Xilinx     import TaskWithPhases, Phase, SubPhase, PhaseWithChildren, SubPhaseWithChildren
38from pyEDAA.OutputFilter.Xilinx     import MAJOR, MAJOR_MINOR, MAJOR_MINOR_MICRO
39from pyEDAA.OutputFilter.Xilinx.PlaceDesign import SubSubPhase
40
41
42@export
43class Phase_BuildRTDesign(Phase):
44	"""
45	*Build RT Design* phase.
46
47	Used by task :class:`RoutingTask`.
48	"""
49	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR} Build RT Design")
50	_FINISH: ClassVar[str]     = "Phase {phaseIndex} Build RT Design | Checksum:"
51	_TIME:   ClassVar[str]     = "Time (s):"
52	_FINAL:  ClassVar[str]     = None
53
54
55@export
56class SubPhase_CreateTimer(SubPhase):
57	"""
58	*Create Timer* subphase.
59
60	Used by phase :class:`Phase_RouterInitialization`.
61	"""
62	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Create Timer")
63	_FINISH: ClassVar[str]     = "Phase {phaseIndex}.{subPhaseIndex} Create Timer | Checksum:"
64	_TIME:   ClassVar[str]     = "Time (s):"
65
66
67@export
68class SubPhase_FixTopologyConstraints(SubPhase):
69	"""
70	*Fix Topology Constraints* subphase.
71
72	Used by phase :class:`Phase_RouterInitialization`.
73	"""
74	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Fix Topology Constraints")
75	_FINISH: ClassVar[str]     = "Phase {phaseIndex}.{subPhaseIndex} Fix Topology Constraints | Checksum:"
76	_TIME:   ClassVar[str]     = "Time (s):"
77
78
79@export
80class SubPhase_PreRouteCleanup(SubPhase):
81	"""
82	*Pre Route Cleanup* subphase.
83
84	Used by phase :class:`Phase_RouterInitialization`.
85	"""
86	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Pre Route Cleanup")
87	_FINISH: ClassVar[str]     = "Phase {phaseIndex}.{subPhaseIndex} Pre Route Cleanup | Checksum:"
88	_TIME:   ClassVar[str]     = "Time (s):"
89
90
91@export
92class SubPhase_GlobalClockNetRouting(SubPhase):
93	"""
94	*Global Clock Net Routing* subphase.
95
96	Used by phase :class:`Phase_RouterInitialization`.
97	"""
98	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Global Clock Net Routing")
99	_FINISH: ClassVar[str]     = "Phase {phaseIndex}.{subPhaseIndex} Global Clock Net Routing | Checksum:"
100	_TIME:   ClassVar[str]     = "Time (s):"
101
102
103@export
104class SubPhase_UpdateTiming(SubPhase):
105	"""
106	*Update Timing* subphase.
107
108	Used by phase :class:`Phase_RouterInitialization`.
109	"""
110	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Update Timing")
111	_FINISH: ClassVar[str]     = "Phase {phaseIndex}.{subPhaseIndex} Update Timing | Checksum:"
112	_TIME:   ClassVar[str]     = "Time (s):"
113
114
115@export
116class SubPhase_SoftConstraintPins_FastBudgeting(SubPhase):
117	"""
118	*Soft Constraint Pins - Fast Budgeting* subphase.
119
120	Used by phase :class:`Phase_RouterInitialization`.
121	"""
122	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Soft Constraint Pins - Fast Budgeting")
123	_FINISH: ClassVar[str]     = "Phase {phaseIndex}.{subPhaseIndex} Soft Constraint Pins - Fast Budgeting | Checksum:"
124	_TIME:   ClassVar[str]     = "Time (s):"
125
126
127@export
128class SubSubPhase_UpdateTiming(SubSubPhase):
129	"""
130	*Update Timing - Fast Budgeting* sub-subphase.
131
132	Used by phase :class:`SubPhase_UpdateTimingForBusSkew`.
133	"""
134	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR_MICRO} Update Timing")
135	_FINISH: ClassVar[str]     = "Phase {phaseIndex}.{subPhaseIndex}.{subSubPhaseIndex} Update Timing | Checksum:"
136	_TIME:   ClassVar[str]     = "Time (s):"
137
138
139@export
140class SubPhase_UpdateTimingForBusSkew(SubPhaseWithChildren):
141	"""
142	*Update Timing for Bus Skew* subphase.
143
144	.. rubric:: Uses
145
146	* :class:`SubSubPhase_UpdateTiming`
147
148	Used by phase :class:`Phase_RouterInitialization`.
149	"""
150	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Update Timing for Bus Skew")
151	_FINISH: ClassVar[str]     = "Phase {phaseIndex}.{subPhaseIndex} Update Timing for Bus Skew | Checksum:"
152	_TIME:   ClassVar[str]     = "Time (s):"
153
154	_PARSERS: ClassVar[Tuple[Type[SubSubPhase], ...]] = (
155		SubSubPhase_UpdateTiming,
156	)
157
158
159@export
160class Phase_RouterInitialization(PhaseWithChildren):
161	"""
162	*Router Initialization* phase.
163
164	.. rubric:: Uses
165
166	* :class:`SubPhase_CreateTimer`
167	* :class:`SubPhase_FixTopologyConstraints`
168	* :class:`SubPhase_PreRouteCleanup`
169	* :class:`SubPhase_GlobalClockNetRouting`
170	* :class:`SubPhase_UpdateTiming`
171	* :class:`SubPhase_UpdateTimingForBusSkew`
172	* :class:`SubPhase_SoftConstraintPins_FastBudgeting`
173
174	Used by task :class:`RoutingTask`.
175	"""
176	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR} Router Initialization")
177	_FINISH: ClassVar[str]     = "Phase {phaseIndex} Router Initialization | Checksum:"
178	_TIME:   ClassVar[str]     = "Time (s):"
179	_FINAL:  ClassVar[str]     = None
180
181	_PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = (
182		SubPhase_CreateTimer,
183		SubPhase_FixTopologyConstraints,
184		SubPhase_PreRouteCleanup,
185		SubPhase_GlobalClockNetRouting,
186		SubPhase_UpdateTiming,
187		SubPhase_UpdateTimingForBusSkew,
188		SubPhase_SoftConstraintPins_FastBudgeting
189	)
190
191
192@export
193class SubPhase_GlobalRouting(SubPhase):
194	"""
195	*Global Routing* subphase.
196
197	Used by phase :class:`Phase_Initial_Routing`.
198	"""
199	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Global Routing")
200	_FINISH: ClassVar[str]     = "Phase {phaseIndex}.{subPhaseIndex} Global Routing | Checksum:"
201	_TIME:   ClassVar[str]     = "Time (s):"
202
203
204@export
205class SubPhase_InitialNetRouting(SubPhase):
206	"""
207	*Initial Net Routing* subphase.
208
209	Used by phase :class:`Phase_Initial_Routing`.
210	"""
211	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Initial Net Routing")
212	_FINISH: ClassVar[str]     = "Phase {phaseIndex}.{subPhaseIndex} Initial Net Routing | Checksum:"
213	_TIME:   ClassVar[str]     = "Time (s):"
214
215
216@export
217class Phase_Initial_Routing(PhaseWithChildren):
218	"""
219	*Initial Routing* phase.
220
221	.. rubric:: Uses
222
223	* :class:`SubPhase_GlobalRouting`
224	* :class:`SubPhase_InitialNetRouting`
225
226	Used by task :class:`RoutingTask`.
227	"""
228	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR} Initial Routing")
229	_FINISH: ClassVar[str]     = "Phase {phaseIndex} Initial Routing | Checksum:"
230	_TIME:   ClassVar[str]     = "Time (s):"
231	_FINAL:  ClassVar[str]     = None
232
233	_PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = (
234		SubPhase_GlobalRouting,
235		SubPhase_InitialNetRouting
236	)
237
238
239@export
240class Phase_GlobalRouting(Phase):
241	"""
242	*Global Routing* phase.
243
244	Used by task :class:`RoutingTask`.
245	"""
246	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR} Global Routing")
247	_FINISH: ClassVar[str]     = "Phase {phaseIndex} Global Routing | Checksum:"
248	_TIME:   ClassVar[str]     = "Time (s):"
249	_FINAL:  ClassVar[str]     = None
250
251
252@export
253class SubPhase_GlobalIteration0(SubPhase):
254	"""
255	*Global Iteration 0* subphase.
256
257	Used by phase :class:`Phase_RipUpAndReroute`.
258	"""
259	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Global Iteration 0")
260	_FINISH: ClassVar[str]     = "Phase {phaseIndex}.{subPhaseIndex} Global Iteration 0 | Checksum:"
261	_TIME:   ClassVar[str]     = "Time (s):"
262
263
264@export
265class SubPhase_AdditionalIterationForHold(SubPhase):
266	"""
267	*Additional Iteration for Hold* subphase.
268
269	Used by phase :class:`Phase_RipUpAndReroute`.
270	"""
271	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Additional Iteration for Hold")
272	_FINISH: ClassVar[str]     = "Phase {phaseIndex}.{subPhaseIndex} Additional Iteration for Hold | Checksum:"
273	_TIME:   ClassVar[str]     = "Time (s):"
274
275
276@export
277class SubPhase_GlobalIteration1(SubPhase):
278	"""
279	*Global Iteration 1* subphase.
280
281	Used by phase :class:`Phase_RipUpAndReroute`.
282	"""
283	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Global Iteration 1")
284	_FINISH: ClassVar[str]     = "Phase {phaseIndex}.{subPhaseIndex} Global Iteration 1 | Checksum:"
285	_TIME:   ClassVar[str]     = "Time (s):"
286
287
288@export
289class SubPhase_GlobalIteration2(SubPhase):
290	"""
291	*Global Iteration 2* subphase.
292
293	Used by phase :class:`Phase_RipUpAndReroute`.
294	"""
295	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Global Iteration 2")
296	_FINISH: ClassVar[str]     = "Phase {phaseIndex}.{subPhaseIndex} Global Iteration 2 | Checksum:"
297	_TIME:   ClassVar[str]     = "Time (s):"
298
299
300@export
301class Phase_RipUpAndReroute(PhaseWithChildren):
302	"""
303	*Rip-up And Reroute* phase.
304
305	.. rubric:: Uses
306
307	* :class:`SubPhase_GlobalIteration0`
308	* :class:`SubPhase_AdditionalIterationForHold`
309	* :class:`SubPhase_GlobalIteration1`
310	* :class:`SubPhase_GlobalIteration2`
311
312	Used by task :class:`RoutingTask`.
313	"""
314	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR} Rip-up And Reroute")
315	_FINISH: ClassVar[str]     = "Phase {phaseIndex} Rip-up And Reroute | Checksum:"
316	_TIME:   ClassVar[str]     = "Time (s):"
317	_FINAL:  ClassVar[str]     = None
318
319	_PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = (
320		SubPhase_GlobalIteration0,
321		SubPhase_AdditionalIterationForHold,
322		SubPhase_GlobalIteration1,
323		SubPhase_GlobalIteration2
324	)
325
326
327@export
328class SubPhase_InitialNetRoutingPass(SubPhase):
329	"""
330	*Initial Net Routing Pass* subphase.
331
332	Used by phase :class:`Phase_InitialRouting`.
333	"""
334	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Initial Net Routing Pass")
335	_FINISH: ClassVar[str]     = "Phase {phaseIndex}.{subPhaseIndex} Initial Net Routing Pass | Checksum:"
336	_TIME:   ClassVar[str]     = "Time (s):"
337
338
339@export
340class Phase_InitialRouting(PhaseWithChildren):
341	"""
342	*Initial Routing* phase.
343
344	.. rubric:: Uses
345
346	* :class:`SubPhase_InitialNetRoutingPass`
347	* :class:`SubPhase_GlobalRouting`
348	* :class:`SubPhase_InitialNetRouting`
349
350	Used by task :class:`RoutingTask`.
351	"""
352	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR} Initial Routing")
353	_FINISH: ClassVar[str]     = "Phase {phaseIndex} Initial Routing | Checksum:"
354	_TIME:   ClassVar[str]     = "Time (s):"
355	_FINAL:  ClassVar[str]     = None
356
357	_PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = (
358		SubPhase_InitialNetRoutingPass,
359		SubPhase_GlobalRouting,
360		SubPhase_InitialNetRouting
361	)
362
363
364@export
365class SubPhase_DelayCleanUp(SubPhase):
366	"""
367	*Delay CleanUp* subphase.
368
369	Used by phase :class:`Phase_DelayAndSkewOptimization`.
370	"""
371	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Delay CleanUp")
372	_FINISH: ClassVar[str]     = "Phase {phaseIndex}.{subPhaseIndex} Delay CleanUp | Checksum:"
373	_TIME:   ClassVar[str]     = "Time (s):"
374
375
376@export
377class SubPhase_ClockSkewOptimization(SubPhase):
378	"""
379	*Clock Skew Optimization* subphase.
380
381	Used by phase :class:`Phase_DelayAndSkewOptimization`.
382	"""
383	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Clock Skew Optimization")
384	_FINISH: ClassVar[str]     = "Phase {phaseIndex}.{subPhaseIndex} Clock Skew Optimization | Checksum:"
385	_TIME:   ClassVar[str]     = "Time (s):"
386
387
388@export
389class Phase_DelayAndSkewOptimization(PhaseWithChildren):
390	"""
391	*Delay and Skew Optimization* phase.
392
393	.. rubric:: Uses
394
395	* :class:`SubPhase_DelayCleanUp`
396	* :class:`SubPhase_ClockSkewOptimization`
397
398	Used by task :class:`RoutingTask`.
399	"""
400	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR} Delay and Skew Optimization")
401	_FINISH: ClassVar[str]     = "Phase {phaseIndex} Delay and Skew Optimization | Checksum:"
402	_TIME:   ClassVar[str]     = "Time (s):"
403	_FINAL:  ClassVar[str]     = None
404
405	_PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = (
406		SubPhase_DelayCleanUp,
407		SubPhase_ClockSkewOptimization
408	)
409
410
411@export
412class SubPhase_HoldFixIter(SubPhase):
413	"""
414	*Hold Fix Iter* subphase.
415
416	Used by phase :class:`Phase_PostHoldFix`.
417	"""
418	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR_MINOR} Hold Fix Iter")
419	_FINISH: ClassVar[str]     = "Phase {phaseIndex}.{subPhaseIndex} Hold Fix Iter | Checksum:"
420	_TIME:   ClassVar[str]     = "Time (s):"
421
422
423@export
424class Phase_PostHoldFix(PhaseWithChildren):
425	"""
426	*Post Hold Fix* phase.
427
428	Used by task :class:`RoutingTask`.
429	"""
430	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR} Post Hold Fix")
431	_FINISH: ClassVar[str]     = "Phase {phaseIndex} Post Hold Fix | Checksum:"
432	_TIME:   ClassVar[str]     = "Time (s):"
433	_FINAL:  ClassVar[str]     = None
434
435	_PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = (
436		SubPhase_HoldFixIter,
437	)
438
439
440@export
441class Phase_DelayAndSkewOptimization(PhaseWithChildren):
442	"""
443	*Delay and Skew Optimization* phase.
444
445	.. rubric:: Uses
446
447	* :class:`SubPhase_DelayCleanUp`
448	* :class:`SubPhase_ClockSkewOptimization`
449
450	Used by task :class:`RoutingTask`.
451	"""
452	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR} Delay and Skew Optimization")
453	_FINISH: ClassVar[str]     = "Phase {phaseIndex} Delay and Skew Optimization | Checksum:"
454	_TIME:   ClassVar[str]     = "Time (s):"
455	_FINAL:  ClassVar[str]     = None
456
457	_PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = (
458		SubPhase_DelayCleanUp,
459		SubPhase_ClockSkewOptimization
460	)
461
462
463@export
464class Phase_RouteFinalize_1(Phase):  # todo: remove duplicates
465	"""
466	*Route finalize* phase.
467
468	Used by task :class:`RoutingTask`.
469	"""
470	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR} Route finalize")
471	_FINISH: ClassVar[str]     = "Phase {phaseIndex} Route finalize | Checksum:"
472	_TIME:   ClassVar[str]     = "Time (s):"
473	_FINAL:  ClassVar[str]     = None
474
475
476@export
477class Phase_RouteFinalize_2(Phase):  # todo: remove duplicates
478	"""
479	*Route finalize* phase.
480
481	Used by task :class:`RoutingTask`.
482	"""
483	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR} Route finalize")
484	_FINISH: ClassVar[str]     = "Phase {phaseIndex} Route finalize | Checksum:"
485	_TIME:   ClassVar[str]     = "Time (s):"
486	_FINAL:  ClassVar[str]     = None
487
488
489@export
490class Phase_PostHoldFix(PhaseWithChildren):
491	"""
492	*Post Hold Fix* phase.
493
494	Used by task :class:`RoutingTask`.
495	"""
496	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR} Post Hold Fix")
497	_FINISH: ClassVar[str]     = "Phase {phaseIndex} Post Hold Fix | Checksum:"
498	_TIME:   ClassVar[str]     = "Time (s):"
499	_FINAL:  ClassVar[str]     = None
500
501	_PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = (
502		SubPhase_HoldFixIter,
503	)
504
505
506@export
507class Phase_VerifyingRoutedNets(Phase):
508	"""
509	*Verifying routed nets* phase.
510
511	Used by task :class:`RoutingTask`.
512	"""
513	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR} Verifying routed nets")
514	_FINISH: ClassVar[str]     = "Phase {phaseIndex} Verifying routed nets | Checksum:"
515	_TIME:   ClassVar[str]     = "Time (s):"
516	_FINAL:  ClassVar[str]     = None
517
518
519@export
520class Phase_DepositingRoutes(Phase):
521	"""
522	*Depositing Routes* phase.
523
524	Used by task :class:`RoutingTask`.
525	"""
526	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR} Depositing Routes")
527	_FINISH: ClassVar[str]     = "Phase {phaseIndex} Depositing Routes | Checksum:"
528	_TIME:   ClassVar[str]     = "Time (s):"
529	_FINAL:  ClassVar[str]     = None
530
531
532@export
533class Phase_VerifyingRoutedNets(Phase):
534	"""
535	*Verifying routed nets* phase.
536
537	Used by task :class:`RoutingTask`.
538	"""
539	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR} Verifying routed nets")
540	_FINISH: ClassVar[str]     = "Phase {phaseIndex} Verifying routed nets | Checksum:"
541	_TIME:   ClassVar[str]     = "Time (s):"
542	_FINAL:  ClassVar[str]     = None
543
544
545@export
546class Phase_ResolveXTalk(Phase):
547	"""
548	*Resolve XTalk* phase.
549
550	Used by task :class:`RoutingTask`.
551	"""
552	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR} Resolve XTalk")
553	_FINISH: ClassVar[str]     = "Phase {phaseIndex} Resolve XTalk | Checksum:"
554	_TIME:   ClassVar[str]     = "Time (s):"
555	_FINAL:  ClassVar[str]     = None
556
557
558@export
559class Phase_DepositingRoutes(Phase):
560	"""
561	*Depositing Routes* phase.
562
563	Used by task :class:`RoutingTask`.
564	"""
565	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR} Depositing Routes")
566	_FINISH: ClassVar[str]     = "Phase {phaseIndex} Depositing Routes | Checksum:"
567	_TIME:   ClassVar[str]     = "Time (s):"
568	_FINAL:  ClassVar[str]     = None
569
570
571@export
572class Phase_PostProcessRouting(Phase):
573	"""
574	*Post Process Routing* phase.
575
576	Used by task :class:`RoutingTask`.
577	"""
578	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR} Post Process Routing")
579	_FINISH: ClassVar[str]     = "Phase {phaseIndex} Post Process Routing | Checksum:"
580	_TIME:   ClassVar[str]     = "Time (s):"
581	_FINAL:  ClassVar[str]     = None
582
583
584@export
585class Phase_PostRouterTiming(Phase):
586	"""
587	*Post Router Timing* phase.
588
589	Used by task :class:`RoutingTask`.
590	"""
591	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR} Post Router Timing")
592	_FINISH: ClassVar[str]     = "Phase {phaseIndex} Post Router Timing | Checksum:"
593	_TIME:   ClassVar[str]     = "Time (s):"
594	_FINAL:  ClassVar[str]     = None
595
596
597@export
598class Phase_PostRouteEventProcessing(Phase):
599	"""
600	*Post-Route Event Processing* phase.
601
602	Used by task :class:`RoutingTask`.
603	"""
604	_START:  ClassVar[Pattern] = compile(f"^Phase {MAJOR} Post-Route Event Processing")
605	_FINISH: ClassVar[str]     = "Phase {phaseIndex} Post-Route Event Processing | Checksum:"
606	_TIME:   ClassVar[str]     = "Time (s):"
607	_FINAL:  ClassVar[str]     = None
608
609
610@export
611class RoutingTask(TaskWithPhases):
612	"""
613	*Routing* task.
614
615	.. rubric:: Uses
616
617	* :class:`Phase_BuildRTDesign`
618	* :class:`Phase_RouterInitialization`
619	* :class:`Phase_GlobalRouting`
620	* :class:`Phase_InitialRouting`
621	* :class:`Phase_RipUpAndReroute`
622	* :class:`Phase_DelayAndSkewOptimization`
623	* :class:`Phase_PostHoldFix`
624	* :class:`Phase_RouteFinalize_1`
625	* :class:`Phase_VerifyingRoutedNets`
626	* :class:`Phase_DepositingRoutes`
627	* :class:`Phase_ResolveXTalk`
628	* :class:`Phase_RouteFinalize_2`
629	* :class:`Phase_PostRouterTiming`
630	* :class:`Phase_PostProcessRouting`
631	* :class:`Phase_PostRouterTiming`
632	* :class:`Phase_PostRouteEventProcessing`
633
634	Used by Vivado command :class:`~pyEDAA.OutputFilter.Xilinx.Commands.RouteDesign`.
635	"""
636	_START:  ClassVar[str] = "Starting Routing Task"
637	_FINISH: ClassVar[str] = "Ending Routing Task"
638
639	_PARSERS: ClassVar[Tuple[Type[Phase], ...]] = (
640		Phase_BuildRTDesign,
641		Phase_RouterInitialization,
642		Phase_GlobalRouting,
643		Phase_InitialRouting,
644		Phase_RipUpAndReroute,
645		Phase_DelayAndSkewOptimization,
646		Phase_PostHoldFix,
647		Phase_RouteFinalize_1,
648		Phase_VerifyingRoutedNets,
649		Phase_DepositingRoutes,
650		Phase_ResolveXTalk,
651		Phase_RouteFinalize_2,
652		Phase_PostRouterTiming,
653		Phase_PostProcessRouting,
654		Phase_PostRouterTiming,    # FIXME: duplicate
655		Phase_PostRouteEventProcessing
656	)