Skip to content

Instantly share code, notes, and snippets.

@y2kbugger
Created December 26, 2025 06:32
Show Gist options
  • Select an option

  • Save y2kbugger/213912550ab7599e27b56a017bc94ad5 to your computer and use it in GitHub Desktop.

Select an option

Save y2kbugger/213912550ab7599e27b56a017bc94ad5 to your computer and use it in GitHub Desktop.
Rabinowitz–Wagon base-10 spigot algorithm for π, running on LC3 emulator written in sql

Benchmark

Just time the sqlite script on the command line.

time sqlite3 :memory: < PISPIGOT69.sql

Output

Runtime error near line 1289: HALT encountered (19)
Calculated first 69 digits of pi: 314159265358979323846264338327950288419716939937510582097494459230781
Ran for 8464947 clock cycles before halting.

real    0m45.428s
user    0m45.151s
sys     0m0.167s

Methodolgy

  1. The algorithm is first written in ASM
  2. ASM is assembled to machine code
  3. A harness instanciates cpu emulator in SQLite tables and TRIGGERs
  4. The harness loads the machine code into the virtual machines memory via INSERTs
  5. The cpu is clocked via a recursive cte until HALTed
  6. Then we can just trace out the db connection to distill to pure sql script.
CREATE TABLE msgout (msg TEXT, channel TEXT);
CREATE TABLE signal(
exe BOOLEAN,
is_running BOOLEAN,
instr INT
);
INSERT INTO signal VALUES (
FALSE,
FALSE,
0
);
CREATE TABLE register(
id INT PRIMARY KEY,
value INT
);
INSERT INTO register VALUES
(0, 0), -- R0
(1, 0), -- R1
(2, 0), -- R2
(3, 0), -- R3
(4, 0), -- R4
(5, 0), -- R5
(6, 0), -- R6
(7, 0), -- R7
(32, 0), -- PC
(64, 0);
-- COND
CREATE TABLE memory(
address INT UNIQUE,
value INT
);
CREATE TABLE clkt(
value INT
);
;
pragma recursive_triggers = 1;
-- ################################
-- CLK Falling edge detection
-- ################################
DROP TRIGGER IF EXISTS clk_trigger;
CREATE TRIGGER clk_trigger
AFTER INSERT ON clkt
BEGIN
UPDATE signal
SET instr = (
(SELECT value FROM memory WHERE address = (SELECT value FROM register WHERE id = 32))
);
END;
-- ################################
-- ## Instruction Handlers
-- ################################
-- ## Catchall
DROP TRIGGER IF EXISTS instr_trigger;
CREATE TRIGGER instr_trigger
BEFORE UPDATE OF instr ON signal
BEGIN
UPDATE register
SET value = value + 1
WHERE id = 32;
END;
-- ## HLT ##
DROP TRIGGER IF EXISTS instr_hlt_trigger;
CREATE TRIGGER instr_hlt_trigger
AFTER UPDATE OF instr ON signal
WHEN NEW.instr = 0xF025
BEGIN
UPDATE signal SET is_running = 0;
SELECT RAISE(FAIL, 'HALT encountered');
END;
-- ## TRAP x25 (PUTS) ##
DROP TRIGGER IF EXISTS instr_puts_trigger;
CREATE TRIGGER instr_puts_trigger
AFTER UPDATE OF instr ON signal
WHEN NEW.instr = 0xF022
BEGIN
-- PUTS implementation: read characters until null terminator
INSERT INTO msgout
SELECT group_concat(char(value), ''), 'output'
FROM (
SELECT value
FROM memory
WHERE address >= (SELECT value FROM register WHERE id = 0)
AND address < COALESCE(
(SELECT MIN(address) FROM memory
WHERE address >= (SELECT value FROM register WHERE id = 0)
AND value = 0),
0x10000) -- if no null terminator, go all the way!
ORDER BY address
);
END;
-- ## TRAP x21 (OUT)
DROP TRIGGER IF EXISTS instr_trap_out_trigger;
CREATE TRIGGER instr_trap_out_trigger
AFTER UPDATE OF instr ON signal
WHEN NEW.instr = 0xF021
BEGIN
INSERT INTO msgout (msg, channel)
VALUES (
char((SELECT value FROM register WHERE id = 0) & 0xFF),
'output'
);
END;
-- ## TRAP - All -- triggers are LIFO, so this runs BEFORE SPECIFIC##
DROP TRIGGER IF EXISTS instr_trap_trigger;
CREATE TRIGGER instr_trap_trigger
AFTER UPDATE OF instr ON signal
WHEN NEW.instr & 0xFF00 = 0xF000
BEGIN
UPDATE register
SET value = (SELECT value FROM register WHERE id = 32) + 1
WHERE id = 7; -- R7 gets the return address (next instruction after TRAP)
END;
-- ## ADD ##
DROP TRIGGER IF EXISTS instr_add_trigger;
CREATE TRIGGER instr_add_trigger
AFTER UPDATE OF instr ON signal
WHEN NEW.instr & 0xF000 = 0x1000
BEGIN
UPDATE register
SET value = ((SELECT value FROM register WHERE id = (NEW.instr >> 6) & 0x7) -- SR1
+ (CASE
WHEN (NEW.instr & 0x0020) != 0 THEN -- immediate mode (bit 5 set)
CASE
WHEN (NEW.instr & 0x0010) != 0 THEN -- sign extend negative imm5
(NEW.instr & 0x001F) | 0xFFE0
ELSE
(NEW.instr & 0x001F) -- positive imm5 unchanged
END
ELSE -- register mode (bit 5 clear)
(SELECT value FROM register WHERE id = NEW.instr & 0x7) -- SR2
END)) & 0xFFFF -- wrap at 16-bit
WHERE id = (NEW.instr >> 9) & 0x7; -- destination register DR
UPDATE register
SET value = (CASE
WHEN (SELECT value FROM register WHERE id = (NEW.instr >> 9) & 0x7) = 0 THEN 2 -- Z
WHEN (SELECT value FROM register WHERE id = (NEW.instr >> 9) & 0x7) >> 15 == 0 THEN 1 -- P
ELSE 4 -- N
END)
WHERE id = 64;
END;
-- ## AND ##
DROP TRIGGER IF EXISTS instr_and_trigger;
CREATE TRIGGER instr_and_trigger
AFTER UPDATE OF instr ON signal
WHEN NEW.instr & 0xF000 = 0x5000
BEGIN
UPDATE register
SET value = ((SELECT value FROM register WHERE id = (NEW.instr >> 6) & 0x7) -- SR1
& (CASE
WHEN (NEW.instr & 0x0020) != 0 THEN -- immediate mode (bit 5 set)
CASE
WHEN (NEW.instr & 0x0010) != 0 THEN -- sign extend negative imm5
(NEW.instr & 0x001F) | 0xFFE0
ELSE
(NEW.instr & 0x001F) -- positive imm5 unchanged
END
ELSE -- register mode (bit 5 clear)
(SELECT value FROM register WHERE id = NEW.instr & 0x7) -- SR2
END)) & 0xFFFF -- wrap at 16-bit
WHERE id = (NEW.instr >> 9) & 0x7; -- destination register DR
UPDATE register
SET value = (CASE
WHEN (SELECT value FROM register WHERE id = (NEW.instr >> 9) & 0x7) = 0 THEN 2 -- Z
WHEN (SELECT value FROM register WHERE id = (NEW.instr >> 9) & 0x7) >> 15 == 0 THEN 1 -- P
ELSE 4 -- N
END)
WHERE id = 64;
END;
-- ## NOT ##
DROP TRIGGER IF EXISTS instr_not_trigger;
CREATE TRIGGER instr_not_trigger
AFTER UPDATE OF instr ON signal
WHEN NEW.instr & 0xF000 = 0x9000
BEGIN
UPDATE register
SET value = (0xFFFF - (SELECT value FROM register WHERE id = (NEW.instr >> 6) & 0x7)) & 0xFFFF
WHERE id = (NEW.instr >> 9) & 0x7;
UPDATE register
SET value = (CASE
WHEN (SELECT value FROM register WHERE id = (NEW.instr >> 9) & 0x7) = 0 THEN 2 -- Z
WHEN (SELECT value FROM register WHERE id = (NEW.instr >> 9) & 0x7) >> 15 == 0 THEN 1 -- P
ELSE 4 -- N
END)
WHERE id = 64;
END;
-- ## BR ##
DROP TRIGGER IF EXISTS instr_br_trigger;
CREATE TRIGGER instr_br_trigger
AFTER UPDATE OF instr ON signal
WHEN NEW.instr & 0xF000 = 0x0000
BEGIN
UPDATE register
SET value = (SELECT value FROM register WHERE id = 32) +
(CASE
WHEN ((NEW.instr & 0x0800) != 0 AND (SELECT value FROM register WHERE id = 64) = 4) OR -- n AND N
((NEW.instr & 0x0400) != 0 AND (SELECT value FROM register WHERE id = 64) = 2) OR -- z AND Z
((NEW.instr & 0x0200) != 0 AND (SELECT value FROM register WHERE id = 64) = 1) -- p AND P
THEN
CASE
WHEN (NEW.instr & 0x0100) != 0 THEN -- sign extend negative offset
(NEW.instr & 0x01FF) | 0xFE00
ELSE
(NEW.instr & 0x01FF) -- positive offset unchanged
END
ELSE
0 -- no branch, PC already incremented
END) & 0xFFFF
WHERE id = 32;
END;
-- ## JSR / JSRR ##
DROP TRIGGER IF EXISTS instr_jsr_trigger;
CREATE TRIGGER instr_jsr_trigger
AFTER UPDATE OF instr ON signal
WHEN NEW.instr & 0xF000 = 0x4000
BEGIN
-- Capture the incremented PC as the return address
UPDATE register
SET value = (SELECT value FROM register WHERE id = 32)
WHERE id = 7;
-- Dispatch based on addressing mode
UPDATE register
SET value = (
CASE
WHEN (NEW.instr & 0x0800) != 0 THEN -- JSR, PC-relative
((SELECT value FROM register WHERE id = 7) +
(CASE
WHEN (NEW.instr & 0x0400) != 0 THEN -- sign extend negative offset11
(NEW.instr & 0x07FF) | 0xF800
ELSE
(NEW.instr & 0x07FF)
END)) & 0xFFFF
ELSE -- JSRR, register indirect
(SELECT value FROM register WHERE id = (NEW.instr >> 6) & 0x7)
END)
WHERE id = 32;
END;
-- ## JMP / RET ##
DROP TRIGGER IF EXISTS instr_jmp_trigger;
CREATE TRIGGER instr_jmp_trigger
AFTER UPDATE OF instr ON signal
WHEN NEW.instr & 0xF000 = 0xC000
BEGIN
UPDATE register
SET value = (SELECT value FROM register WHERE id = (NEW.instr >> 6) & 0x7)
WHERE id = 32;
END;
-- ## LD ##
DROP TRIGGER IF EXISTS instr_ld_trigger;
CREATE TRIGGER instr_ld_trigger
AFTER UPDATE OF instr ON signal
WHEN NEW.instr & 0xF000 = 0x2000
BEGIN
UPDATE register
SET value = (SELECT COALESCE(value, 0) FROM memory
WHERE address = ((CASE
WHEN (NEW.instr & 0x0100) != 0 THEN
(NEW.instr & 0x01FF) | 0xFE00 -- sign extend negative offset
ELSE
(NEW.instr & 0x01FF) -- positive offset unchanged
END)
+ (SELECT value FROM register WHERE id = 32)) & 0xFFFF) -- PC + offset, wrap at 16-bit
WHERE id = (NEW.instr >> 9) & 0x7; -- destination register DR
UPDATE register
SET value = (CASE
WHEN (SELECT value FROM register WHERE id = (NEW.instr >> 9) & 0x7) = 0 THEN 2 -- Z
WHEN (SELECT value FROM register WHERE id = (NEW.instr >> 9) & 0x7) >> 15 == 0 THEN 1 -- P
ELSE 4 -- N
END)
WHERE id = 64;
END;
-- ## LDI ##
DROP TRIGGER IF EXISTS instr_ldi_trigger;
CREATE TRIGGER instr_ldi_trigger
AFTER UPDATE OF instr ON signal
WHEN NEW.instr & 0xF000 = 0xA000
BEGIN
UPDATE register
SET value = (
SELECT COALESCE(value, 0) FROM memory
WHERE address = (
SELECT COALESCE(value, 0) FROM memory
WHERE address = ((CASE
WHEN (NEW.instr & 0x0100) != 0 THEN
(NEW.instr & 0x01FF) | 0xFE00 -- sign extend negative offset
ELSE
(NEW.instr & 0x01FF) -- positive offset unchanged
END)
+ (SELECT value FROM register WHERE id = 32)) & 0xFFFF)
)
WHERE id = (NEW.instr >> 9) & 0x7;
UPDATE register
SET value = (CASE
WHEN (SELECT value FROM register WHERE id = (NEW.instr >> 9) & 0x7) = 0 THEN 2 -- Z
WHEN (SELECT value FROM register WHERE id = (NEW.instr >> 9) & 0x7) >> 15 == 0 THEN 1 -- P
ELSE 4 -- N
END)
WHERE id = 64;
END;
-- ## LDR ##
DROP TRIGGER IF EXISTS instr_ldr_trigger;
CREATE TRIGGER instr_ldr_trigger
AFTER UPDATE OF instr ON signal
WHEN NEW.instr & 0xF000 = 0x6000
BEGIN
UPDATE register
SET value = (SELECT COALESCE(value, 0) FROM memory
WHERE address = ((SELECT value FROM register WHERE id = (NEW.instr >> 6) & 0x7)
+ CASE
WHEN (NEW.instr & 0x0020) != 0 THEN
(NEW.instr & 0x003F) | 0xFFC0
ELSE
(NEW.instr & 0x003F)
END) & 0xFFFF)
WHERE id = (NEW.instr >> 9) & 0x7;
UPDATE register
SET value = (CASE
WHEN (SELECT value FROM register WHERE id = (NEW.instr >> 9) & 0x7) = 0 THEN 2 -- Z
WHEN (SELECT value FROM register WHERE id = (NEW.instr >> 9) & 0x7) >> 15 == 0 THEN 1 -- P
ELSE 4 -- N
END)
WHERE id = 64;
END;
-- ## LEA ##
DROP TRIGGER IF EXISTS instr_lea_trigger;
CREATE TRIGGER instr_lea_trigger
AFTER UPDATE OF instr ON signal
WHEN NEW.instr & 0xF000 = 0xE000
BEGIN
UPDATE register
SET value = ((CASE
WHEN (NEW.instr & 0x0100) != 0 THEN
(NEW.instr & 0x01FF) | 0xFE00
ELSE
(NEW.instr & 0x01FF)
END)
+ (SELECT value FROM register WHERE id = 32)) & 0xFFFF
WHERE id = (NEW.instr >> 9) & 0x7;
UPDATE register
SET value = (CASE
WHEN (SELECT value FROM register WHERE id = (NEW.instr >> 9) & 0x7) = 0 THEN 2 -- Z
WHEN (SELECT value FROM register WHERE id = (NEW.instr >> 9) & 0x7) >> 15 == 0 THEN 1 -- P
ELSE 4 -- N
END)
WHERE id = 64;
END;
-- ## ST ##
DROP TRIGGER IF EXISTS instr_st_trigger;
CREATE TRIGGER instr_st_trigger
AFTER UPDATE OF instr ON signal
WHEN NEW.instr & 0xF000 = 0x3000
BEGIN
INSERT OR REPLACE INTO memory (address, value)
VALUES (
((CASE
WHEN (NEW.instr & 0x0100) != 0 THEN
(NEW.instr & 0x01FF) | 0xFE00 -- sign extend negative offset
ELSE
(NEW.instr & 0x01FF) -- positive offset unchanged
END)
+ (SELECT value FROM register WHERE id = 32)) & 0xFFFF, -- PC + offset, wrap at 16-bit
(SELECT value FROM register WHERE id = (NEW.instr >> 9) & 0x7) -- source register SR
);
END;
-- ## STI ##
DROP TRIGGER IF EXISTS instr_sti_trigger;
CREATE TRIGGER instr_sti_trigger
AFTER UPDATE OF instr ON signal
WHEN NEW.instr & 0xF000 = 0xB000
BEGIN
INSERT OR REPLACE INTO memory (address, value)
VALUES (
(
SELECT COALESCE(value, 0)
FROM memory
WHERE address = (
((CASE
WHEN (NEW.instr & 0x0100) != 0 THEN
(NEW.instr & 0x01FF) | 0xFE00
ELSE
(NEW.instr & 0x01FF)
END)
+ (SELECT value FROM register WHERE id = 32)) & 0xFFFF
)
) & 0xFFFF,
(SELECT value FROM register WHERE id = (NEW.instr >> 9) & 0x7)
);
END;
-- ## STR ##
DROP TRIGGER IF EXISTS instr_str_trigger;
CREATE TRIGGER instr_str_trigger
AFTER UPDATE OF instr ON signal
WHEN NEW.instr & 0xF000 = 0x7000
BEGIN
INSERT OR REPLACE INTO memory (address, value)
VALUES (
((SELECT value FROM register WHERE id = (NEW.instr >> 6) & 0x7)
+ CASE
WHEN (NEW.instr & 0x0020) != 0 THEN
(NEW.instr & 0x003F) | 0xFFC0
ELSE
(NEW.instr & 0x003F)
END) & 0xFFFF,
(SELECT value FROM register WHERE id = (NEW.instr >> 9) & 0x7)
);
END;
BEGIN;
INSERT INTO memory (address, value) VALUES (12288, 20512);
INSERT INTO memory (address, value) VALUES (12289, 4130);
INSERT INTO memory (address, value) VALUES (12290, 57976);
INSERT INTO memory (address, value) VALUES (12291, 9327);
INSERT INTO memory (address, value) VALUES (12292, 28736);
INSERT INTO memory (address, value) VALUES (12293, 4705);
INSERT INTO memory (address, value) VALUES (12294, 5311);
INSERT INTO memory (address, value) VALUES (12295, 1020);
INSERT INTO memory (address, value) VALUES (12296, 57970);
INSERT INTO memory (address, value) VALUES (12297, 9321);
INSERT INTO memory (address, value) VALUES (12298, 24640);
INSERT INTO memory (address, value) VALUES (12299, 5632);
INSERT INTO memory (address, value) VALUES (12300, 6339);
INSERT INTO memory (address, value) VALUES (12301, 6404);
INSERT INTO memory (address, value) VALUES (12302, 5828);
INSERT INTO memory (address, value) VALUES (12303, 30272);
INSERT INTO memory (address, value) VALUES (12304, 4705);
INSERT INTO memory (address, value) VALUES (12305, 5311);
INSERT INTO memory (address, value) VALUES (12306, 1015);
INSERT INTO memory (address, value) VALUES (12307, 57959);
INSERT INTO memory (address, value) VALUES (12308, 9311);
INSERT INTO memory (address, value) VALUES (12309, 4674);
INSERT INTO memory (address, value) VALUES (12310, 9308);
INSERT INTO memory (address, value) VALUES (12311, 22240);
INSERT INTO memory (address, value) VALUES (12312, 24640);
INSERT INTO memory (address, value) VALUES (12313, 23392);
INSERT INTO memory (address, value) VALUES (12314, 7328);
INSERT INTO memory (address, value) VALUES (12315, 1027);
INSERT INTO memory (address, value) VALUES (12316, 6979);
INSERT INTO memory (address, value) VALUES (12317, 7615);
INSERT INTO memory (address, value) VALUES (12318, 4092);
INSERT INTO memory (address, value) VALUES (12319, 4101);
INSERT INTO memory (address, value) VALUES (12320, 6274);
INSERT INTO memory (address, value) VALUES (12321, 6463);
INSERT INTO memory (address, value) VALUES (12322, 23968);
INSERT INTO memory (address, value) VALUES (12323, 40767);
INSERT INTO memory (address, value) VALUES (12324, 8161);
INSERT INTO memory (address, value) VALUES (12325, 6663);
INSERT INTO memory (address, value) VALUES (12326, 2051);
INSERT INTO memory (address, value) VALUES (12327, 4103);
INSERT INTO memory (address, value) VALUES (12328, 7585);
INSERT INTO memory (address, value) VALUES (12329, 4091);
INSERT INTO memory (address, value) VALUES (12330, 28736);
INSERT INTO memory (address, value) VALUES (12331, 6048);
INSERT INTO memory (address, value) VALUES (12332, 4735);
INSERT INTO memory (address, value) VALUES (12333, 5311);
INSERT INTO memory (address, value) VALUES (12334, 1001);
INSERT INTO memory (address, value) VALUES (12335, 13898);
INSERT INTO memory (address, value) VALUES (12336, 8265);
INSERT INTO memory (address, value) VALUES (12337, 57929);
INSERT INTO memory (address, value) VALUES (12338, 21664);
INSERT INTO memory (address, value) VALUES (12339, 22240);
INSERT INTO memory (address, value) VALUES (12340, 5878);
INSERT INTO memory (address, value) VALUES (12341, 6147);
INSERT INTO memory (address, value) VALUES (12342, 2051);
INSERT INTO memory (address, value) VALUES (12343, 4099);
INSERT INTO memory (address, value) VALUES (12344, 5281);
INSERT INTO memory (address, value) VALUES (12345, 4091);
INSERT INTO memory (address, value) VALUES (12346, 28736);
INSERT INTO memory (address, value) VALUES (12347, 13373);
INSERT INTO memory (address, value) VALUES (12348, 8764);
INSERT INTO memory (address, value) VALUES (12349, 9273);
INSERT INTO memory (address, value) VALUES (12350, 8249);
INSERT INTO memory (address, value) VALUES (12351, 5751);
INSERT INTO memory (address, value) VALUES (12352, 2563);
INSERT INTO memory (address, value) VALUES (12353, 5281);
INSERT INTO memory (address, value) VALUES (12354, 13364);
INSERT INTO memory (address, value) VALUES (12355, 3618);
INSERT INTO memory (address, value) VALUES (12356, 5750);
INSERT INTO memory (address, value) VALUES (12357, 2574);
INSERT INTO memory (address, value) VALUES (12358, 4129);
INSERT INTO memory (address, value) VALUES (12359, 10793);
INSERT INTO memory (address, value) VALUES (12360, 4101);
INSERT INTO memory (address, value) VALUES (12361, 61473);
INSERT INTO memory (address, value) VALUES (12362, 6304);
INSERT INTO memory (address, value) VALUES (12363, 1028);
INSERT INTO memory (address, value) VALUES (12364, 8228);
INSERT INTO memory (address, value) VALUES (12365, 61473);
INSERT INTO memory (address, value) VALUES (12366, 6463);
INSERT INTO memory (address, value) VALUES (12367, 4091);
INSERT INTO memory (address, value) VALUES (12368, 20512);
INSERT INTO memory (address, value) VALUES (12369, 12326);
INSERT INTO memory (address, value) VALUES (12370, 12324);
INSERT INTO memory (address, value) VALUES (12371, 3602);
INSERT INTO memory (address, value) VALUES (12372, 9761);
INSERT INTO memory (address, value) VALUES (12373, 1028);
INSERT INTO memory (address, value) VALUES (12374, 22240);
INSERT INTO memory (address, value) VALUES (12375, 13854);
INSERT INTO memory (address, value) VALUES (12376, 12831);
INSERT INTO memory (address, value) VALUES (12377, 3596);
INSERT INTO memory (address, value) VALUES (12378, 10774);
INSERT INTO memory (address, value) VALUES (12379, 4101);
INSERT INTO memory (address, value) VALUES (12380, 61473);
INSERT INTO memory (address, value) VALUES (12381, 6304);
INSERT INTO memory (address, value) VALUES (12382, 1028);
INSERT INTO memory (address, value) VALUES (12383, 8210);
INSERT INTO memory (address, value) VALUES (12384, 61473);
INSERT INTO memory (address, value) VALUES (12385, 6463);
INSERT INTO memory (address, value) VALUES (12386, 4091);
INSERT INTO memory (address, value) VALUES (12387, 12820);
INSERT INTO memory (address, value) VALUES (12388, 20512);
INSERT INTO memory (address, value) VALUES (12389, 12305);
INSERT INTO memory (address, value) VALUES (12390, 8206);
INSERT INTO memory (address, value) VALUES (12391, 4159);
INSERT INTO memory (address, value) VALUES (12392, 12300);
INSERT INTO memory (address, value) VALUES (12393, 513);
INSERT INTO memory (address, value) VALUES (12394, 3585);
INSERT INTO memory (address, value) VALUES (12395, 3996);
INSERT INTO memory (address, value) VALUES (12396, 8203);
INSERT INTO memory (address, value) VALUES (12397, 10755);
INSERT INTO memory (address, value) VALUES (12398, 4101);
INSERT INTO memory (address, value) VALUES (12399, 61473);
INSERT INTO memory (address, value) VALUES (12400, 61477);
INSERT INTO memory (address, value) VALUES (12401, 48);
INSERT INTO memory (address, value) VALUES (12402, 57);
INSERT INTO memory (address, value) VALUES (12403, 230);
INSERT INTO memory (address, value) VALUES (12404, 229);
INSERT INTO memory (address, value) VALUES (12405, 69);
INSERT INTO memory (address, value) VALUES (12406, 1);
INSERT INTO memory (address, value) VALUES (12407, 0);
INSERT INTO memory (address, value) VALUES (12408, 0);
INSERT INTO memory (address, value) VALUES (12409, 0);
INSERT INTO memory (address, value) VALUES (12410, 0);
INSERT INTO memory (address, value) VALUES (12411, 0);
INSERT INTO memory (address, value) VALUES (12412, 0);
INSERT INTO memory (address, value) VALUES (12413, 0);
INSERT INTO memory (address, value) VALUES (12414, 0);
INSERT INTO memory (address, value) VALUES (12415, 0);
INSERT INTO memory (address, value) VALUES (12416, 0);
INSERT INTO memory (address, value) VALUES (12417, 0);
INSERT INTO memory (address, value) VALUES (12418, 0);
INSERT INTO memory (address, value) VALUES (12419, 0);
INSERT INTO memory (address, value) VALUES (12420, 0);
INSERT INTO memory (address, value) VALUES (12421, 0);
INSERT INTO memory (address, value) VALUES (12422, 0);
INSERT INTO memory (address, value) VALUES (12423, 0);
INSERT INTO memory (address, value) VALUES (12424, 0);
INSERT INTO memory (address, value) VALUES (12425, 0);
INSERT INTO memory (address, value) VALUES (12426, 0);
INSERT INTO memory (address, value) VALUES (12427, 0);
INSERT INTO memory (address, value) VALUES (12428, 0);
INSERT INTO memory (address, value) VALUES (12429, 0);
INSERT INTO memory (address, value) VALUES (12430, 0);
INSERT INTO memory (address, value) VALUES (12431, 0);
INSERT INTO memory (address, value) VALUES (12432, 0);
INSERT INTO memory (address, value) VALUES (12433, 0);
INSERT INTO memory (address, value) VALUES (12434, 0);
INSERT INTO memory (address, value) VALUES (12435, 0);
INSERT INTO memory (address, value) VALUES (12436, 0);
INSERT INTO memory (address, value) VALUES (12437, 0);
INSERT INTO memory (address, value) VALUES (12438, 0);
INSERT INTO memory (address, value) VALUES (12439, 0);
INSERT INTO memory (address, value) VALUES (12440, 0);
INSERT INTO memory (address, value) VALUES (12441, 0);
INSERT INTO memory (address, value) VALUES (12442, 0);
INSERT INTO memory (address, value) VALUES (12443, 0);
INSERT INTO memory (address, value) VALUES (12444, 0);
INSERT INTO memory (address, value) VALUES (12445, 0);
INSERT INTO memory (address, value) VALUES (12446, 0);
INSERT INTO memory (address, value) VALUES (12447, 0);
INSERT INTO memory (address, value) VALUES (12448, 0);
INSERT INTO memory (address, value) VALUES (12449, 0);
INSERT INTO memory (address, value) VALUES (12450, 0);
INSERT INTO memory (address, value) VALUES (12451, 0);
INSERT INTO memory (address, value) VALUES (12452, 0);
INSERT INTO memory (address, value) VALUES (12453, 0);
INSERT INTO memory (address, value) VALUES (12454, 0);
INSERT INTO memory (address, value) VALUES (12455, 0);
INSERT INTO memory (address, value) VALUES (12456, 0);
INSERT INTO memory (address, value) VALUES (12457, 0);
INSERT INTO memory (address, value) VALUES (12458, 0);
INSERT INTO memory (address, value) VALUES (12459, 0);
INSERT INTO memory (address, value) VALUES (12460, 0);
INSERT INTO memory (address, value) VALUES (12461, 0);
INSERT INTO memory (address, value) VALUES (12462, 0);
INSERT INTO memory (address, value) VALUES (12463, 0);
INSERT INTO memory (address, value) VALUES (12464, 0);
INSERT INTO memory (address, value) VALUES (12465, 0);
INSERT INTO memory (address, value) VALUES (12466, 0);
INSERT INTO memory (address, value) VALUES (12467, 0);
INSERT INTO memory (address, value) VALUES (12468, 0);
INSERT INTO memory (address, value) VALUES (12469, 0);
INSERT INTO memory (address, value) VALUES (12470, 0);
INSERT INTO memory (address, value) VALUES (12471, 0);
INSERT INTO memory (address, value) VALUES (12472, 0);
INSERT INTO memory (address, value) VALUES (12473, 0);
INSERT INTO memory (address, value) VALUES (12474, 0);
INSERT INTO memory (address, value) VALUES (12475, 0);
INSERT INTO memory (address, value) VALUES (12476, 0);
INSERT INTO memory (address, value) VALUES (12477, 0);
INSERT INTO memory (address, value) VALUES (12478, 0);
INSERT INTO memory (address, value) VALUES (12479, 0);
INSERT INTO memory (address, value) VALUES (12480, 0);
INSERT INTO memory (address, value) VALUES (12481, 0);
INSERT INTO memory (address, value) VALUES (12482, 0);
INSERT INTO memory (address, value) VALUES (12483, 0);
INSERT INTO memory (address, value) VALUES (12484, 0);
INSERT INTO memory (address, value) VALUES (12485, 0);
INSERT INTO memory (address, value) VALUES (12486, 0);
INSERT INTO memory (address, value) VALUES (12487, 0);
INSERT INTO memory (address, value) VALUES (12488, 0);
INSERT INTO memory (address, value) VALUES (12489, 0);
INSERT INTO memory (address, value) VALUES (12490, 0);
INSERT INTO memory (address, value) VALUES (12491, 0);
INSERT INTO memory (address, value) VALUES (12492, 0);
INSERT INTO memory (address, value) VALUES (12493, 0);
INSERT INTO memory (address, value) VALUES (12494, 0);
INSERT INTO memory (address, value) VALUES (12495, 0);
INSERT INTO memory (address, value) VALUES (12496, 0);
INSERT INTO memory (address, value) VALUES (12497, 0);
INSERT INTO memory (address, value) VALUES (12498, 0);
INSERT INTO memory (address, value) VALUES (12499, 0);
INSERT INTO memory (address, value) VALUES (12500, 0);
INSERT INTO memory (address, value) VALUES (12501, 0);
INSERT INTO memory (address, value) VALUES (12502, 0);
INSERT INTO memory (address, value) VALUES (12503, 0);
INSERT INTO memory (address, value) VALUES (12504, 0);
INSERT INTO memory (address, value) VALUES (12505, 0);
INSERT INTO memory (address, value) VALUES (12506, 0);
INSERT INTO memory (address, value) VALUES (12507, 0);
INSERT INTO memory (address, value) VALUES (12508, 0);
INSERT INTO memory (address, value) VALUES (12509, 0);
INSERT INTO memory (address, value) VALUES (12510, 0);
INSERT INTO memory (address, value) VALUES (12511, 0);
INSERT INTO memory (address, value) VALUES (12512, 0);
INSERT INTO memory (address, value) VALUES (12513, 0);
INSERT INTO memory (address, value) VALUES (12514, 0);
INSERT INTO memory (address, value) VALUES (12515, 0);
INSERT INTO memory (address, value) VALUES (12516, 0);
INSERT INTO memory (address, value) VALUES (12517, 0);
INSERT INTO memory (address, value) VALUES (12518, 0);
INSERT INTO memory (address, value) VALUES (12519, 0);
INSERT INTO memory (address, value) VALUES (12520, 0);
INSERT INTO memory (address, value) VALUES (12521, 0);
INSERT INTO memory (address, value) VALUES (12522, 0);
INSERT INTO memory (address, value) VALUES (12523, 0);
INSERT INTO memory (address, value) VALUES (12524, 0);
INSERT INTO memory (address, value) VALUES (12525, 0);
INSERT INTO memory (address, value) VALUES (12526, 0);
INSERT INTO memory (address, value) VALUES (12527, 0);
INSERT INTO memory (address, value) VALUES (12528, 0);
INSERT INTO memory (address, value) VALUES (12529, 0);
INSERT INTO memory (address, value) VALUES (12530, 0);
INSERT INTO memory (address, value) VALUES (12531, 0);
INSERT INTO memory (address, value) VALUES (12532, 0);
INSERT INTO memory (address, value) VALUES (12533, 0);
INSERT INTO memory (address, value) VALUES (12534, 0);
INSERT INTO memory (address, value) VALUES (12535, 0);
INSERT INTO memory (address, value) VALUES (12536, 0);
INSERT INTO memory (address, value) VALUES (12537, 0);
INSERT INTO memory (address, value) VALUES (12538, 0);
INSERT INTO memory (address, value) VALUES (12539, 0);
INSERT INTO memory (address, value) VALUES (12540, 0);
INSERT INTO memory (address, value) VALUES (12541, 0);
INSERT INTO memory (address, value) VALUES (12542, 0);
INSERT INTO memory (address, value) VALUES (12543, 0);
INSERT INTO memory (address, value) VALUES (12544, 0);
INSERT INTO memory (address, value) VALUES (12545, 0);
INSERT INTO memory (address, value) VALUES (12546, 0);
INSERT INTO memory (address, value) VALUES (12547, 0);
INSERT INTO memory (address, value) VALUES (12548, 0);
INSERT INTO memory (address, value) VALUES (12549, 0);
INSERT INTO memory (address, value) VALUES (12550, 0);
INSERT INTO memory (address, value) VALUES (12551, 0);
INSERT INTO memory (address, value) VALUES (12552, 0);
INSERT INTO memory (address, value) VALUES (12553, 0);
INSERT INTO memory (address, value) VALUES (12554, 0);
INSERT INTO memory (address, value) VALUES (12555, 0);
INSERT INTO memory (address, value) VALUES (12556, 0);
INSERT INTO memory (address, value) VALUES (12557, 0);
INSERT INTO memory (address, value) VALUES (12558, 0);
INSERT INTO memory (address, value) VALUES (12559, 0);
INSERT INTO memory (address, value) VALUES (12560, 0);
INSERT INTO memory (address, value) VALUES (12561, 0);
INSERT INTO memory (address, value) VALUES (12562, 0);
INSERT INTO memory (address, value) VALUES (12563, 0);
INSERT INTO memory (address, value) VALUES (12564, 0);
INSERT INTO memory (address, value) VALUES (12565, 0);
INSERT INTO memory (address, value) VALUES (12566, 0);
INSERT INTO memory (address, value) VALUES (12567, 0);
INSERT INTO memory (address, value) VALUES (12568, 0);
INSERT INTO memory (address, value) VALUES (12569, 0);
INSERT INTO memory (address, value) VALUES (12570, 0);
INSERT INTO memory (address, value) VALUES (12571, 0);
INSERT INTO memory (address, value) VALUES (12572, 0);
INSERT INTO memory (address, value) VALUES (12573, 0);
INSERT INTO memory (address, value) VALUES (12574, 0);
INSERT INTO memory (address, value) VALUES (12575, 0);
INSERT INTO memory (address, value) VALUES (12576, 0);
INSERT INTO memory (address, value) VALUES (12577, 0);
INSERT INTO memory (address, value) VALUES (12578, 0);
INSERT INTO memory (address, value) VALUES (12579, 0);
INSERT INTO memory (address, value) VALUES (12580, 0);
INSERT INTO memory (address, value) VALUES (12581, 0);
INSERT INTO memory (address, value) VALUES (12582, 0);
INSERT INTO memory (address, value) VALUES (12583, 0);
INSERT INTO memory (address, value) VALUES (12584, 0);
INSERT INTO memory (address, value) VALUES (12585, 0);
INSERT INTO memory (address, value) VALUES (12586, 0);
INSERT INTO memory (address, value) VALUES (12587, 0);
INSERT INTO memory (address, value) VALUES (12588, 0);
INSERT INTO memory (address, value) VALUES (12589, 0);
INSERT INTO memory (address, value) VALUES (12590, 0);
INSERT INTO memory (address, value) VALUES (12591, 0);
INSERT INTO memory (address, value) VALUES (12592, 0);
INSERT INTO memory (address, value) VALUES (12593, 0);
INSERT INTO memory (address, value) VALUES (12594, 0);
INSERT INTO memory (address, value) VALUES (12595, 0);
INSERT INTO memory (address, value) VALUES (12596, 0);
INSERT INTO memory (address, value) VALUES (12597, 0);
INSERT INTO memory (address, value) VALUES (12598, 0);
INSERT INTO memory (address, value) VALUES (12599, 0);
INSERT INTO memory (address, value) VALUES (12600, 0);
INSERT INTO memory (address, value) VALUES (12601, 0);
INSERT INTO memory (address, value) VALUES (12602, 0);
INSERT INTO memory (address, value) VALUES (12603, 0);
INSERT INTO memory (address, value) VALUES (12604, 0);
INSERT INTO memory (address, value) VALUES (12605, 0);
INSERT INTO memory (address, value) VALUES (12606, 0);
INSERT INTO memory (address, value) VALUES (12607, 0);
INSERT INTO memory (address, value) VALUES (12608, 0);
INSERT INTO memory (address, value) VALUES (12609, 0);
INSERT INTO memory (address, value) VALUES (12610, 0);
INSERT INTO memory (address, value) VALUES (12611, 0);
INSERT INTO memory (address, value) VALUES (12612, 0);
INSERT INTO memory (address, value) VALUES (12613, 0);
INSERT INTO memory (address, value) VALUES (12614, 0);
INSERT INTO memory (address, value) VALUES (12615, 0);
INSERT INTO memory (address, value) VALUES (12616, 0);
INSERT INTO memory (address, value) VALUES (12617, 0);
INSERT INTO memory (address, value) VALUES (12618, 0);
INSERT INTO memory (address, value) VALUES (12619, 0);
INSERT INTO memory (address, value) VALUES (12620, 0);
INSERT INTO memory (address, value) VALUES (12621, 0);
INSERT INTO memory (address, value) VALUES (12622, 0);
INSERT INTO memory (address, value) VALUES (12623, 0);
INSERT INTO memory (address, value) VALUES (12624, 0);
INSERT INTO memory (address, value) VALUES (12625, 0);
INSERT INTO memory (address, value) VALUES (12626, 0);
INSERT INTO memory (address, value) VALUES (12627, 0);
INSERT INTO memory (address, value) VALUES (12628, 0);
INSERT INTO memory (address, value) VALUES (12629, 0);
INSERT INTO memory (address, value) VALUES (12630, 0);
INSERT INTO memory (address, value) VALUES (12631, 0);
INSERT INTO memory (address, value) VALUES (12632, 0);
INSERT INTO memory (address, value) VALUES (12633, 0);
INSERT INTO memory (address, value) VALUES (12634, 0);
INSERT INTO memory (address, value) VALUES (12635, 0);
INSERT INTO memory (address, value) VALUES (12636, 0);
INSERT INTO memory (address, value) VALUES (12637, 0);
INSERT INTO memory (address, value) VALUES (12638, 0);
INSERT INTO memory (address, value) VALUES (12639, 0);
INSERT INTO memory (address, value) VALUES (12640, 0);
COMMIT;
BEGIN;
UPDATE register SET value = 0;
DELETE FROM msgout WHERE channel = 'output';
UPDATE signal SET is_running = 1;
COMMIT;
-- step n instructions
BEGIN;
INSERT INTO clkt(value)
SELECT value
FROM generate_series(1, 8500000); -- Try to pick a number close to the required cycles before halting, unused gernerate_series entires still have a cost.
COMMIT;
-- run summary
SELECT 'Calculated first ' || count(*) || ' digits of pi: ' || group_concat(msg, '') FROM msgout WHERE channel = 'output';
SELECT 'Ran for ' || count(*) || ' clock cycles before halting.' FROM clkt;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment