Figures were created by running xgrow and using the EXPORT feature, then loading the tile arrangement into Matlab as a matrix, and running a script to generate a PostScript file. Fig. 2a: xgrow sierpinski_diag_noseed_preborder T=2 Fig. 2b: xgrow sierpinski_diag_noseed_preborder Gmc=17 Gse=8.8 addflakes=128,128,1:20 Fig. 2c: xgrow sierpinski_diag-symmetric-slowborder Gmc=17 Gse=8.6 addflakes=128,128,1:20 Simulations in Supplementary Fig. 1ab used the same tile set and parameters. Fig. 2d: xgrow XOR Gmc=25 Gse=18 Using the GUI, the simulation was run until an assembly spontaneously nucleated and grew to roughly 20x20 tiles. Then Gse was reduced to 12.7 to encourage dissociation of erroneous tiles; the simulation was paused when a roughly 10x10 tile assembly with no errors was obtained. Gse was increased to 13 and the simulation continued until the roughly 65x65 error-free assembly was obtained. Fig. 2e: xgrow XOR Gmc=17 Gse=10.4 The simulation was stopped when a roughly 65x65 assembly was obtained. Fig. 2f: xgrow XOR-symmetric Gmc=17 Gse=10.4 Using the GUI, the simulation was run until an assembly spontaneously nucleated and grew to roughly 20x20 tiles. Then Gse was reduced to 8.4 to encourage dissociation of erroneous tiles; the simulation was paused when a roughly 10x10 tile assembly with no errors was obtained. Gse was increased to 8.6 and the simulation continued until a roughly 65x65 assembly was obtained. Supplementary Fig. 1c: xgrow XOR-symmetric Gmc=17 Gse=10.4 block=10 size=64 seed=32,32,1 Using the GUI, the simulation was stopped at size approximately 2000 tiles.