Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,6 @@ Manifest.toml
.vscode/
.DS_Store
.gitlab-ci-local
coverage/
coverage/
*.xao
*.msh2
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ The format of this changelog is based on

- `SolidModels.check_overlap` now skips empty groups
- Built-in components `Spacer`, `ArrowAnnotation`, and `WeatherVane` now default to coordinate type `typeof(1.0UPREFERRED)` if no coordinate type is specified in the constructor
- Improvements to ExamplePDK/DemoQPU17 component mesh sizing
- Minor documentation improvements

## 1.4.0 (2025-07-01)
Expand Down
4 changes: 2 additions & 2 deletions docs/src/examples/qpu17.md
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ LINE_SPECIFICATIONS = [# Manual port assignment, we'll just list them out
("Z", (3, 5), [Point(5000, -1800)]μm),
("XY", (3, 4), [Point(4600, -2300)]μm),
("Z", (3, 4), [Point(4600, -3000)]μm),
("XY", (4, 4), [Point(4200, -3000)]μm),
("XY", (4, 4), [Point(3300, -2100)]μm),
# SE corner
("Z", (4, 4), [Point(4100, -4200)]μm),
("XY", (5, 4), [Point(4100, -4600)]μm),
Expand Down Expand Up @@ -704,7 +704,7 @@ Many quantum devices fill the ground plane with small holes to reduce loss assoc
```julia
#### Autofill with ground plane holes
hole_cs = CoordinateSystem("gnd_hole") # Coordinate system for a single hole
place!(hole_cs, Circle(GROUND_HOLE_RADIUS), METAL_NEGATIVE)
place!(hole_cs, not_simulated(Circle(GROUND_HOLE_RADIUS)), METAL_NEGATIVE)
bnds = bounds(schematic, find_components(ExampleChip, schematic)...) # bounds of the chip node
exclusion = make_halo(50μm; ignore_layers=[CHIP_AREA]) # function to create exclusion area
x_grid = (lowerleft(bnds).x + 600μm):GROUND_HOLE_SPACING:(upperright(bnds).x - 600μm) # raster x-coordinates
Expand Down
2 changes: 1 addition & 1 deletion examples/DemoQPU17/DemoQPU17.jl
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ function qpu17_demo(; savegds=true, dir=pwd())

#### Autofill with ground plane holes
hole_cs = CoordinateSystem("gnd_hole") # Coordinate system for a single hole
place!(hole_cs, Circle(GROUND_HOLE_RADIUS), METAL_NEGATIVE)
place!(hole_cs, not_simulated(Circle(GROUND_HOLE_RADIUS)), METAL_NEGATIVE)
bnds = bounds(schematic, find_components(ExampleChip, schematic)...) # bounds of the chip node
exclusion = make_halo(50μm; ignore_layers=[CHIP_AREA]) # function to create exclusion area
x_grid = (lowerleft(bnds).x + 600μm):GROUND_HOLE_SPACING:(upperright(bnds).x - 600μm) # raster x-coordinates
Expand Down
5 changes: 5 additions & 0 deletions examples/DemoQPU17/Project.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
[deps]
DeviceLayout = "ebf59a4a-04ec-49d7-8cd4-c9382ceb8e85"
FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549"
JSON = "682c06a0-de6a-54ab-a142-c8b1cf79cde6"
Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d"
2 changes: 1 addition & 1 deletion examples/DemoQPU17/params.jl
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ function qpu_params()
("Z", (3, 5), [Point(5000, -1800)]μm),
("XY", (3, 4), [Point(4600, -2300)]μm),
("Z", (3, 4), [Point(4600, -3000)]μm),
("XY", (4, 4), [Point(4200, -3000)]μm),
("XY", (4, 4), [Point(3300, -2100)]μm),
# SE corner
("Z", (4, 4), [Point(4100, -4200)]μm),
("XY", (5, 4), [Point(4100, -4600)]μm),
Expand Down
25 changes: 15 additions & 10 deletions src/schematics/ExamplePDK/components/ChipTemplates/ChipTemplates.jl
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,13 @@ A `Component` with rectangular geometry in the CHIP_AREA layer and uniformly spa
end

function SchematicDrivenLayout._geometry!(cs::CoordinateSystem, c::ExampleChip)
return place!(
cs,
OptionalStyle(DeviceLayout.NoRender(), DeviceLayout.Plain(), :artwork, false)(
centered(Rectangle(c.length_x, c.length_y))
),
CHIP_AREA
)
chip_rect = centered(Rectangle(c.length_x, c.length_y))
# only_simulated would make these invisible to `bounds`, which we don't want
# so these render by default and ignore for artwork
not_artwork =
OptionalStyle(DeviceLayout.NoRender(), DeviceLayout.Plain(), :artwork, false)
place!(cs, not_artwork(chip_rect), CHIP_AREA)
return place!(cs, not_artwork(chip_rect), WRITEABLE_AREA)
end

function SchematicDrivenLayout.hooks(c::ExampleChip)
Expand Down Expand Up @@ -89,10 +89,11 @@ end
"""
example_launcher(port_spec)

Create a coplanar-waveguide "launcher" in `METAL_NEGATIVE` created using `launch!` with its defaults.
Create a coplanar-waveguide "launcher" in `METAL_NEGATIVE` created using `launch!`.

Returns a `Path` named `"launcher_\$role_\$target"`, where `role` and `target` are the first two
elements of `port_spec`. Hooks are given by [`hooks(::Path)`](@ref).
elements of `port_spec`. Hooks are given by [`hooks(::Path)`](@ref). Uses default parameters
for `launch!` with rounding turned off.

This method exists for use in demonstrations. The launcher design is not optimized
for microwave properties.
Expand All @@ -101,7 +102,11 @@ function example_launcher(port_spec)
isnothing(port_spec) && return nothing
path =
Path(nm; name="launcher_$(port_spec[1])_$(port_spec[2])", metadata=METAL_NEGATIVE)
launch!(path)
launch!(path, extround=0μm)
port_cs = CoordinateSystem(uniquename("launcherport"))
gap0 = path[1].sty.gap # Launcher pad gap
render!(port_cs, only_simulated(centered(Rectangle(gap0, gap0))), PORT)
attach!(path, sref(port_cs), path[1].sty.gap / 2, i=1)
return path
end
###
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,8 @@ function SchematicDrivenLayout._geometry!(
path = _path(cc)
place!(cs, path)
claw_cutout = RotationPi(1 // 2)(_series_claw(cc))
place!(cs, Align.rightof(claw_cutout, path, centered=true), METAL_NEGATIVE)
ms = MeshSized(critical_dimension(cc))
place!(cs, ms(Align.rightof(claw_cutout, path, centered=true)), METAL_NEGATIVE)

return cs
end
Expand Down Expand Up @@ -261,7 +262,8 @@ function SchematicDrivenLayout._geometry!(
# Align claw below tap before attaching bridge, which may extend below tap
claw_cutout = Align.below(claw_cutout, tap; centered=true)
!isnothing(cc.bridge) && attach!(tap, sref(cc.bridge), pathlength(tap[end]) / 2)
place!(cs, claw_cutout, METAL_NEGATIVE)
ms = MeshSized(critical_dimension(cc))
place!(cs, ms(claw_cutout), METAL_NEGATIVE)

return cs
end
Expand Down
2 changes: 1 addition & 1 deletion src/schematics/technologies.jl
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ function level_z(l::Integer; t_chips=[525μm, 525μm], t_gaps=[5μm])
# Add up stacks above 1, subtract stacks below 1
z_chip =
sum(t_chips[(2):chip_idx]) + sum(t_gaps[1:(chip_idx - 1)]) -
(sum(t_chips[(chip_idx + 1):1]) + sum(t_gaps[chip_idx:-1]))
(sum(t_chips[(chip_idx + 1):1]) + sum(t_gaps[chip_idx:0]))
if iseven(l)
return z_chip - t_chips[chip_idx] # even is bottom of substrate
end
Expand Down