tProc v2 ASM Cheatsheet
This cheatsheet is for the tProcessor v2 (72-bit instructions, 32-bit registers). For the complete reference manual, see tProcessor v2 - reference manual.
Quick Reference
Operation |
Assembly Code |
|---|---|
Load immediate to register |
|
Copy register to register |
|
Load from DMEM |
|
Store to DMEM |
|
Load waveform from WMEM |
|
Store waveform to WMEM |
|
Write data port |
|
Write trigger |
|
Write wave port |
|
Read input port |
|
Conditional jump |
|
Call subroutine |
|
Return from subroutine |
|
Wait for time |
|
Wait for division |
|
Wait for ARITH (no WAIT macro; poll manually) |
|
Wait for input data |
|
Start division |
|
Start multiply (ARITH) |
|
Multiply-accumulate |
|
Set internal flag |
|
Clear internal flag |
|
Reset time |
|
Increment reference time |
|
Clear peripheral flag |
|
No operation |
|
Condition Codes
Code |
Condition |
Use Case |
|---|---|---|
|
Zero (result == 0) |
Check if counter reached zero |
|
Non-zero (result != 0) |
Loop while counter > 0 |
|
Negative (result < 0) |
Check threshold crossing |
|
Non-negative (result >= 0) |
Opposite of S |
|
Flag set |
Wait for external trigger |
|
Flag clear |
Wait for flag to clear |
Address Modes
Mode |
Syntax |
Example |
|---|---|---|
Literal (DMEM) |
|
|
Register (DMEM) |
|
|
Indexed literal (DMEM) |
|
|
Indexed register (DMEM) |
|
|
Literal (WMEM) |
|
|
Register (WMEM) |
|
|
Python Examples
Basic program loading:
import numpy as np
from qick import *
from qick.tprocv2_assembler import Assembler
soc = QickSoc()
asm_code = """
REG_WR r0 imm #100
DPORT_WR p0 reg r0 @1000
.END
"""
# 1. Assembly
_, bin_arr = Assembler.str_asm2bin(asm_code)
# 2. Convert to ndarray int32 (N,8) -- must be int32, the assembler
# packs each 72-bit instruction into three ints (two 32-bit + one 8-bit)
buff = np.array(bin_arr, dtype=np.int32)
# 3. Load in pmem
soc.tproc.load_mem('pmem', buff, check=False)
# 4. Execute
soc.tproc.start()
Waveform loading and playback:
# Load waveform to WMEM using the correct method for tProc V2
def pack_waveform(freq, phase, env, gain, length, conf):
"""Pack waveform parameters into 8-word (256-bit) format for tProc WMEM"""
wave = np.zeros(8, dtype=np.int32)
wave[0] = freq & 0xFFFFFFFF # 32-bit frequency
wave[1] = phase & 0xFFFFFFFF # 32-bit phase
wave[2] = env & 0xFFFFFF # 24-bit envelope index (w_env)
wave[3] = gain & 0xFFFFFFFF # 32-bit gain
wave[4] = length & 0xFFFFFFFF # 32-bit length
wave[5] = conf & 0xFFFF # 16-bit config (w_conf)
return wave.reshape(1, 8)
# Create and pack waveform
waveform_data = pack_waveform(
freq=100_000_000, # 100 MHz
phase=0,
env=0,
gain=32768, # 1.0 (max)
length=1024,
conf=0
)
# Load waveform to WMEM (tProc V2 method)
soc.tproc.load_mem('wmem', waveform_data, addr=0, check=False)
# Assembly program to play waveform (corrected syntax)
asm_code = """
WAIT time @1000 ; Wait for 1000 clock cycles
WPORT_WR p0 wmem [&0] ; Play waveform directly from WMEM address 0
.END
"""
# Assemble and run
_, bin_arr = Assembler.str_asm2bin(asm_code)
buff = np.array(bin_arr, dtype=np.int32)
soc.tproc.load_mem('pmem', buff, check=False)
soc.tproc.start()
Feedback Example (read ADC, conditional output)
asm_feedback = """
LOOP:
WAIT port_dt
DPORT_RD p0
TEST -op(s_port_l - #32768) -uf
JUMP LOAD_HIGH -if(NS)
JUMP LOAD_LOW -if(S)
LOAD_HIGH:
REG_WR r_wave wmem [&0]
WPORT_WR p0 r_wave @1000
JUMP NEXT
LOAD_LOW:
REG_WR r_wave wmem [&1]
WPORT_WR p0 r_wave @1000
JUMP NEXT
NEXT:
JUMP LOOP
.END
"""
Optional, adding a counter (iterations)
asm_feedback_with_counter = """
DMEM_WR [&0] imm #100
LOOP:
WAIT port_dt
DPORT_RD p0
TEST -op(s_port_l - #32768) -uf
JUMP LOAD_HIGH -if(NS)
JUMP LOAD_LOW -if(S)
LOAD_HIGH:
REG_WR r_wave wmem [&0]
WPORT_WR p0 r_wave @1000
JUMP DEC
LOAD_LOW:
REG_WR r_wave wmem [&1]
WPORT_WR p0 r_wave @1000
JUMP DEC
DEC:
DMEM_WR [&0] imm #99
JUMP LOOP
.END
"""