What this builds
A rectangular block containing either one serial fluid path or N independent parallel ones.
series inlet → chamber 1 → channel → chamber 2 → … → chamber N → outlet 2 ports
parallel N × ( inlet → chamber → outlet ), side by side in Y 2N ports
Parallel paths never touch: the wall left between neighbours is
pitch − chamber width, and a pitch that would close that wall is a
blocking failure. At N = 1 the two layouts describe exactly the
same solid, and the tool emits byte-identical SCAD and STL for both — the
verification suite asserts it.
Chambers and channel segments occupy adjacent, non-overlapping intervals along X. They abut at a plane rather than interpenetrating, which is what lets the tool report the void volume as an exact sum of parts rather than an estimate: no inclusion–exclusion term is ever needed.
The chamber shape
Each chamber is a prism of constant depth whose plan is a hexagon. Walking along
the path: the channel, at width cw, opens out linearly over the taper
length tl to the chamber width mw; runs flat at
mw for the flat length ml; then closes back down over a
second taper of length tl to cw again.
The taper endpoints are exactly the channel width, so the plan-view profile is continuous through the junction. The only discontinuity left at a chamber mouth is the step in Z, and which face that step lands on is what the alignment setting chooses.
plan area A = mw·ml + (cw + mw)·tl volume V = A · cd
That is exact, not an approximation: the flat is a rectangle and each taper is a
trapezoid with parallel sides cw and mw and height
tl, so the two tapers together contribute
2 · (cw + mw)/2 · tl. Setting tl = 0 collapses the shape
to a plain rectangle with an abrupt step at each end; setting ml = 0
makes a diamond whose two tapers meet at a point. Both are legal and both are
covered by the verification suite.
The sloped taper edges are not axis-aligned, and the printer is. This tool emits the true trapezoid, with its endpoints on whole pixels and a straight line between them, and every volume it reports is the exact area of that trapezoid. A slicer will stair-step that line onto the pixel grid, so the printed taper wall is serrated and its true volume differs from the figure here by whatever the slicer's rounding does. Nothing on this page estimates that difference, and the design kit gives no limit for it.
cw, mw, tl and ml all stay
whole numbers of pixels. When mw − cw is odd, a perfectly centred
chamber would put the taper endpoints on a half pixel; the tool moves the chamber
to the nearest whole pixel instead and reports the offset it used. The area formula
above is unaffected — a trapezoid's area does not depend on whether it is
isosceles.
The volume solver
Given a target volume the tool solves for the flat length, the only one of the four chamber dimensions that scales the volume linearly without changing anything else:
ml = ( V_target / cd − (cw + mw)·tl ) / mw then rounded to whole pixels
Because the result is rounded, the achieved volume is almost never exactly the target; the residual is bounded by half a pixel of flat length, and the tool prints both the achieved volume and the error, in µL and per cent, rather than rounding the display until the discrepancy disappears.
The tapers hold volume whether or not there is any flat left. The
smallest chamber reachable at a given tl, mw and
cd is the ml = 0 diamond, whose volume is
(cw + mw)·tl·cd. Ask for less than that and no flat length — not
even zero — will get you there. The tool reports that as a blocking failure,
names the minimum reachable volume, and does not silently clamp ml to
zero and hand you a chamber that is too big.
The flow model, and where it is valid
The pressure/flow relationship is the rectangular-duct Hagen–Poiseuille
approximation given in the h.r.3.3 PDK's own component documentation for the
rectangular channel (pdk/docs/Rectangular Channel.docx,
“Component model”), which in turn cites Bruus:
R_hyd = 12 · η · l / ( w · h³ · (1 − 0.63 · h / w) ) Q = ΔP / R_hyd
It is summed over the channel segments only — inlet, each inter-chamber connector, and outlet — and the chambers contribute nothing to the total. That is a deliberate simplification, not an oversight: a chamber's cross-section here is far larger than the channel's, so its resistance per unit length is smaller by the same large factor and would be lost in the noise of everything else this model already ignores. The readout says so every time it prints a number: laminar estimate, channel resistance only — chamber resistance neglected. If you make a chamber barely larger than the channel, that assumption stops being reasonable and the tool will be optimistic about the pressure required; nothing warns you, because the design kit gives no threshold at which to warn.
Where the ends are tapered, each taper is counted slice by slice with the same formula. With roof ports, each port's hole through the roof is counted too, as a duct of the port's shape: a round port as a round tube of the same area, R = 8 · η · L / (π · r⁴), and a square port by the exact series for a square duct, R = 12 · η · L / (0.4217 · a⁴); the readout then says channels and ports only. That part is approximate: the holes are short, and entrance effects are not modelled. Where the ports carry slip-on posts, each post's bore is counted as a round tube as well, and the readout says channels, ports and posts' bores only.
In a parallel layout the paths are identical and independent, so they share the driving pressure and combine like parallel resistors: the pressure you enter is seen by every path, and the flow you enter is the flow in one path. Both the per-path and the all-paths totals are printed, labelled. Reynolds number stays per path — there is no combined Reynolds number for an array.
Validity condition: h ≤ w. The series approximation the 0.63 term
comes from is written for a duct whose height is the shorter side. If you enter a
channel taller than it is wide the tool still reports a number, but it computes it
on the same duct with the two cross-section dimensions exchanged and says so —
and that geometry separately fails the PDK's documented h < w rule.
Everything the calculator prints is a laminar estimate, not a guarantee. It assumes fully developed, steady, incompressible, single-phase Newtonian flow, rigid walls, no entrance or exit losses, no expansion or contraction losses at the chamber mouths, no surface-tension effects, no recirculation or dead zones inside the chambers, and perfectly rectangular channel cross-sections. A real printed chamber chip has none of those exactly. Reynolds number is reported so you can see when the laminar assumption itself is in question; water density is taken as 998.2 kg/m³ at 20 °C.
Residence time is τ = V_chamber / Q and fill time is
V_internal / Q. Both are plug-flow bookkeeping: volume divided by
volumetric rate. Neither is a mixing time, and neither accounts for the fact that a
real chamber does not exchange its contents uniformly.
Diffusion time across the chamber depth is t = h² / (2D), with
D entered by you. The tool offers 1e-9 m²/s as a starting
point because that is the right order of magnitude for a small molecule in water at
room temperature — it is not a validated coefficient for your
species, your buffer or your temperature, and the page never treats it as one.
Dead volume
Reported as
dead fraction = ( channel volume + port shaft volume ) / total internal volume
Both the connecting channels and the vertical port shafts are volume the sample has to occupy without being in a chamber, so both are counted. The three components — chambers, channels, port shafts — are printed separately as well, so you can take a different view of what counts as dead without having to re-derive anything.
Ports are not library interfaces
The two port styles on this page are geometric primitives and nothing more. An open end is a rectangular hole where the channel meets the end face; a roof port is a square or round shaft from the channel ceiling to the top face. They carry no pin declaration, no obstruction layer, no pitch convention and no mating geometry.
The h.r.3.3 component library works differently: its cells declare
interfaces explicitly — see pdk/gen_mixing_chamber.py, whose
chambers are emitted as LEF cells with lef_port() pins, obstruction
boxes and a fixed routing pitch, so that the placer and router can connect them.
A block from this page has none of that. It will not natively mate with
Foundry component library parts, and it is not intended to be dropped into
a placed-and-routed design. It is a standalone chip.
What is checked, and what is not
The blocking checks are geometric self-consistency only — whether the solid
you described can exist as a printable body with the connectivity the chosen layout
claims. The single process rule that is checked, h < w on the
channel, is checked because it is written down in the PDK component document for
the rectangular channel. It is the only one. There is no chamber component document
in the PDK, so there is no documented chamber rule to check against.
On the BYU grid, the block is also compared with the image BYU publishes for the OS1, 2560 × 1600 pixels (19.5 × 12.2 mm, BYU’s rounded figure; the OS1’s Specs page, read 2026-09-30), either way round. The comparison is in pixels: on this grid a pixel of the block is a pixel of the image, so 2560 pixels fit and 2561 do not, whatever a pixel’s exact size. A block bigger than that both ways is flagged and never refused: the files stay on. Each figure is BYU’s published figure for the OS1: see Hardware and process. On any other grid no build area is compared.
The unsupported chamber roof span is displayed prominently, in mm, because it is the largest unsupported ceiling in the part and the thing most likely to decide whether the print succeeds. It is not gated: the OpenMFDA design kit's documentation gives no span limit for any resin, layer height or exposure profile, so there is no number to compare it against. Showing the span and refusing to invent a threshold is the honest version of that check.
The tapers exist partly to give air somewhere to go on fill, but whether a given taper length is long enough to avoid trapping a bubble is not something this tool evaluates — the design kit gives no limit for it either. That, minimum wall survivability, minimum feature width and resin clearing are listed in the Checks panel as not checked.
Nothing produced by this page has been printed or fluidically tested. It is geometry and arithmetic.
Grid discipline
Every dimension is stored as a whole number of pixels or layers, because that is what the printer can actually address. The µm boxes are a convenience: type 250 µm at a 7.6 µm pitch and the tool takes 33 px (250.8 µm) and tells you it did. Nothing off-grid is ever accepted silently, including the solved flat length, which is rounded to a whole pixel with the residual reported.
Three centring consequences are worth knowing. When the channel width and the chamber width differ in parity, true centring would put the taper endpoints on a half pixel; the tool moves the chamber to the nearest whole pixel and reports the offset. The same applies to a roof port centred across the channel. And in a parallel layout every path is placed on a whole-pixel pitch, so the array is exactly periodic rather than accumulating a rounding error down the block.