ZLayout EDA Library v1.0.0
Advanced Electronic Design Automation Layout Library with Bilingual Documentation
Loading...
Searching...
No Matches
basic_usage.py
Go to the documentation of this file.
1#!/usr/bin/env python3
2"""
3Basic usage example of ZLayout library.
4
5This example demonstrates:
61. Creating geometric shapes (rectangles and polygons)
72. Setting up spatial indexing with quadtree
83. Analyzing layout for sharp angles, narrow distances, and intersections
94. Visualizing results
10"""
11
12import sys
13import os
14
15# Add parent directory to path to import zlayout
16sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..'))
17
18import zlayout
19import matplotlib.pyplot as plt
20
21
22def create_sample_layout():
23 """Create a sample EDA layout with various components."""
24
25 # Define world bounds for the layout
26 world_bounds = zlayout.Rectangle(0, 0, 100, 100)
27
28 # Create geometry processor
29 processor = zlayout.GeometryProcessor(world_bounds)
30
31 # Add some rectangular components (representing chips, resistors, etc.)
32 rectangles = [
33 zlayout.Rectangle(10, 10, 15, 8), # Component 1
34 zlayout.Rectangle(30, 15, 12, 6), # Component 2
35 zlayout.Rectangle(50, 25, 20, 10), # Component 3
36 zlayout.Rectangle(75, 40, 8, 15), # Component 4
37 ]
38
39 for rect in rectangles:
40 processor.add_component(rect)
41
42 # Add some polygonal components (representing custom shapes)
43 polygons = [
44 # Triangle with sharp angle
46 zlayout.Point(20, 50),
47 zlayout.Point(35, 55),
48 zlayout.Point(22, 65)
49 ]),
50
51 # L-shaped component
53 zlayout.Point(45, 60),
54 zlayout.Point(60, 60),
55 zlayout.Point(60, 70),
56 zlayout.Point(55, 70),
57 zlayout.Point(55, 75),
58 zlayout.Point(45, 75)
59 ]),
60
61 # Narrow component that might cause spacing issues
63 zlayout.Point(70, 10),
64 zlayout.Point(90, 12),
65 zlayout.Point(88, 18),
66 zlayout.Point(68, 16)
67 ]),
68
69 # Component with potential intersection
71 zlayout.Point(25, 20),
72 zlayout.Point(40, 25),
73 zlayout.Point(35, 35),
74 zlayout.Point(20, 30)
75 ])
76 ]
77
78 for polygon in polygons:
79 processor.add_component(polygon)
80
81 return processor, rectangles, polygons
82
83
84def demonstrate_analysis(processor):
85 """Demonstrate layout analysis capabilities."""
86
87 print("=== ZLayout Analysis Demo ===\n")
88
89 # Perform comprehensive analysis
90 print("Analyzing layout...")
91 optimization_results = processor.optimize_layout()
92
93 analysis = optimization_results['analysis']
94
95 # Print results
96 print(f"Optimization Score: {optimization_results['optimization_score']:.1f}/100\n")
97
98 print("Sharp Angles Analysis:")
99 print(f" - Found {analysis['sharp_angles']['count']} sharp angles")
100 if analysis['sharp_angles']['count'] > 0:
101 print(f" - Sharpest angle: {analysis['sharp_angles']['sharpest']:.1f}°")
102 print(f" - Average angle: {analysis['sharp_angles']['average']:.1f}°")
103 print()
104
105 print("Narrow Distances Analysis:")
106 print(f" - Found {analysis['narrow_distances']['count']} narrow regions")
107 if analysis['narrow_distances']['count'] > 0:
108 print(f" - Minimum distance: {analysis['narrow_distances']['minimum']:.3f}")
109 print(f" - Average distance: {analysis['narrow_distances']['average']:.3f}")
110 print()
111
112 print("Edge Intersections Analysis:")
113 print(f" - Found {analysis['intersections']['polygon_pairs']} intersecting polygon pairs")
114 print(f" - Total intersection points: {analysis['intersections']['total_points']}")
115 print()
116
117 print("Suggestions:")
118 for suggestion in optimization_results['suggestions']:
119 print(f" • {suggestion}")
120
121 return optimization_results
122
123
124def demonstrate_visualization(processor, rectangles, polygons, optimization_results):
125 """Demonstrate visualization capabilities."""
126
127 print("\n=== Generating Visualizations ===")
128
129 visualizer = zlayout.LayoutVisualizer()
130
131 # Create layout overview
132 print("Creating layout overview...")
133 fig1 = visualizer.plot_layout(polygons, rectangles, "Sample EDA Layout")
134
135 # Create analysis visualization
136 print("Creating analysis visualization...")
137 fig2 = visualizer.plot_analysis_results(polygons, optimization_results['analysis'])
138
139 # Create optimization summary
140 print("Creating optimization summary...")
141 fig3 = visualizer.plot_optimization_summary(optimization_results)
142
143 # Show plots
144 plt.show()
145
146 return [fig1, fig2, fig3]
147
148
149def demonstrate_quadtree():
150 """Demonstrate quadtree spatial indexing."""
151
152 print("\n=== QuadTree Spatial Indexing Demo ===")
153
154 # Create a quadtree
155 world_bounds = zlayout.Rectangle(0, 0, 100, 100)
156 quadtree = zlayout.QuadTree(world_bounds, capacity=3, max_depth=4)
157
158 # Add some objects
159 objects = [
160 zlayout.Rectangle(10, 10, 5, 5),
161 zlayout.Rectangle(15, 20, 8, 6),
162 zlayout.Rectangle(50, 50, 12, 8),
163 zlayout.Rectangle(75, 25, 6, 10),
164 zlayout.Rectangle(30, 70, 15, 5),
165 ]
166
167 print(f"Inserting {len(objects)} objects into quadtree...")
168 for i, obj in enumerate(objects):
169 success = quadtree.insert(obj)
170 print(f" Object {i+1}: {'✓' if success else '✗'}")
171
172 # Query examples
173 print(f"\nQuadTree contains {quadtree.size()} objects")
174
175 # Range query
176 query_region = zlayout.Rectangle(0, 0, 50, 50)
177 objects_in_region = quadtree.query_range(query_region)
178 print(f"Objects in region (0,0,50,50): {len(objects_in_region)}")
179
180 # Point query
181 query_point = zlayout.Point(12, 12)
182 objects_at_point = quadtree.query_point(query_point)
183 print(f"Objects containing point (12,12): {len(objects_at_point)}")
184
185 # Find potential intersections
186 intersections = quadtree.find_intersections()
187 print(f"Potential intersecting pairs: {len(intersections)}")
188
189
190def main():
191 """Main demonstration function."""
192
193 print("Welcome to ZLayout - Advanced EDA Layout Library!")
194 print("=" * 50)
195
196 # Create sample layout
197 processor, rectangles, polygons = create_sample_layout()
198
199 # Demonstrate analysis
200 optimization_results = demonstrate_analysis(processor)
201
202 # Demonstrate quadtree
203 demonstrate_quadtree()
204
205 # Demonstrate visualization
206 try:
207 figures = demonstrate_visualization(processor, rectangles, polygons, optimization_results)
208
209 # Optionally save plots
210 save_plots = input("\nSave plots to files? (y/n): ").lower().strip()
211 if save_plots == 'y':
212 visualizer = zlayout.LayoutVisualizer()
213 visualizer.save_plots(figures, "zlayout_demo")
214 print("Plots saved!")
215
216 except ImportError:
217 print("\nNote: Matplotlib not available. Skipping visualization demo.")
218 print("Install matplotlib to see visual results: pip install matplotlib")
219
220 print("\nDemo completed!")
221
222
223if __name__ == "__main__":
224 main()
2D point with high-precision coordinates and utility methods
Definition point.hpp:23
Polygon class supporting both convex and concave polygons.
Definition polygon.hpp:25
Axis-aligned rectangle for bounding boxes and simple EDA components.
Definition rectangle.hpp:26
Quadtree spatial index for efficient range and intersection queries.
Definition quadtree.hpp:120