Compare commits
	
		
			10 Commits
		
	
	
		
			2cf187fdb8
			...
			1ae3ffb9a2
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 1ae3ffb9a2 | |||
| 810a09f18b | |||
| 97688ffae1 | |||
| 445c5690e1 | |||
| 7e1f617274 | |||
| b10803efe9 | |||
| 5f0a450ffa | |||
| aa3636ebc6 | |||
| 48ffc9709e | |||
| 5cdafd580f | 
| @ -597,19 +597,19 @@ def load_libraryfile( | ||||
|     path = pathlib.Path(filename) | ||||
|     stream: IO[bytes] | ||||
|     if is_gzipped(path): | ||||
|         if mmap: | ||||
|         if use_mmap: | ||||
|             logger.info('Asked to mmap a gzipped file, reading into memory instead...') | ||||
|             gz_stream = gzip.open(path, mode='rb') | ||||
|             gz_stream = gzip.open(path, mode='rb')      # noqa: SIM115 | ||||
|             stream = io.BytesIO(gz_stream.read())       # type: ignore | ||||
|         else: | ||||
|             gz_stream = gzip.open(path, mode='rb') | ||||
|             gz_stream = gzip.open(path, mode='rb')      # noqa: SIM115 | ||||
|             stream = io.BufferedReader(gz_stream)       # type: ignore | ||||
|     else:       # noqa: PLR5501 | ||||
|         if mmap: | ||||
|             base_stream = open(path, mode='rb', buffering=0) | ||||
|         if use_mmap: | ||||
|             base_stream = path.open(mode='rb', buffering=0)                         # noqa: SIM115 | ||||
|             stream = mmap.mmap(base_stream.fileno(), 0, access=mmap.ACCESS_READ)    # type: ignore | ||||
|         else: | ||||
|             stream = open(path, mode='rb') | ||||
|             stream = path.open(mode='rb')          # noqa: SIM115 | ||||
|     return load_library(stream, full_load=full_load, postprocess=postprocess) | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -129,7 +129,7 @@ def clean_pattern_vertices(pat: Pattern) -> Pattern: | ||||
| 
 | ||||
| 
 | ||||
| def is_gzipped(path: pathlib.Path) -> bool: | ||||
|     with open(path, 'rb') as stream: | ||||
|     with path.open('rb') as stream: | ||||
|         magic_bytes = stream.read(2) | ||||
|         return magic_bytes == b'\x1f\x8b' | ||||
| 
 | ||||
|  | ||||
| @ -296,7 +296,7 @@ class Pattern(PortList, AnnotatableImpl, Mirrorable): | ||||
|         if not annotations_eq(self.annotations, other.annotations): | ||||
|             return False | ||||
| 
 | ||||
|         if not ports_eq(self.ports, other.ports): | ||||
|         if not ports_eq(self.ports, other.ports):   # noqa: SIM103 | ||||
|             return False | ||||
| 
 | ||||
|         return True | ||||
| @ -595,8 +595,7 @@ class Pattern(PortList, AnnotatableImpl, Mirrorable): | ||||
| 
 | ||||
|         if (cbounds[1] < cbounds[0]).any(): | ||||
|             return None | ||||
|         else: | ||||
|             return cbounds | ||||
|         return cbounds | ||||
| 
 | ||||
|     def get_bounds_nonempty( | ||||
|             self, | ||||
| @ -617,7 +616,7 @@ class Pattern(PortList, AnnotatableImpl, Mirrorable): | ||||
|         Returns: | ||||
|             `[[x_min, y_min], [x_max, y_max]]` | ||||
|         """ | ||||
|         bounds = self.get_bounds(library) | ||||
|         bounds = self.get_bounds(library, recurse=recurse) | ||||
|         assert bounds is not None | ||||
|         return bounds | ||||
| 
 | ||||
| @ -954,7 +953,7 @@ class Pattern(PortList, AnnotatableImpl, Mirrorable): | ||||
|         Returns: | ||||
|             self | ||||
|         """ | ||||
|         flattened: dict[str | None, 'Pattern | None'] = {} | ||||
|         flattened: dict[str | None, Pattern | None] = {} | ||||
| 
 | ||||
|         def flatten_single(name: str | None) -> None: | ||||
|             if name is None: | ||||
|  | ||||
| @ -289,7 +289,7 @@ class Grid(Repetition): | ||||
|             return True | ||||
|         if self.b_vector is None or other.b_vector is None: | ||||
|             return False | ||||
|         if any(self.b_vector[ii] != other.b_vector[ii] for ii in range(2)): | ||||
|         if any(self.b_vector[ii] != other.b_vector[ii] for ii in range(2)):     # noqa: SIM103 | ||||
|             return False | ||||
|         return True | ||||
| 
 | ||||
|  | ||||
| @ -286,7 +286,7 @@ class Arc(Shape): | ||||
|             return thetas | ||||
| 
 | ||||
|         wh = self.width / 2.0 | ||||
|         if wh == r0 or wh == r1: | ||||
|         if wh in (r0, r1): | ||||
|             thetas_inner = numpy.zeros(1)      # Don't generate multiple vertices if we're at the origin | ||||
|         else: | ||||
|             thetas_inner = get_thetas(inner=True) | ||||
| @ -308,7 +308,7 @@ class Arc(Shape): | ||||
|         return [poly] | ||||
| 
 | ||||
|     def get_bounds_single(self) -> NDArray[numpy.float64]: | ||||
|         ''' | ||||
|         """ | ||||
|         Equation for rotated ellipse is | ||||
|             `x = x0 + a * cos(t) * cos(rot) - b * sin(t) * sin(phi)` | ||||
|             `y = y0 + a * cos(t) * sin(rot) + b * sin(t) * cos(rot)` | ||||
| @ -319,7 +319,7 @@ class Arc(Shape): | ||||
|           where -+ is for x, y cases, so that's where the extrema are. | ||||
| 
 | ||||
|         If the extrema are innaccessible due to arc constraints, check the arc endpoints instead. | ||||
|         ''' | ||||
|         """ | ||||
|         a_ranges = self._angles_to_parameters() | ||||
| 
 | ||||
|         mins = [] | ||||
| @ -424,13 +424,13 @@ class Arc(Shape): | ||||
|                     )) | ||||
| 
 | ||||
|     def get_cap_edges(self) -> NDArray[numpy.float64]: | ||||
|         ''' | ||||
|         """ | ||||
|         Returns: | ||||
|             ``` | ||||
|             [[[x0, y0], [x1, y1]],   array of 4 points, specifying the two cuts which | ||||
|              [[x2, y2], [x3, y3]]],    would create this arc from its corresponding ellipse. | ||||
|             ``` | ||||
|         ''' | ||||
|         """ | ||||
|         a_ranges = self._angles_to_parameters() | ||||
| 
 | ||||
|         mins = [] | ||||
| @ -454,11 +454,11 @@ class Arc(Shape): | ||||
|         return numpy.array([mins, maxs]) + self.offset | ||||
| 
 | ||||
|     def _angles_to_parameters(self) -> NDArray[numpy.float64]: | ||||
|         ''' | ||||
|         """ | ||||
|         Returns: | ||||
|             "Eccentric anomaly" parameter ranges for the inner and outer edges, in the form | ||||
|                    `[[a_min_inner, a_max_inner], [a_min_outer, a_max_outer]]` | ||||
|         ''' | ||||
|         """ | ||||
|         a = [] | ||||
|         for sgn in (-1, +1): | ||||
|             wh = sgn * self.width / 2 | ||||
|  | ||||
| @ -431,22 +431,22 @@ class Path(Shape): | ||||
|         return self | ||||
| 
 | ||||
|     def remove_duplicate_vertices(self) -> 'Path': | ||||
|         ''' | ||||
|         """ | ||||
|         Removes all consecutive duplicate (repeated) vertices. | ||||
| 
 | ||||
|         Returns: | ||||
|             self | ||||
|         ''' | ||||
|         """ | ||||
|         self.vertices = remove_duplicate_vertices(self.vertices, closed_path=False) | ||||
|         return self | ||||
| 
 | ||||
|     def remove_colinear_vertices(self) -> 'Path': | ||||
|         ''' | ||||
|         """ | ||||
|         Removes consecutive co-linear vertices. | ||||
| 
 | ||||
|         Returns: | ||||
|             self | ||||
|         ''' | ||||
|         """ | ||||
|         self.vertices = remove_colinear_vertices(self.vertices, closed_path=False) | ||||
|         return self | ||||
| 
 | ||||
|  | ||||
| @ -415,22 +415,22 @@ class Polygon(Shape): | ||||
|         return self | ||||
| 
 | ||||
|     def remove_duplicate_vertices(self) -> 'Polygon': | ||||
|         ''' | ||||
|         """ | ||||
|         Removes all consecutive duplicate (repeated) vertices. | ||||
| 
 | ||||
|         Returns: | ||||
|             self | ||||
|         ''' | ||||
|         """ | ||||
|         self.vertices = remove_duplicate_vertices(self.vertices, closed_path=True) | ||||
|         return self | ||||
| 
 | ||||
|     def remove_colinear_vertices(self) -> 'Polygon': | ||||
|         ''' | ||||
|         """ | ||||
|         Removes consecutive co-linear vertices. | ||||
| 
 | ||||
|         Returns: | ||||
|             self | ||||
|         ''' | ||||
|         """ | ||||
|         self.vertices = remove_colinear_vertices(self.vertices, closed_path=True) | ||||
|         return self | ||||
| 
 | ||||
|  | ||||
| @ -1,9 +1,8 @@ | ||||
| from typing import Self | ||||
| from abc import ABCMeta | ||||
| import copy | ||||
| 
 | ||||
| 
 | ||||
| class Copyable(metaclass=ABCMeta): | ||||
| class Copyable: | ||||
|     """ | ||||
|     Trait class which adds .copy() and .deepcopy() | ||||
|     """ | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user