3Advanced EDA Circuit Layout Example
5This example simulates a more realistic electronic circuit layout with:
6- Various component types (chips, resistors, capacitors, traces)
7- Different geometric constraints
8- Comprehensive analysis for manufacturing feasibility
16sys.path.insert(0, os.path.join(os.path.dirname(__file__),
'..'))
19import matplotlib.pyplot
as plt
23 """Represents a circuit component with properties."""
25 def __init__(self, name: str, geometry, component_type: str =
"generic"):
31 def add_pin(self, point: zlayout.Point, pin_name: str =
""):
32 """Add a pin to the component."""
33 self.
pins.append((point, pin_name))
37 """Create a microcontroller component."""
42 geometry = body.to_polygon()
50 pin_x = x + 2 + i * pin_spacing
55 pin_x = x + 2 + i * pin_spacing
62 """Create a resistor component."""
75 cos_r, sin_r = math.cos(rotation), math.sin(rotation)
78 new_x = v.x * cos_r - v.y * sin_r + x
79 new_y = v.x * sin_r + v.y * cos_r + y
93 """Create a capacitor component."""
105 """Create a PCB trace (connection line with width)."""
109 length = math.sqrt(dx*dx + dy*dy)
116 perp_x = -dy * width / (2 * length)
117 perp_y = dx * width / (2 * length)
132 """Create a complex circuit layout with multiple components."""
142 components.append(mcu)
143 processor.add_component(mcu.geometry)
153 for resistor
in resistors:
154 components.append(resistor)
155 processor.add_component(resistor.geometry)
164 for cap
in capacitors:
165 components.append(cap)
166 processor.add_component(cap.geometry)
184 components.append(trace)
185 processor.add_component(trace.geometry)
196 components.append(
CircuitComponent(
"Connector", sharp_connector,
"connector"))
197 processor.add_component(sharp_connector)
218 processor.add_component(overlap_poly1)
219 processor.add_component(overlap_poly2)
221 return processor, components
225 """Analyze the layout for manufacturing constraints."""
227 print(
"=== Manufacturing Constraint Analysis ===\n")
231 "prototype": {
"min_spacing": 0.1,
"min_trace_width": 0.1,
"sharp_angle_limit": 20},
232 "standard": {
"min_spacing": 0.15,
"min_trace_width": 0.15,
"sharp_angle_limit": 30},
233 "high_density": {
"min_spacing": 0.05,
"min_trace_width": 0.05,
"sharp_angle_limit": 15}
236 for process_name, limits
in constraints.items():
237 print(f
"--- {process_name.upper()} PROCESS ---")
239 analysis = processor.analyze_layout(
240 sharp_angle_threshold=limits[
"sharp_angle_limit"],
241 narrow_distance_threshold=limits[
"min_spacing"]
247 if analysis[
'sharp_angles'][
'count'] > 0:
248 violations += analysis[
'sharp_angles'][
'count']
249 print(f
" ⚠️ Sharp angles: {analysis['sharp_angles']['count']} violations")
251 if analysis[
'narrow_distances'][
'count'] > 0:
252 violations += analysis[
'narrow_distances'][
'count']
253 print(f
" ⚠️ Spacing violations: {analysis['narrow_distances']['count']}")
254 print(f
" Minimum distance: {analysis['narrow_distances']['minimum']:.3f}")
256 if analysis[
'intersections'][
'polygon_pairs'] > 0:
257 violations += analysis[
'intersections'][
'polygon_pairs']
258 print(f
" ❌ Intersections: {analysis['intersections']['polygon_pairs']} pairs")
261 print(f
" ✅ Manufacturable with {process_name} process")
263 print(f
" ❌ {violations} total violations for {process_name} process")
267 return processor.optimize_layout()
271 """Demonstrate design rule checking capabilities."""
273 print(
"=== Design Rule Checking (DRC) ===\n")
282 print(
"--- COMPONENT ANALYSIS ---")
285 for comp
in components:
286 comp_type = comp.component_type
287 if comp_type
not in component_types:
288 component_types[comp_type] = 0
289 component_types[comp_type] += 1
291 print(
"Component count by type:")
292 for comp_type, count
in component_types.items():
293 print(f
" {comp_type}: {count}")
295 print(f
"\nTotal components: {len(components)}")
298 print(
"\n--- DRC SUMMARY REPORT ---")
299 score = optimization_results[
'optimization_score']
308 status =
"ACCEPTABLE"
311 status =
"NEEDS WORK"
314 print(f
"Overall Layout Quality: {emoji} {status} ({score:.1f}/100)")
316 print(
"\nRecommendations:")
317 for suggestion
in optimization_results[
'suggestions']:
318 print(f
" • {suggestion}")
320 if not optimization_results[
'suggestions']:
321 print(
" ✅ No issues found! Layout meets all design rules.")
323 return processor, components, optimization_results
327 """Main function demonstrating advanced EDA layout analysis."""
329 print(
"🔧 ZLayout - Advanced EDA Circuit Analysis")
336 print(
"\n=== Visualization Generation ===")
342 polygons = [comp.geometry
for comp
in components
if isinstance(comp.geometry,
zlayout.Polygon)]
344 print(
"Creating circuit layout visualization...")
345 fig1 = visualizer.plot_layout(polygons, title=
"Complex Circuit Layout")
347 print(
"Creating DRC analysis visualization...")
348 fig2 = visualizer.plot_analysis_results(polygons, optimization_results[
'analysis'])
350 print(
"Creating optimization summary...")
351 fig3 = visualizer.plot_optimization_summary(optimization_results)
356 save_option = input(
"\nSave analysis results and plots? (y/n): ").lower().strip()
357 if save_option ==
'y':
359 visualizer.save_plots([fig1, fig2, fig3],
"circuit_analysis")
362 with open(
"circuit_analysis_report.txt",
"w")
as f:
363 f.write(
"ZLayout Circuit Analysis Report\n")
364 f.write(
"=" * 40 +
"\n\n")
365 f.write(f
"Layout Quality Score: {optimization_results['optimization_score']:.1f}/100\n\n")
367 analysis = optimization_results[
'analysis']
368 f.write(f
"Sharp Angles: {analysis['sharp_angles']['count']}\n")
369 f.write(f
"Narrow Distances: {analysis['narrow_distances']['count']}\n")
370 f.write(f
"Intersections: {analysis['intersections']['polygon_pairs']}\n\n")
372 f.write(
"Recommendations:\n")
373 for suggestion
in optimization_results[
'suggestions']:
374 f.write(f
" • {suggestion}\n")
376 print(
"Results saved to files!")
379 print(
"Matplotlib not available. Install with: pip install matplotlib")
381 print(
"\n✅ Advanced EDA analysis completed!")
384if __name__ ==
"__main__":
add_pin(self, zlayout.Point point, str pin_name="")
__init__(self, str name, geometry, str component_type="generic")
2D point with high-precision coordinates and utility methods
Polygon class supporting both convex and concave polygons.
Axis-aligned rectangle for bounding boxes and simple EDA components.
CircuitComponent create_capacitor(float x, float y)
CircuitComponent create_trace(zlayout.Point start, zlayout.Point end, float width=0.3)
CircuitComponent create_resistor(float x, float y, float rotation=0)
create_complex_circuit_layout()
analyze_manufacturing_constraints(processor)
CircuitComponent create_microcontroller(float x, float y)
demonstrate_design_rule_checking()