stack.add_metal_layer(MetalLayer('PO1', 1.5 * kA, 10 * Ohm_sq, UP), 0) stack.add_metal_layer(MetalLayer('ME1', 2.0 * kA, 120 * mOhm_sq, DOWN), 2) stack.add_metal_layer(MetalLayer('ME2', 3.0 * kA, 100 * mOhm_sq, DOWN), 4) stack.add_metal_layer(MetalLayer('ME3', 3.0 * kA, 100 * mOhm_sq, DOWN), 6) stack.add_metal_layer(MetalLayer('ME4', 3.0 * kA, 100 * mOhm_sq, DOWN), 8) stack.add_metal_layer(MetalLayer('ME5', 3.0 * kA, 100 * mOhm_sq, DOWN), 10) if thick_top_metal: stack.add_metal_layer(MetalLayer('ME6', 20*kA, 10 * mOhm_sq, DOWN), 12) else: stack.add_metal_layer(MetalLayer('ME6', 7.0*kA, 30 * mOhm_sq, DOWN), 12) # Add vias # Via arguments: name, resistance, width or height (vias are assumed square), # spacing (defaults to 0) # LayerStack.add_via arguments: via, bottom metal name, top metal name stack.add_via(Via('CONT', 10 * Ohm, 0.15 * um, 0.20 * um), 'PO1', 'ME1') stack.add_via(Via('VI1', 2 * Ohm, 0.20 * um, 0.20 * um), 'ME1', 'ME2') stack.add_via(Via('VI2', 2 * Ohm, 0.20 * um, 0.20 * um), 'ME2', 'ME3') stack.add_via(Via('VI3', 2 * Ohm, 0.20 * um, 0.20 * um), 'ME3', 'ME4') stack.add_via(Via('VI4', 2 * Ohm, 0.20 * um, 0.20 * um), 'ME4', 'ME5') stack.add_via(Via('VI5', 0.5 * Ohm, 0.50 * um, 0.60 * um), 'ME5', 'ME6') # NOTE: when specifying spacing, the via layer's resistivity is calculated # based on the effective via area. This allows to draw a single rectangle # instead of a large number of separate vias, which can significantly # decrease simulation times while still providing accurate results. # In order to obtain the most accurate model, the size of the single via # rectangle should extend the area of the via array by exactly one half # of the spacing in both the x and y directions. if __name__ == '__main__':
stack.add_metal_layer(MetalLayer('PO1', 1.5 * kA, 10 * Ohm_sq, UP), 0) stack.add_metal_layer(MetalLayer('ME1', 2.0 * kA, 120 * mOhm_sq, DOWN), 2) stack.add_metal_layer(MetalLayer('ME2', 3.0 * kA, 100 * mOhm_sq, DOWN), 4) stack.add_metal_layer(MetalLayer('ME3', 3.0 * kA, 100 * mOhm_sq, DOWN), 6) stack.add_metal_layer(MetalLayer('ME4', 3.0 * kA, 100 * mOhm_sq, DOWN), 8) stack.add_metal_layer(MetalLayer('ME5', 3.0 * kA, 100 * mOhm_sq, DOWN), 10) if thick_top_metal: stack.add_metal_layer(MetalLayer('ME6', 20 * kA, 10 * mOhm_sq, DOWN), 12) else: stack.add_metal_layer(MetalLayer('ME6', 7.0 * kA, 30 * mOhm_sq, DOWN), 12) # Add vias # Via arguments: name, resistance, width or height (vias are assumed square), # spacing (defaults to 0) # LayerStack.add_via arguments: via, bottom metal name, top metal name stack.add_via(Via('CONT', 10 * Ohm, 0.15 * um, 0.20 * um), 'PO1', 'ME1') stack.add_via(Via('VI1', 2 * Ohm, 0.20 * um, 0.20 * um), 'ME1', 'ME2') stack.add_via(Via('VI2', 2 * Ohm, 0.20 * um, 0.20 * um), 'ME2', 'ME3') stack.add_via(Via('VI3', 2 * Ohm, 0.20 * um, 0.20 * um), 'ME3', 'ME4') stack.add_via(Via('VI4', 2 * Ohm, 0.20 * um, 0.20 * um), 'ME4', 'ME5') stack.add_via(Via('VI5', 0.5 * Ohm, 0.50 * um, 0.60 * um), 'ME5', 'ME6') # NOTE: when specifying spacing, the via layer's resistivity is calculated # based on the effective via area. This allows to draw a single rectangle # instead of a large number of separate vias, which can significantly # decrease simulation times while still providing accurate results. # In order to obtain the most accurate model, the size of the single via # rectangle should extend the area of the via array by exactly one half # of the spacing in both the x and y directions. if __name__ == '__main__': # Print the full layer stack to example.pdf.