microfluidic biochips: design, programming, and...

136
Microfluidic Biochips: Design, Programming, and Optimization Bill Thies Joint work with Vaishnavi Ananthanarayanan, J.P. Urbanski, Nada Amin, David Craig, Jeremy Gunawardena, Todd Thorsen, and Saman Amarasinghe Indian Statistical Institute March 2, 2011

Upload: others

Post on 10-Mar-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Microfluidic Biochips: Design,

Programming, and Optimization

Bill Thies

Joint work with Vaishnavi Ananthanarayanan, J.P. Urbanski,

Nada Amin, David Craig, Jeremy Gunawardena,

Todd Thorsen, and Saman Amarasinghe

Indian Statistical Institute

March 2, 2011

Page 2: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Microfluidic Chips

• Idea: a whole biology lab on a single chip

– Input/output

– Sensors: pH, glucose, temperature, etc.

– Actuators: mixing, PCR, electrophoresis, cell lysis, etc.

• Benefits:

– Small sample volumes

– High throughput

– Geometrical manipulation

– Portability

• Applications:

– Biochemistry - Cell biology

– Biological computing

1 mm 10x real-time

Page 3: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Application to Rural Diagnostics

Disposable

Enteric Card

PATH,

Washington U.

Micronics, Inc.,

U. Washington

Targets:

- E. coli, Shigella,

Salmonella,

C. jejuni

DxBox

U. Washington,

Micronics, Inc.,

Nanogen, Inc.

Targets:

- malaria (done)

- dengue, influenza,

Rickettsial diseases,

typhoid, measles

(under development)

CARD

Rheonix, Inc.

Targets:

- HPV diagnosis

- Detection of

specific gene

sequences

Page 4: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Moore’s Law of Microfluidics:

Valve Density Doubles Every 4 Months

Source: Fluidigm Corporation (http://www.fluidigm.com/images/mlaw_lg.jpg)

Page 5: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Moore’s Law of Microfluidics:

Valve Density Doubles Every 4 Months

Source: Fluidigm Corporation (http://www.fluidigm.com/didIFC.htm)

Page 6: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Current Practice: Manage Gate-Level

Details from Design to Operation

• For every change in the experiment or the chip design:

1. Manually draw in AutoCAD 2. Operate each gate from LabView

fabricate

chip

Page 7: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Abstraction Layers for Microfluidics

C

x86

Pentium III,

Pentium IV

Silicon Analog

transistors,

registers, …

Fluidic Instruction Set Architecture (ISA)- primitives for I/O, storage, transport, mixing

Protocol Description Language - architecture-independent protocol description

Fluidic Hardware Primitives- valves, multiplexers, mixers, latches

chip 1 chip 2 chip 3

Page 8: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Abstraction Layers for Microfluidics

Fluidic Instruction Set Architecture (ISA)- primitives for I/O, storage, transport, mixing

Protocol Description Language - architecture-independent protocol description

Fluidic Hardware Primitives- valves, multiplexers, mixers, latches

chip 1 chip 2 chip 3

BioCoder Language[J.Bio.Eng. 2010]

Contributions

Optimized Compilation[Natural Computing 2007]

Demonstrate Portability[DNA 2006]

Micado AutoCAD Plugin[MIT 2008, ICCD 2009]

Digital Sample Control

Using Soft Lithography[Lab on a Chip ‗06]

Page 9: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

• Continuous flow of fluids (or

droplets) through fixed channels [Whitesides, Quake, Thorsen, …]

• Pro:– Smaller, more precise sample sizes

– Made-to-order availability [Stanford]

– More traction in biology community

Droplets vs. Continuous Flow

• Digital manipulation of droplets

on an electrode array [Chakrabarty, Fair, Gascoyne, Kim, …]

• Pro:– Reconfigurable routing

– Electrical control

– More traction in CAD communitySource: Chakrabarty et al, Duke University

Page 10: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Primitive 1: A Valve (Quake et al.)

Control

Layer

Flow

Layer

0. Start with mask of channels

Page 11: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Primitive 1: A Valve (Quake et al.)

Control

Layer

Flow

Layer

1. Deposit pattern on silicon wafer

Page 12: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Primitive 1: A Valve (Quake et al.)

Control

Layer

Flow

Layer

2. Pour PDMS over mold- polydimexylsiloxane: “soft lithography”

Thick layer (poured)

Thin layer (spin-coated)

Page 13: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Primitive 1: A Valve (Quake et al.)

Control

Layer

Flow

Layer

3. Bake at 80° C (primary cure),

then release PDMS from mold

Page 14: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Primitive 1: A Valve (Quake et al.)

Control

Layer

Flow

Layer

4a. Punch hole in control channel

4b. Attach flow layer to glass slide

Page 15: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Primitive 1: A Valve (Quake et al.)

Control

Layer

Flow

Layer

5. Align flow layer over control layer

Page 16: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Primitive 1: A Valve (Quake et al.)

Control

Layer

Flow

Layer

6. Bake at 80° C (secondary cure)

Page 17: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Primitive 1: A Valve (Quake et al.)

Control

Layer

Flow

Layer

pressure

actuator

7. When pressure is high, control

channel pinches flow channel to

form a valve

Page 18: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Primitive 2: A Multiplexer (Thorsen et al.)

flow layer

control layerBit 2 Bit 1 Bit 0

0 1 0 1 0 1

Input

Output 0

Output 7

Output 6

Output 5

Output 4

Output 3

Output 2

Output 1

• Control lines can cross

flow lines- Only thick parts make valves

• Logic is not

complimentary

• To control n flow lines,

need 2 log2 n control lines

Page 19: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Primitive 2: A Multiplexer (Thorsen et al.)

Bit 2 Bit 1 Bit 0

0 1 0 1 0 1

Input

Output 0

Output 7

Output 6

Output 5

Output 4

Output 3

Output 2

Output 1

Example: select 3 = 011

flow layer

control layer

• Control lines can cross

flow lines- Only thick parts make valves

• Logic is not

complimentary

• To control n flow lines,

need 2 log2 n control lines

Page 20: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Primitive 2: A Multiplexer (Thorsen et al.)

Bit 2 Bit 1 Bit 0

0 1 0 1 0 1

Input

Output 0

Output 7

Output 6

Output 5

Output 4

Output 3

Output 2

Output 1

Example: select 3 = 011

flow layer

control layer

• Control lines can cross

flow lines- Only thick parts make valves

• Logic is not

complimentary

• To control n flow lines,

need 2 log2 n control lines

Page 21: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Primitive 2: A Multiplexer (Thorsen et al.)

Bit 2 Bit 1 Bit 0

0 1 0 1 0 1

Input

Output 0

Output 7

Output 6

Output 5

Output 4

Output 3

Output 2

Output 1

Example: select 3 = 011

flow layer

control layer

• Control lines can cross

flow lines- Only thick parts make valves

• Logic is not

complimentary

• To control n flow lines,

need 2 log2 n control lines

Page 22: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Primitive 3: A Mixer (Quake et al.)

1. Load sample on bottom

2. Load sample on top

3. Peristaltic pumping

Rotary Mixing

Page 23: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Primitive 4: A Latch (Our contribution)

• Purpose: align sample with specific location on device

– Examples: end of storage cell, end of mixer, middle of sensor

• Latches are implemented as a partially closed valve

– Background flow passes freely

– Aqueous samples are caught

Sample Latch

Page 24: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Primitive 4: A Latch (Our contribution)

• Purpose: align sample with specific location on device

– Examples: end of storage cell, end of mixer, middle of sensor

• Latches are implemented as a partially closed valve

– Background flow passes freely

– Aqueous samples are caught

Sample Latch

Page 25: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Primitive 5: Cell Trap

• Several methods for confining cells in microfluidic chips

– U-shaped weirs - C-shaped rings / microseives

– Holographic optical traps - Dialectrophoresis

• In our chips: U-Shaped Microseives in PDMS Chambers

Source: Wang, Kim, Marquez, and Thorsen, Lab on a Chip 2007

Page 26: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Primitive 6: Imaging and Detection

• As PDMS chips are translucent,

contents can be imaged directly

– Fluorescence, color, opacity, etc.

• Feedback can be used to

drive the experiment

Page 27: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Abstraction Layers for Microfluidics

Fluidic Instruction Set Architecture (ISA)- primitives for I/O, storage, transport, mixing

Protocol Description Language - architecture-independent protocol description

Fluidic Hardware Primitives- valves, multiplexers, mixers, latches

chip 1 chip 2 chip 3

Page 28: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Driving Applications

1. What are the best indicators for oocyte viability?

- With Mark Johnson‘s and

Todd Thorsen‘s groups

- During in-vitro fertilization,

monitor cell metabolites and

select healthiest embryo for implantation

2. How do mammalian signal transduction pathways

respond to complex inputs?

- With Jeremy Gunawardena‘s

and Todd Thorsen‘s groups

- Isolate cells and stimulate with

square wave, sine wave, etc.

Page 29: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Driving Applications

1. What are the best indicators for oocyte viability?

- With Mark Johnson‘s and

Todd Thorsen‘s groups

- During in-vitro fertilization,

monitor cell metabolites and

select healthiest embryo for implantation

2. How do mammalian signal transduction pathways

respond to complex inputs?

- With Jeremy Gunawardena‘s

and Todd Thorsen‘s groups

- Isolate cells and stimulate with

square wave, sine wave, etc.

Video courtesy David Craig

Page 30: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

CAD Tools for Microfluidic Chips

• Goal: automate placement, routing, control of

microfluidic features

• Why is this different than electronic CAD?

Page 31: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

CAD Tools for Microfluidic Chips

• Goal: automate placement, routing, control of

microfluidic features

• Why is this different than electronic CAD?

1. Control ports (I/O pins) are bottleneck to scalability

– Pressurized control signals cannot yet be generated on-chip

– Thus, each logical set of valves requires its own I/O port

2. Control signals correlated due to continuous flows

Demand & opportunity for minimizing control logic

pipelined flow continuous flow

Page 32: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Our Technique:

Automatic Generation of Control Layer

Page 33: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Our Technique:

Automatic Generation of Control Layer

1. Describe Fluidic ISA

Page 34: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Our Technique:

Automatic Generation of Control Layer

1. Describe Fluidic ISA

Page 35: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Our Technique:

Automatic Generation of Control Layer

1. Describe Fluidic ISA

Page 36: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Our Technique:

Automatic Generation of Control Layer

1. Describe Fluidic ISA

2. Infer control valves

Page 37: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Our Technique:

Automatic Generation of Control Layer

1. Describe Fluidic ISA

2. Infer control valves

Page 38: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Our Technique:

Automatic Generation of Control Layer

1. Describe Fluidic ISA

2. Infer control valves

3. Infer control sharing

Page 39: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Our Technique:

Automatic Generation of Control Layer

1. Describe Fluidic ISA

2. Infer control valves

3. Infer control sharing

Page 40: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Our Technique:

Automatic Generation of Control Layer

1. Describe Fluidic ISA

2. Infer control valves

3. Infer control sharing

4. Route valves to control ports

Page 41: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Our Technique:

Automatic Generation of Control Layer

1. Describe Fluidic ISA

2. Infer control valves

3. Infer control sharing

4. Route valves to control ports

Page 42: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Our Technique:

Automatic Generation of Control Layer

1. Describe Fluidic ISA

2. Infer control valves

3. Infer control sharing

4. Route valves to control ports

Page 43: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Our Technique:

Automatic Generation of Control Layer

1. Describe Fluidic ISA

2. Infer control valves

3. Infer control sharing

4. Route valves to control ports

5. Generate an interactive GUI

Page 44: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Our Technique:

Automatic Generation of Control Layer

1. Describe Fluidic ISA

2. Infer control valves

3. Infer control sharing

4. Route valves to control ports

5. Generate an interactive GUI

Page 45: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Our Technique:

Automatic Generation of Control Layer

1. Describe Fluidic ISA

2. Infer control valves

3. Infer control sharing

4. Route valves to control ports

5. Generate an interactive GUI

Page 46: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Our Technique:

Automatic Generation of Control Layer

1. Describe Fluidic ISA

2. Infer control valves

3. Infer control sharing

4. Route valves to control ports

5. Generate an interactive GUI

Page 47: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

1. Describe a Fluidic ISA

• Hierarchical and composable flow declarations

Sequential flow P1 P2

AND-flow F1 Λ F2

OR-flow F1 \/ F2

Mixing mix(F)

Pumped flow pump(F)

P1 P2

F1

F2

F1

F2or

F

F

F1

F2

Page 48: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

1. Describe a Fluidic ISA

Page 49: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

1. Describe a Fluidic ISA

mix-and-store (S1, S2, D) {

1. in1 top out

2. in2 bot out

3. mix(top bot-left

bot-right top)

4. wash bot-right

top bot-left store

}

50x real-time

Page 50: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

2. Infer Control Valves

Page 51: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

2. Infer Control Valves

Page 52: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

2. Infer Control Valves

Page 53: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

3. Infer Control Sharing

Page 54: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

3. Infer Control Sharing

Page 55: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

3. Infer Control Sharing

Page 56: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

3. Infer Control Sharing

Page 57: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

3. Infer Control Sharing

Page 58: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

3. Infer Control Sharing

Page 59: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

3. Infer Control Sharing

Page 60: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

3. Infer Control Sharing

Page 61: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

3. Infer Control Sharing

Column Compatibility Problem

- NP-hard

- Reducible to graph coloring

Page 62: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

3. Infer Control Sharing

Column Compatibility Problem

- NP-hard

- Reducible to graph coloring

Page 63: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

3. Infer Control Sharing

Column Compatibility Problem

- NP-hard

- Reducible to graph coloring

Page 64: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

3. Infer Control Sharing

Column Compatibility Problem

- NP-hard

- Reducible to graph coloring

Page 65: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

4. Route Valves to Control Ports

• Build on recent algorithm

for simultaneous pin

assignment & routing [Xiang et al., 2001]

• Idea: min cost - max flow

from valves to ports

• Our contribution: extend algorithm to allow sharing

– Previous capacity constraint on each edge:

– Modified capacity constraint on each edge:

Solve with linear programming, allowing sharing where beneficial

f1 + f2 + f3 + f4 + f5 + f6 ≤ 1

max(f1, f4) + max(f2 , f3) + f5 + f6 ≤ 1

Page 66: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

4. Route Valves to Control Ports

• Build on recent algorithm

for simultaneous pin

assignment & routing [Xiang et al., 2001]

• Idea: min cost - max flow

from valves to ports

• Our contribution: extend algorithm to allow sharing

– Previous capacity constraint on each edge:

– Modified capacity constraint on each edge:

Solve with linear programming, allowing sharing where beneficial

f1 + f2 + f3 + f4 + f5 + f6 ≤ 1

max(f1, f4) + max(f2 , f3) + f5 + f6 ≤ 1

Page 67: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Micado: An AutoCAD Plugin

• Implements ISA, control inference, routing, GUI export

– Using slightly older algorithms

than presented here [Amin ‗08]

– Parameterized design rules

– Incremental construction of chips

• Realistic use by at least 3

microfluidic researchers

• Freely available at:

http://groups.csail.mit.edu/cag/micado/

Page 68: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Cell Culture with Waveform Generator

Courtesy David Craig

Page 69: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Cell Culture with Waveform Generator

Courtesy David Craig

Page 70: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Embryonic Cell Culture

Courtesy J.P. Urbanski

Page 71: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Embryonic Cell Culture

Courtesy J.P. Urbanski

Page 72: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Metabolite Detector

Courtesy J.P. Urbanski

Page 73: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Metabolite Detector

Courtesy J.P. Urbanski

Page 74: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Open Problems

• Automate the design of the flow layer

– Hardware description language for microfluidics

– Define parameterized and reusable modules

• Replicate and pack a primitive as densely as possible

– How many cell cultures can you fit on a chip?

• Support additional primitives and functionality

– Metering volumes

– Sieve valves

– Alternate mixers

– Separation primitives

– …

Page 75: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Conclusions: Microfludics CAD

• Microfluidics represents a rich newplayground for CAD researchers

• Two immediate goals:

– Enable designs to scale

– Enable non-experts to design own chips

• Micado is a first step towards these goals

– Hierarchical ISA for microfluidics

– Inference and minimization of control logic

– Routing shared channels to control ports

– Generation of an interactive GUI

http://groups.csail.mit.edu/cag/micado/

Courtesy J.P. Urbanski

Page 76: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Abstraction Layers for Microfluidics

Fluidic Instruction Set Architecture (ISA)- primitives for I/O, storage, transport, mixing

Protocol Description Language - architecture-independent protocol description

Fluidic Hardware Primitives- valves, multiplexers, mixers, latches

chip 1 chip 2 chip 3

Page 77: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Toward “General Purpose”

Microfluidic Chips

Inputs

Outp

uts

Fluidic

Storage

(RAM)

In

Out

Mixing

Chambers

Inputs

Outp

uts

Fluidic

Storage

(RAM)

In

Out

Mixing

Chambers

Sensors

and

Actuators

Inputs

Outp

uts

Fluidic

Storage

(RAM)

In

Out

Mixing

Chambers

Inputs

Outp

uts

Fluidic

Storage

(RAM)

In

Out

Mixing

Chambers

Sensors

and

Actuators

Page 78: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

A Digital Architecture

• Recent techniques can control independent samples

– Droplet-based samples

– Continuous-flow samples

– Microfluidic latches

• In abstract machine, all

samples have unit volume

– Input/output a sample

– Store a sample

– Operate on a sample

• Challenge for a digital architecture: fluid loss

– No chip is perfect – will lose some volume over time

– Causes: imprecise valves, adhesion to channels, evaporation, ...

– How to maintain digital abstraction?

[Fair et al.]

[Our contribution]

[Our contribution]

Inputs

Outp

uts

Fluidic

Storage

(RAM)

In

Out

Mixing

Chambers

Inputs

Outp

uts

Fluidic

Storage

(RAM)

In

Out

Mixing

Chambers

Sensors

and

Actuators

Inputs

Outp

uts

Fluidic

Storage

(RAM)

In

Out

Mixing

Chambers

Inputs

Outp

uts

Fluidic

Storage

(RAM)

In

Out

Mixing

Chambers

Sensors

and

Actuators

Page 79: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Maintaining a Digital Abstraction

Page 80: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Maintaining a Digital Abstraction

Instruction Set

Architecture (ISA)

High-Level

Language

Hardware

Electronics Microfluidics

Replenish charge

(GAIN)

Loss of charge

Randomized

Gates [Palem]

Soft error

Handling?

Replenish fluids?- Maybe (e.g., with water)

- But may affect chemistry

Loss of fluids

? ? ?

? ? ?

Expose loss in ISA- Compiler deals with it

Expose loss in language- User deals with it

Page 81: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Towards a Fluidic ISA

• Microfluidic chips have various mixing technologies

– Electrokinetic mixing

– Droplet mixing

– Rotary mixing

• Common attributes:

– Ability to mix two samples in equal proportions, store result

• Fluidic ISA: mix (int src1, int src2, int dst)

– Ex: mix(1, 2, 3)

– To allow for lossy transport, only 1 unit of mixture retained

[Quake et al.]

[Fair et al.]

[Levitan et al.]

Storage Cells

1

2

3

4

Mixer

Page 82: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Implementation: Oil-Driven Chip

Inputs Storage Cells Background Phase Wash Phase Mixing

Chip 1 2 8 Oil — Rotary

Page 83: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Implementation: Oil-Driven Chip

Inputs Storage Cells Background Phase Wash Phase Mixing

Chip 1 2 8 Oil — Rotary

mix (S1, S2, D) {

1. Load S1

2. Load S2

3. Rotary mixing

4. Store into D

}

50x real-time

Page 84: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Implementation 2: Air-Driven Chip

Inputs Storage Cells Background Phase Wash Phase Mixing

Chip 1 2 8 Oil — Rotary

Chip 2 4 32 Air Water In channels

Page 85: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Implementation 2: Air-Driven Chip

mix (S1, S2, D) {

1. Load S1

2. Load S2

3. Mix / Store into D

4. Wash S1

5. Wash S2

}

Inputs Storage Cells Background Phase Wash Phase Mixing

Chip 1 2 8 Oil — Rotary

Chip 2 4 32 Air Water In channels

50x real-time

Page 86: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

“Write Once, Run Anywhere”

• Example: Gradient generation

• Hidden from programmer:

– Location of fluids

– Details of mixing, I/O

– Logic of valve control

– Timing of chip operations450 Valve Operations

Fluid yellow = input (0);

Fluid blue = input(1);

for (int i=0; i<=4; i++) {

mix(yellow, 1-i/4, blue, i/4);

}

Page 87: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

450 Valve Operations

• Example: Gradient generation

• Hidden from programmer:

– Location of fluids

– Details of mixing, I/O

– Logic of valve control

– Timing of chip operations

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

Fluid yellow = input (0);

Fluid blue = input(1);

for (int i=0; i<=4; i++) {

mix(yellow, 1-i/4, blue, i/4);

}

“Write Once, Run Anywhere”

Page 88: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

• Example: Gradient generation

• Hidden from programmer:

– Location of fluids

– Details of mixing, I/O

– Logic of valve control

– Timing of chip operations

Fluid yellow = input (0);

Fluid blue = input(1);

for (int i=0; i<=4; i++) {

mix(yellow, 1-i/4, blue, i/4);

}

“Write Once, Run Anywhere”

450 Valve Operations

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

Page 89: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

“Write Once, Run Anywhere”

Direct Control- 450 valve actuations

- only works on 1 chip

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

Page 90: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

Gradient Generation in Fluidic ISA

input(0, 0);

input(1, 1);

input(0, 2);

mix(1, 2, 3);

input(0, 2);

mix(2, 3, 1);

input(1, 3);

input(0, 4);

mix(3, 4, 2);

input(1, 3);

input(0, 4);

mix(3, 4, 5);

input(1, 4);

mix(4, 5, 3);

mix(0, 4);

Direct Control- 450 valve actuations

- only works on 1 chip

Fluidic ISA- 15 instructions

- portable across chips

abstraction

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

setValve(0, HIGH); setValve(1, HIGH);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, LOW);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, LOW); setValve(11, HIGH);

setValve(12, LOW); setValve(13, HIGH);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, LOW); setValve(17, LOW);

setValve(18, LOW); setValve(19, LOW);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

wait(2000);

setValve(14, HIGH); setValve(2, LOW);

wait(1000);

setValve(4, HIGH); setValve(12, LOW);

setValve(16, HIGH); setValve(18, HIGH);

setValve(19, LOW);

wait(2000);

setValve(0, LOW); setValve(1, LOW);

setValve(2, LOW); setValve(3, HIGH);

setValve(4, LOW); setValve(5, HIGH);

setValve(6, HIGH); setValve(7, LOW);

setValve(8, LOW); setValve(9, HIGH);

setValve(10, HIGH); setValve(11, LOW);

setValve(12, LOW); setValve(13, LOW);

setValve(14, LOW); setValve(15, HIGH);

setValve(16, HIGH); setValve(17, LOW);

setValve(18, HIGH); setValve(19, LOW);

Page 91: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Fluid[] out = new Fluid[8];

Fluid yellow, blue, green;

out[0] = input(0);

yellow = input(0);

blue = input(1);

green = mix(yellow, blue);

yellow = input(0);

out[1] = mix(yellow, green);

yellow = input(0);

blue = input(1);

out[2] = mix(yellow, blue);

yellow = input(0);

blue = input(1);

green = mix(yellow, blue);

blue = input(1);

out[3] = mix(blue, green);

out[4] = input(1);

Abstraction 1: Managing Fluidic Storage

• Programmer uses location-independent Fluid variables

– Runtime system assigns & tracks location of each Fluid

– Comparable to automatic memory management (e.g., Java)

Fluidic

ISA

1. Storage

Management

input(0, 0);

input(1, 1);

input(0, 2);

mix(1, 2, 3);

input(0, 2);

mix(2, 3, 1);

input(1, 3);

input(0, 4);

mix(3, 4, 2);

input(1, 3);

input(0, 4);

mix(3, 4, 5);

input(1, 4);

mix(4, 5, 3);

mix(0, 4);

Page 92: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Fluid[] out = new Fluid[8];

Fluid yellow = input(0);

Fluid blue = input(1);

Fluid green = mix(yellow, blue);

out[0] = yellow;

out[1] = mix(yellow, green);

out[2] = green;

out[3] = mix(blue, green);

out[4] = blue;

Fluid[] out = new Fluid[8];

Fluid yellow, blue, green;

out[0] = input(0);

yellow = input(0);

blue = input(1);

green = mix(yellow, blue);

yellow = input(0);

out[1] = mix(yellow, green);

yellow = input(0);

blue = input(1);

out[2] = mix(yellow, blue);

yellow = input(0);

blue = input(1);

green = mix(yellow, blue);

blue = input(1);

out[3] = mix(blue, green);

out[4] = input(1);

Abstraction 2: Fluid Re-Generation

2. Fluid Re-Generation

• Programmer may use a Fluid variable multiple times

– Each time, a physical Fluid is consumed on-chip

– Runtime system re-generates Fluids from computation history

Page 93: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Abstraction 3: Arbitrary Mixing

• Allows mixing fluids in any proportion, not just 50/50

– Fluid mix (Fluid F1, float p1, Fluid f2, float F2)

Returns Fluid that is p1 parts F1 and p2 parts F2

– Runtime system translates to 50/50 mixes in Fluidic ISA

– Note: some mixtures only reachable within error tolerance

Fluid[] out = new Fluid[8];

Fluid yellow = input (0);

Fluid blue = input (1);

out[0] = yellow;

out[1] = mix(yellow, 3/4, blue, 1/4);

out[2] = mix(yellow, 1/2, blue, 1/2);

out[3] = mix(yellow, 1/4, blue, 3/4);

out[4] = blue;

3. Arbitrary Mixing

Fluid[] out = new Fluid[8];

Fluid yellow = input(0);

Fluid blue = input(1);

Fluid green = mix(yellow, blue);

out[0] = yellow;

out[1] = mix(yellow, green);

out[2] = green;

out[3] = mix(blue, green);

out[4] = blue;

2. Fluid Re-Generation

Page 94: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Abstraction 3: Arbitrary Mixing

Fluid[] out = new Fluid[8];

Fluid yellow = input (0);

Fluid blue = input (1);

for (int i=0; i<=4; i++) {

out[i] = mix(yellow, 1-i/4, blue, i/4);

}

• Allows mixing fluids in any proportion, not just 50/50

– Fluid mix (Fluid F1, float p1, Fluid f2, float F2)

Returns Fluid that is p1 parts F1 and p2 parts F2

– Runtime system translates to 50/50 mixes in Fluidic ISA

– Note: some mixtures only reachable within error tolerance

4. Parameterized Mixing

Fluid[] out = new Fluid[8];

Fluid yellow = input (0);

Fluid blue = input (1);

out[0] = yellow;

out[1] = mix(yellow, 3/4, blue, 1/4);

out[2] = mix(yellow, 1/2, blue, 1/2);

out[3] = mix(yellow, 1/4, blue, 3/4);

out[4] = blue;

3. Arbitrary Mixing

Page 95: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Algorithms for Efficient Mixing

• Mixing is fundamental operation of microfluidics

– Prepare samples for analysis

– Dilute concentrated substances

– Control reagant volumes

• How to synthesize complex mixture using simple steps?

– Many systems support only 50/50 mixers

– Should minimize number of mixes, reagent usage

– Note: some mixtures only reachable within error tolerance

• N

Analogous to ALU operations on microprocessors

Interesting scheduling and optimization problem

Page 96: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Why Not Binary Search?

0 13/8

1/41/2

1/23/8 5 inputs, 4 mixes

Page 97: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Why Not Binary Search?

0 13/8

3/41/2

3/8

4 inputs, 3 mixes

1/41/2

1/23/8 5 inputs, 4 mixes

Page 98: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Min-Mix Algorithm

• Simple algorithm yields minimal number of mixes

– For any number of reagents, to any reachable concentration

– Also minimizes reagent usage on certain chips

Page 99: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

1. The mixing process can be represented by a tree.

Min-Mix Algorithm: Key Insights

BA

B

A

5/8 A, 3/8 B

Page 100: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

1. The mixing process can be represented by a tree.

2. The contribution of an input sample to the overall mixture

is 2-d, where d is the depth of the sample in the tree

Min-Mix Algorithm: Key Insights

BA

B

A

5/8 A, 3/8 B

d

3

2

1

2-d

1/8

1/4

1/2

Page 101: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

1. The mixing process can be represented by a tree.

2. The contribution of an input sample to the overall mixture

is 2-d, where d is the depth of the sample in the tree

3. In the optimal mixing tree, a reagent appears at depths

corresponding to the binary representation of its overall

concentration.

Min-Mix Algorithm: Key Insights

BA

B

A

5/8 A, 3/8 B

d

3

2

1

2-d

1/8

1/4

1/2

3 = 011

0

1

1

5 = 101

1

0

1

Page 102: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Min-Mix Algorithm

• Example: mix 5/16 A, 7/16 B, 4/16 C

• To mix k fluids with precision 1/n:

– Min-mix algorithm: O(k log n) mixes

– Binary search: O(k n) mixes

4

3

2

1

B CA

B

A B

A

A

B

B

B

C

1/16

1/8

1/4

1/2

2-dd

A=5 B=7 C=4

=0101 =0111 =0100

[Natural Computing 2007]

Page 103: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Related Work

• Algorithms for microfluidic sample preparation [Sudip Roy et al.]

• Aquacore – builds on our work, ISA + architecture [Amin et al.]

• Automatic scheduling of biology protocols

– EDNAC computer for automatically solving 3-SAT [Johnson]

– Compile SAT to microfluidic chips [Landweber et al.] [van Noort]

– Mapping sequence graphs to grid-based chips [Su/Chakrabarty]

• Custom microfluidic chips for biological computation

– DNA computing [Grover & Mathies] [van Noort et al.] [McCaskill] [Livstone,

Weiss, & Landweber] [Gehani & Reif] [Farfel & Stefanovic]

– Self-assembly [Somei, Kaneda, Fujii, & Murata] [Whitesides et al.]

• General-purpose microfluidic chips

– Using electrowetting, with flexible mixing [Fair et al.]

– Using dialectrophoresis, with retargettable GUI [Gascoyne et al.]

– Using Braille displays as programmable actuators [Gu et al.]

Page 104: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Conclusions: Fluidic ISA

• Fluidic ISA gives flexibility to evolve underlying

hardware

– Including various device technologies

• It remains to be seen to what degree the functionality of

chips can be standardized

– May need to reconsider abstractions for analog machines

• Opportunities for future work

– Rich extensions to mixing algorithms

– Schedule separate protocols onto shared hardware,

maximizing utilization of shared resource (e.g., thermocycler)

– Parallelize single protocol across people or chips

– Dynamic optimization of slow co-processors (lazy vectorization)?

Page 105: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Abstraction Layers for Microfluidics

Fluidic Instruction Set Architecture (ISA)- primitives for I/O, storage, transport, mixing

Protocol Description Language - architecture-independent protocol description

Fluidic Hardware Primitives- valves, multiplexers, mixers, latches

chip 1 chip 2 chip 3

Page 106: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization
Page 107: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

―Immunological detection ... was carried out as

described in the Boehringer digoxigenin-nucleic

acid detection kit with some modifications.‖

Page 108: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

- Main paper

- Ref. papers

- References

Papers from Nature, Spring 2010

Page 109: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Problems with Existing

Descriptions of Protocols

• Incomplete

– Cascading references several levels deep

– Some information missing completely

• Ambiguous

– One word can refer to many things

– E.g., ―inoculate‖ a culture

• Non-uniform

– Different words can refer to the same thing

– E.g., ―harvest‖, ―pellet down‖, ―centrifuge‖ are equivalent

• Not suitable for automation

Page 110: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

BioCoder: A High-Level Programming

Language for Biology Protocols

1. Enable automation

via microfluidic chips

2. Improve reproducibility

of manual experiments

In biology publications, can we replace the textual

description of the methods used with a computer program?

Page 111: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Related Work

• EXACT: EXperimental ACTions ontology as a formal

representation for biology protocols [Soldatova et al., 2009]

• Robot Scientist: functional genomics driven by

macroscopic laboratory automation [King et al., 2004]

• PoBol: RDF-based data exchange standard for BioBricks

Page 112: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

The BioCoder Language

• BioCoder is a protocol language for reuse & automation

– Independent of chip or laboratory setup

– Initial focus: molecular biology

• Implemented as a C library

– Used to express 65 protocols, 5800 lines of code

– Restricted backend: automatic execution on microfluidic chips

– General backend: emit readable instructions for human

• Validation

– Used to direct actions of scientists in the lab (IISc)

– Used to control microfluidic chips (MIT)

– Standardizing online Wiki; interest from Berkeley, UW, UMN…

Page 113: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

• Declaration / measurement / disposal- declare_fluid

- declare_column

- measure_sample

- measure_fluid

- volume

- discard

- transfer

- transfer_column

- declare_tissue

• Combination / mixing- combine

- mix

- combine_and_mix

- addto_column

- mixing_table

• Centrifugation- centrifuge_pellet

- centrifuge_phases

- centrifuge_column

• Temperature- set_temp

- use_or_store

- autoclave

• Timing- wait

- time_constraint

- store_until

- inoculation

- invert_dry

• Detection- ce_detect

- gas_chromatography

- nanodrop

- electrophoresis

- mount_observe_slide

- sequencing

BioCoder Language Primitives

Page 114: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

FluidSample f1 = measure_and_add(f0, lysis_buffer, 100*uL);

FluidSample f2 = mix(f1, INVERT, 4, 6);

time_constraint(f1, 2*MINUTES, next_step);

Example: Plasmid DNA Extraction

I. Original protocol (Source: Klavins Lab)

II. BioCoder code

III. Auto-generated text output

Add 100 ul of 7X Lysis Buffer (Blue) and mix by inverting the tube

4-6 times. Proceed to step 3 within 2 minutes.

Add 100 ul of 7X Lysis Buffer (Blue).

Invert the tube 4-6 times.

NOTE: Proceed to the next step within 2 mins.

Page 115: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Example: Plasmid DNA Extraction

Auto-Generated

Dependence Graph

Page 116: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

1. Data Types

Sample

FluidSample SolidSample

Stock

Fluid Solid

conceptually infinite volume finite volume

measure instruction

Can measure symbolic volume

which is resolved by compiler /

runtime system depending on

eventual uses

declare_fluid

instruction

other instructions

Page 117: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

2. Standardizing Ad-Hoc Language

• Need to convert qualitative words to quantitative scale

• Example: a common scale for mixing

– When a protocol says ―mix‖, it could mean many things

– Level 1: tap

– Level 2: stir

– Level 3: invert

– Level 4: vortex / resuspend / dissolve

• Similar issues with temperature, timing, opacity, …

Page 118: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

3. Separating Instructions from Hints

• How to translate abstract directions?

– ―Remove the medium by aspiration, leaving the bacterial pellet

as dry as possible.‖

• Hints provide tutorial or self-check information

– Can be ignored if rest of protocol is executed correctly

• Separating instructions and hints keeps language

tractable

– Small number of precise instructions

– Extensible set of hints

Centrifuge(&medium, ...);

hint(pellet_dry)

Aspirate and remove medium.

Leave the pellet as dry as possible.

Page 119: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

4. Generating Readable Instructions

• In typical programming languages, aim to define the

minimal set of orthogonal primitives

• However, for generating readable protocols, separating

primitives can detract from readability

Original: ―Mix the sample with 1uL restriction enzyme.‖

BioStream with orthogonal primitives:

FluidSample s1 = measure(&restriction_enzyme, 1*uL);

FluidSample s2 = combine(&sample, &s1);

mix(s2, vortex);

Measure out 1uL of restriction enzyme.

Combine the sample with the restriction enzyme.

Mix the combined sample by vortexing.

Page 120: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

4. Generating Readable Instructions

• In typical programming languages, aim to define the

minimal set of orthogonal primitives

• However, for generating readable protocols, separating

primitives can detract from readability

Original: ―Mix the sample with 1uL restriction enzyme.‖

BioStream with compound primitives:

combine_and_mix(&restriction_enzyme, 1*uL,

&sample, vortex);

Add 1uL restriction enzyme and mix by vortexing.

Page 121: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

4. Generating Readable Instructions

• In typical programming languages, aim to define the

minimal set of orthogonal primitives

• However, for generating readable protocols, separating

primitives can detract from readability

Original: ―Mix the sample with 1uL restriction enzyme.‖

BioStream with compound primitives:

combine_and_mix(&restriction_enzyme, 1*uL,

&sample, vortex);

Add 1uL restriction enzyme and mix by vortexing.

• General approaches:

– Detect combined operations with policies (peekhole optimizer)

– Define a standard library that combines primitive operations

Page 122: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

4. Generating Readable Instructions

mixing_table_pcr(7,20,array_pcr,initial_conc,

final_conc,vol);

Page 123: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

5. Timing Constraints

• Precise timing is critical for many biology protocols

– Minimum delay: cell growth, enzyme digest, denaturing, etc.

– Maximum delay: avoid precipitation, photobleaching, etc.

– Exact delay: regular measurements, synchronized steps, etc.

• May require parallel execution

– Fluid f1 = mix(…); useBetween(f1, 10, 10);

– Fluid f2 = mix(…); useBetween(f2, 10, 10);

– Fluid f3 = mix(f1, f2);

f1 f2

f3

1010

Page 124: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Benchmark Suite

65 protocols

5800 LOC

Page 125: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Plasmid DNA Extraction

214 lines

Page 126: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

PCR

73 lines

repeat

thermocycling

Page 127: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Molecular Barcodes

200 lines

Preparation

+ PCR (2)

Page 128: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

DNA Sequencing

144 linesPreparation

PCR

Analysis

PCR PCR PCR

Page 129: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Instruction Usage

Page 130: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Validating the Language

• Eventual validation: automatic execution

– But BioCoder more capable than most chips today

– Need to decouple language research from microfluidics research

• Initial validation: human execution

– In collaboration with Prof. Utpal Nath‘s lab at IISc

– Target Plant DNA Isolation, common task for summer intern

Biologist is never exposed to original lab notes

• To the best of our knowledge, first execution of a real

biology protocol from a portable programming language

Original

Lab Notes

BioCoder

Code

Auto-Generated

Protocol

Execution

in Lab

Page 131: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

3. Add 1.5 vol. CTAB to each MCT and vortex. Incubate at 65°

C for 10-30 mins

4. Add 1 vol. Phenol:chloroform:isoamylalcohol: 48:48:4 and

vortex thoroughly

5. Centrifuge at 13000g at room temperature for 5 mins

6. Transfer aqueous (upper) layer to clean MCT and

repeat the extraction using chloroform: Isoamyalcohol: 96:4

Exposing Ambiguity in Original Protocols

?

Coding protocols in precise language removes

ambiguity and enables consistency checking

Page 132: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Growing a Community

Page 133: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Growing a Community

Page 134: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Growing a Community

Page 135: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Future Work

• Backends for BioStream

– Generate graphical protocol

– Generate a microfluidic chip to perform protocol

• Reliability and troubleshooting

– Verify that protocol is safe, correct, obeys timing constraints

– If protocol fails, automatically suggest troubleshooting routine

• Building a knowledge base

– Encode experimental results in addition to protocols

– Search for a protocol based on input/output relationship

– Revision control for biology protocols

Page 136: Microfluidic Biochips: Design, Programming, and Optimizationbillthies.net/microfluidics-kolkata-web.pdf · 2011-03-14 · Microfluidic Biochips: Design, Programming, and Optimization

Conclusions

• Abstraction layers forprogrammable microfluidics

– Microfluidic CAD tools

– General-purpose chips

– Fluidic ISA

– BioCoder language

• Vision for microfluidics:everyone uses standard chip

• Vision for software:a defacto language for experimental science

– Download a colleague‘s code, run it on your chip

– Compose modules and libraries to enable complex experiments

that are impossible to perform today