Beispiel #1
0
def test_copy_deepcopy():
    D = Device()
    A = pg.ellipse(radii=(10, 5), angle_resolution=2.5, layer=1)
    B = pg.ellipse(radii=(10, 5), angle_resolution=2.5, layer=1)
    a = D << A
    b1 = D << B
    b2 = D << B

    Dcopy = pg.copy(D)
    Ddeepcopy = pg.deepcopy(D)
    h = D.hash_geometry(precision=1e-4)
    assert (h == '0313cd7e58aa265b44dd1ea10265d1088a2f1c6d')
    h = Dcopy.hash_geometry(precision=1e-4)
    assert (h == '0313cd7e58aa265b44dd1ea10265d1088a2f1c6d')
    h = Ddeepcopy.hash_geometry(precision=1e-4)
    assert (h == '0313cd7e58aa265b44dd1ea10265d1088a2f1c6d')

    D << pg.ellipse(radii=(12, 5), angle_resolution=2.5, layer=2)
    h = D.hash_geometry(precision=1e-4)
    assert (h == '856cedcbbb53312ff839b9fe016996357e658d33')
    h = Dcopy.hash_geometry(precision=1e-4)
    assert (h == '0313cd7e58aa265b44dd1ea10265d1088a2f1c6d')
    h = Ddeepcopy.hash_geometry(precision=1e-4)
    assert (h == '0313cd7e58aa265b44dd1ea10265d1088a2f1c6d')

    A.add_ref(pg.ellipse(radii=(12, 5), angle_resolution=2.5, layer=2))
    B.add_polygon([[3, 4, 5], [6.7, 8.9, 10.15]], layer=0)
    h = D.hash_geometry(precision=1e-4)
    assert (h == 'c007b674e8053c11c877860f0552fff18676b68e')
    h = Dcopy.hash_geometry(precision=1e-4)
    assert (h == '2590bd786348ab684616eecdfdbcc9735b156e18')
    h = Ddeepcopy.hash_geometry(precision=1e-4)
    assert (h == '0313cd7e58aa265b44dd1ea10265d1088a2f1c6d')
Beispiel #2
0
def test_move():
    # Test polygon move
    D = Device()
    p = D.add_polygon([(8, 6, 7, 9), (6, 8, 9, 5)])
    p.move([1.7, 0.8])
    h = D.hash_geometry(precision=1e-4)
    assert (h == '57a86bce5f60f7bc78c7c30473a544b736d2afb3')
    p.movex(13.9)
    h = D.hash_geometry(precision=1e-4)
    assert (h == '8fe6706e05ebe1512ee2efe2582546b949fbc48f')
    p.movey(19.2)
    h = D.hash_geometry(precision=1e-4)
    assert (h == '7df43241eca2dd11f267c25876e650eadaca7d9f')
    # Test Device move
    D = Device()
    D.add_polygon([(8, 6, 7, 9), (6, 8, 9, 5)])
    D.add_polygon([(8, 6, 7, 9, 7, 0), (6, 8, 9, 5, 7, 0)])
    D.move([1.7, 0.8])
    h = D.hash_geometry(precision=1e-4)
    assert (h == 'c863156dd00a590dc02823e1791554d4142b1ea9')
    # Test label move
    D = Device()
    D.add_polygon([(8, 8, 8, 8), (6, 6, 6, 6)])
    l = D.add_label('testing', position=D.center)
    print(all(l.center == D.center))
    D.rotate(45)
    print(np.allclose(l.center, D.center))
    D.move([70000.5, 30000.5])
    print(np.allclose(l.center, D.center))
    D.rotate(75)
    print(np.allclose(l.center, D.center))
    D.mirror([7, 5])
    print(np.allclose(l.center, D.center))
Beispiel #3
0
def test_align():
    D = Device()
    # Create different-sized rectangles and add them to D then distribute them
    [
        D.add_ref(
            pg.rectangle(size=[n * 15 + 20, n * 15 + 20]).move((n, n * 4)))
        for n in [0, 2, 3, 1, 2]
    ]
    D.distribute(elements='all', direction='x', spacing=5, separation=True)
    # Align top edges
    D.align(elements='all', alignment='ymax')
    h = D.hash_geometry(precision=1e-4)
    assert (h == '38025959a80e46e47eabcf3f096c6273427dabc3')

    D = Device()
    # Create different-sized rectangles and add them to D then distribute them
    [
        D.add_ref(
            pg.rectangle(size=[n * 15 + 20, n * 15 + 20]).move((n, n * 4)))
        for n in [0, 2, 3, 1, 2]
    ]
    D.distribute(elements='all', direction='x', spacing=5, separation=True)
    # Align top edges
    D.align(elements='all', alignment='y')
    h = D.hash_geometry(precision=1e-4)
    assert (h == 'ed32ee1ce1f3da8f6216020877d6c1b64097c600')
Beispiel #4
0
def test_distribute():
    D = Device()
    # Create different-sized rectangles and add them to D
    [
        D.add_ref(
            pg.rectangle(size=[n * 15 + 20, n * 15 + 20]).move((n, n * 4)))
        for n in [0, 2, 3, 1, 2]
    ]
    # Distribute all the rectangles in D along the x-direction with a separation of 5
    D.distribute(
        elements='all',  # either 'all' or a list of objects
        direction='x',  # 'x' or 'y'
        spacing=5,
        separation=True)

    h = D.hash_geometry(precision=1e-4)
    assert (h == '1aa688d7dfb59e94d28dd0d9b8f324ff30281d70')

    D = Device()
    [
        D.add_ref(
            pg.rectangle(size=[n * 15 + 20, n * 15 + 20]).move((n, n * 4)))
        for n in [0, 2, 3, 1, 2]
    ]
    D.distribute(elements='all',
                 direction='x',
                 spacing=100,
                 separation=False,
                 edge='xmin')
    h = D.hash_geometry(precision=1e-4)
    assert (h == '18be0ef1db78095233d2f3ae5f065d9f453a6c07')
Beispiel #5
0
def test_move():
    D = Device()
    p = D.add_polygon([(8, 6, 7, 9), (6, 8, 9, 5)])
    p.move([1.7, 0.8])
    h = D.hash_geometry(precision=1e-4)
    assert (h == '57a86bce5f60f7bc78c7c30473a544b736d2afb3')
    p.movex(13.9)
    h = D.hash_geometry(precision=1e-4)
    assert (h == '8fe6706e05ebe1512ee2efe2582546b949fbc48f')
    p.movey(19.2)
    h = D.hash_geometry(precision=1e-4)
    assert (h == '7df43241eca2dd11f267c25876e650eadaca7d9f')
Beispiel #6
0
def test_polygon_simplify():
    D = Device()
    t = np.linspace(0, np.pi, 1000)
    x = np.cos(t)
    y = np.sin(t)
    poly = D.add_polygon([x, y])
    h = D.hash_geometry(precision=1e-4)
    assert (h == '0c3b1465c8b6ffd911c41b02114b9a06f606ad91')
    # qp(D)
    poly.simplify(tolerance=1e-1)
    h = D.hash_geometry(precision=1e-4)
    assert (h == '7d9ebcb231fb0107cbbf618353adeb583782ca11')
Beispiel #7
0
def test_reflect():
    # Test polygon reflection
    D = Device()
    p = D.add_polygon([(8, 6, 7, 9), (6, 8, 9, 5)])
    p.mirror(p1=(1.7, 2.5), p2=(4.5, 9.1))
    h = D.hash_geometry(precision=1e-4)
    assert (h == 'bc6ae5308c2240e425cd503e0cdda30007bbfc4d')
    # Test Device reflection
    D = Device()
    p = D.add_polygon([(8, 6, 7, 9), (6, 8, 9, 5)])
    D.mirror(p1=(1.7, 2.5), p2=(4.5, 9.1))
    h = D.hash_geometry(precision=1e-4)
    assert (h == 'bc6ae5308c2240e425cd503e0cdda30007bbfc4d')
Beispiel #8
0
def test_rotate():
    # Test polygon rotation
    D = Device()
    p = D.add_polygon([(8, 6, 7, 9), (6, 8, 9, 5)])
    p.rotate(37.5)
    h = D.hash_geometry(precision=1e-4)
    assert (h == '2e4815072eabe053c3029d9e29a5b3ed59fe9bb7')
    # Test Device rotation
    D = Device()
    p = D.add_polygon([(8, 6, 7, 9), (6, 8, 9, 5)])
    D.rotate(37.5)
    h = D.hash_geometry(precision=1e-4)
    assert (h == '2e4815072eabe053c3029d9e29a5b3ed59fe9bb7')
Beispiel #9
0
def test_add_polygon3():
    D = Device()
    D.add_polygon([(8, 6), (6, 8), (7, 9), (9, 5)], layer=7)
    D.add_polygon([(8, 0), (6, 8), (7, 9), (9, 5)], layer=(8, 0))
    D.add_polygon([(8, 1), (6, 8), (7, 9), (9, 5)], layer=(9, 1))
    h = D.hash_geometry(precision=1e-4)
    assert (h == '96abc3c9e30f3bbb32c5a39aeea2ba0fa3b13ebe')
Beispiel #10
0
def test_flatten():
    D = Device()
    E1 = Device()
    E2 = Device()
    E1.add_polygon( [(8,6,7,9,7,0), (6,8,9,5,7,0)], layer = 8)
    E2.add_polygon( [(18,16,17,19,17,10), (16,18,19,15,17,10)], layer = 9)
    D << E1
    D << E2
    h = D.hash_geometry(precision = 1e-4)
    assert(h == '8a057feca51d8097f2a915eda558fe2a9b88fb13')
    D.flatten()
    h = D.hash_geometry(precision = 1e-4)
    assert(h == '8a057feca51d8097f2a915eda558fe2a9b88fb13')
    D.flatten(single_layer = (5,5))
    h = D.hash_geometry(precision = 1e-4)
    assert(h == 'cfc1ba30384f5f1f7d888f47f16d1f310f95b464')
Beispiel #11
0
def test_remove_layers():
    D = Device()
    D.add_polygon([(8, 6, 7, 9, 7), (6, 8, 9, 5, 7)], layer=13)
    D.add_polygon([(18, 16, 17, 19, 17), (16, 18, 19, 15, 17)], layer=14)
    xpts = list(range(1000))
    ypts = [x % 73 for x in xpts]
    p = D.add_polygon([xpts, ypts], layer=15)
    p.fracture(max_points=13, precision=1e-4)
    # Switch part of the polygons to layer (14,0)
    p.layers[13:17] = [14] * 4
    # Switch part of the polygons to layer (14,1)
    p.layers[23:27] = [14] * 4
    p.datatypes[23:27] = [1] * 4
    h = D.hash_geometry(precision=1e-4)
    assert (h == '7a7aa6a22b3d0b852a0e465398018dd19a1be305')
    D.remove_layers(layers=[13, (14, 0)])
    h = D.hash_geometry(precision=1e-4)
    assert (h == 'bb81ec3b3a6be2372a7ffc32f57121a9f1a97b34')
Beispiel #12
0
def test_add_array():
    D = Device()
    E = Device()
    E.add_polygon([[30, 20], [30, 0], [0, 0], [0, 20]], layer=7)
    A = D.add_array(E, columns=7, rows=5, spacing=(31, 21))
    assert (A.bbox.tolist() == [[0.0, 0.0], [216.0, 104.0]])
    A.rotate(10)
    A.move((15, 1.5))
    A.mirror((0, 1))
    A.get_polygons()
    h = D.hash_geometry(precision=1e-4)
    assert (h == '418b7503baff80fbe93031d45d87557c277f07b4')

    F = Device()
    f1 = F << D
    f2 = F << D
    f1.movex(300)
    f2.rotate(45)
    h = F.hash_geometry(precision=1e-4)
    assert (h == 'fd7c2b4adb811342b836d9fca13992eff951630d')
Beispiel #13
0
def test_group():
    # Test all types
    D = Device()
    E1 = pg.ellipse(radii=(10, 5), angle_resolution=2.5, layer=0)
    E2 = pg.rectangle(size=(4, 2), layer=0).movex(15)
    e1 = D << E1
    e2 = D << E2
    e3 = D << E2
    e4 = D.add_label('hello', position=(1.5, -1.5))
    e5 = pg.snspd()
    e6 = D.add_polygon([(8, 6, 7, 9, 7, 0), (6, 8, 9, 5, 7, 0)])
    e7 = D.add_array(pg.cross())
    e2verify = D << E2

    # Test creation and addition
    G = Group()
    G.add(e1)
    G.add(e2)
    G.add([e3, e4, e5])
    G += (e6, e7)
    assert np.allclose(G.bbox.flatten(), np.array([-10., -8.5, 105., 105.]))

    # Test movement
    G.move((2, 7))
    e2verify.move((2, 7))
    assert np.allclose(G.bbox.flatten(), np.array([-8., -1.5, 107., 112.]))
    assert all(e2.center == e2verify.center)
    assert e2.rotation == e2verify.rotation

    # Test rotation
    G.rotate(90, center=(5, 5))
    e2verify.rotate(90, center=(5, 5))
    assert np.allclose(G.bbox.flatten(), np.array([-102., -8., 11.5, 107.]))
    assert all(e2.center == e2verify.center)
    assert e2.rotation == e2verify.rotation

    # Test mirroring
    G.mirror(p1=(1, 1), p2=(-1, 1))
    e2verify.mirror(p1=(1, 1), p2=(-1, 1))
    assert np.allclose(G.bbox.flatten(), np.array([-102., -105., 11.5, 10.]))
    assert all(e2.center == e2verify.center)
    assert e2.rotation == e2verify.rotation
    h = D.hash_geometry(precision=1e-4)
    assert (h == '3964acb3971771c6e70ceb587c2ae8b37f2ed112')
Beispiel #14
0
def test_write_and_import_gds():
    D = Device()
    D.add_ref(pg.rectangle(size=[1.5, 2.7], layer=[3, 2]))
    D.add_ref(pg.rectangle(size=[0.8, 2.5], layer=[9, 7]))
    D.add_array(pg.rectangle(size=[1, 2], layer=[4, 66]),
                rows=3,
                columns=2,
                spacing=[14, 7.5])
    D.add_array(pg.rectangle(size=[1.5, 2.5], layer=[4, 67]),
                rows=1,
                columns=2,
                spacing=[14, 7.5])
    D.add_polygon([[3, 4, 5], [6.7, 8.9, 10.15]], layer=[7, 8])
    D.add_polygon([[3, 4, 5], [1.7, 8.9, 10.15]], layer=[7, 9])
    precision = 1e-4
    unit = 1e-6
    h1 = D.hash_geometry(precision=precision)
    D.write_gds('temp.gds', precision=unit * precision, unit=1e-6)
    Dimport = pg.import_gds('temp.gds', flatten=False)
    h2 = Dimport.hash_geometry(precision=precision)
    assert (h1 == h2)
#==============================================================================
# Advanced: Geometry hashing
#==============================================================================
# A D.hash_geometry() function produces a unique string (based on SHA1-hashing)
# based on the underlying polygons which allows us to tell whether the polygons
# in a Device are the same as another device.  This allows us to compare
# one device with another and check if they have the same geometry. GDS
# structure is ignored -- only final geometry/polygon output is considered
# Note:  Does not hash Ports or Labels!

# Create two Devices and check that they have the same geometry hash - even
# though one has a reference and the other doesn't
D = Device()
e = D << pg.ellipse(radii=[10, 15], layer=2)
D2 = pg.ellipse(radii=[10, 15], layer=2)
print(D.hash_geometry())  # Output: 143f7faa8558feb3036487c155083bd53fad4913
print(D2.hash_geometry())  # Output: 143f7faa8558feb3036487c155083bd53fad4913

# Create two Devices with the same polygons, but different layers
D = pg.ellipse(radii=[10, 15], layer=2)
D2 = pg.ellipse(radii=[10, 15], layer=77)
print(D.hash_geometry())  # 143f7faa8558feb3036487c155083bd53fad4913
print(D2.hash_geometry()
      )  # cd36f7c5da226f8bb6c29b64acb8c442dcb379c4 <-- Different!

# Create two Devices with the same polygons, but added in different orders
D = pg.ellipse(radii=[10, 15], layer=2)
D << pg.rectangle(size=[7.5, 8.6], layer=99)
D2 = pg.rectangle(size=[7.5, 8.6], layer=99)
D2 << pg.ellipse(radii=[10, 15], layer=2)
print(D.hash_geometry())  # f4d11e73389a1a1578a181c269f79424392482d6
Beispiel #16
0
def test_add_polygon1():
    D = Device()
    D.add_polygon([(8, 6, 7, 9), (6, 8, 9, 5)])
    h = D.hash_geometry(precision=1e-4)
    assert (h == 'c0629d2a7c557f72fad131ae8260df22c1df2d56')