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

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 

34 

35from pyTooling.Decorators import export 

36from pyTooling.Warning import WarningCollector 

37 

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 

43 

44 

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):" 

50 

51 

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):" 

57 

58 

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):" 

64 

65 

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):" 

71 

72 

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):" 

78 

79 

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):" 

85 

86 

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):" 

92 

93 

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):" 

99 

100 

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):" 

106 

107 _PARSERS: ClassVar[Tuple[Type[SubSubPhase], ...]] = ( 

108 SubSubPhase_UpdateTiming, 

109 ) 

110 

111 

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):" 

117 

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 ) 

127 

128 

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):" 

134 

135 

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):" 

141 

142 

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):" 

148 

149 _PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = ( 

150 SubPhase_GlobalRouting, 

151 SubPhase_InitialNetRouting 

152 ) 

153 

154 

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):" 

160 

161 

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):" 

167 

168 

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):" 

174 

175 

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):" 

181 

182 

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):" 

188 

189 

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):" 

195 

196 _PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = ( 

197 SubPhase_GlobalIteration0, 

198 SubPhase_AdditionalIterationForHold, 

199 SubPhase_GlobalIteration1, 

200 SubPhase_GlobalIteration2 

201 ) 

202 

203 

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):" 

209 

210 

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):" 

216 

217 _PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = ( 

218 SubPhase_InitialNetRoutingPass, 

219 SubPhase_GlobalRouting, 

220 SubPhase_InitialNetRouting 

221 ) 

222 

223 

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):" 

229 

230 

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):" 

236 

237 

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):" 

243 

244 _PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = ( 

245 SubPhase_DelayCleanUp, 

246 SubPhase_ClockSkewOptimization 

247 ) 

248 

249 

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):" 

255 

256 

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):" 

262 

263 _PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = ( 

264 SubPhase_HoldFixIter, 

265 ) 

266 

267 

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):" 

273 

274 

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):" 

280 

281 

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):" 

287 

288 _PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = ( 

289 SubPhase_DelayCleanUp, 

290 SubPhase_ClockSkewOptimization 

291 ) 

292 

293 

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):" 

299 

300 

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):" 

306 

307 

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):" 

313 

314 

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):" 

320 

321 _PARSERS: ClassVar[Tuple[Type[SubPhase], ...]] = ( 

322 SubPhase_HoldFixIter, 

323 ) 

324 

325 

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):" 

331 

332 

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):" 

338 

339 

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):" 

345 

346 

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):" 

352 

353 

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):" 

359 

360 

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):" 

366 

367 

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):" 

373 

374 

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):" 

380 

381 

382@export 

383class RoutingTask(TaskWithPhases): 

384 _START: ClassVar[str] = "Starting Routing Task" 

385 _FINISH: ClassVar[str] = "Ending Routing Task" 

386 

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 )