From 81c636fb561999b537eade9184a57bb3dd77a000 Mon Sep 17 00:00:00 2001 From: FallenSigh Date: Fri, 26 Jun 2026 03:39:32 +0800 Subject: [PATCH] perf(matmul): pre-fire DMA Ch0 load + inline wait/DMA start + XOR bank toggle user-sample.c v2 optimizations: - Pre-fire DMA Ch0 load at loop tail to overlap fully with IP compute - Inline wait_matmul_done/wait_dma_done to eliminate function call overhead - Inline DMA register writes, skip redundant STATUS_BUSY_BIT check - Replace g%2 with XOR bank toggle (bank ^= 1) - Cache volatile pointers in locals (ch0, ch1, mat_status, mat_ctrl) Makefile: bump -O2 to -O3 --- sdk/axi_ram.mif | 794 ++++++++++++------------ sdk/software/examples/asm/Makefile | 2 +- sdk/software/examples/asm/user-sample.c | 183 ++++-- sdk/user-sample.bin | Bin 40764 -> 40684 bytes 4 files changed, 508 insertions(+), 471 deletions(-) diff --git a/sdk/axi_ram.mif b/sdk/axi_ram.mif index b47e847..3d0b8c1 100644 --- a/sdk/axi_ram.mif +++ b/sdk/axi_ram.mif @@ -52,7 +52,7 @@ 00000011100000000110000000001101 00000100000000000000000110101100 00011100000000000000000100101100 -00000010100101011111000110001100 +00000010100101001011000110001100 00011100000000000001000000001101 00000010101111001001000110101101 00011100000000000001000000101110 @@ -66,7 +66,7 @@ 00011100000000000001000000001100 00000010100111111011000110001100 00011100000000000001000000101101 -00000010101010111101000110101101 +00000010101010111001000110101101 01101100000000000001000110001101 00101001100000000000000110000000 00000010100000000001000110001100 @@ -94,12 +94,12 @@ 00000000000101010000000000001110 00101001000000000001000110101110 00011100000000000000000000001100 -00000010100011110001000110001100 +00000010100100000001000110001100 00000100000000000011000000101100 00000011100000000000010000001101 00000100000000010001000000101101 00000011100000000001000000001101 -00000100000000000000000110101101 +00000100000000000000000110100000 00000100000000000000010000100000 00010100000000000000000000101101 00000011101111111111110110101101 @@ -154,158 +154,179 @@ 00000010101101101000000010000100 00101001100000001000000001101111 00101001100000001001000001101100 -00101001100000001010000001101110 -00101001100000001011000001101101 00101001100000010111000001100001 -00101001100000010000000001111100 -00101001100000001101000001111111 00101001100000000110000001110001 00101001100000000111000001110000 -00101001100000010110000001110110 +00101001100000001010000001101110 +00101001100000001011000001101101 00101001100000010101000001110111 +00101001100000010110000001110110 00101001100000010100000001111000 00101001100000010011000001111001 00101001100000010010000001111010 00101001100000010001000001111011 +00101001100000010000000001111100 00101001100000001111000001111101 00101001100000001110000001111110 -01010100000001011010010000000000 +00101001100000001101000001111111 +01010100000001010101010000000000 00010101011111101010000000001100 00000011100000000001000110001101 00000010100000000001100000001110 -00000011100000000100000110001100 00101001100000000000000110101110 +00000011100000000100000110001100 00101001100000000000000110000000 -01010100000001010100100000000000 +01010100000001001111100000000000 00101000100000000110000001100110 -00000000000101010000000010011100 +00000000000101010000000010010111 00000010100000000010100000001000 00000010100000100000000000000111 00010100001110001000000000000101 00000000000101010000000000000100 -00011100000000000001000000111111 -00000010101001000011001111111111 -01010100000001000101010000000000 -00101000100000000000001111101100 -01011011111111111111110110000000 -00101000100000001010000001101101 +01010100000001001001110000000000 +00010101011111100110000000001101 +00000011010000000000000000000000 +00101000100000000101000110101100 +00000011010000000000100110001100 +01011011111111111111100110000000 +00000010100000000000100000001110 +00101001100000000101000110101110 +00101000100000001010000001101111 00010101011111101010000000001100 -00101001100000000000001111100000 -00101001100000000000000110001101 -01010100000001010000100000000000 -00000000000100010111000010001100 -00010100001110001000000000011000 +00010100000000000000000000111011 +00101001100000000000000110001111 +01010100000001001010110000000000 +00000000000100010101110010001100 00101001100000000010000001101100 -01010100000001001111100000000000 -00000011100101000000001100011001 +01010100000001001010000000000000 +00010101011111101010000000011100 +00010101011111100110000000010110 +00010100001110001001001110011001 +00010100001110001000000000011000 +00000011100011100010001101101100 00000010100000000000010000011101 -00011100000000000001000000111110 -00000010101000110100001111011110 -00011100000000000001000000110110 -00000010101000110000001011010110 -00000010100000000000010000011011 -00010101011111101010000000011010 +00000011100000000001001110011110 +00000010100000000000100000011010 +00000011100000010000001011011111 00101001100000000011000001100100 +00000011100100000000001100111001 00000011100000100000001100011000 +00101001100000000001000001101100 00000011010000000000011110110111 00000000010000001000101011110111 00000010100000001100000001101100 00000000000100000101110110001100 00101000101111111010000110000110 -00000010101111111111111110101101 +00000010101111111111111110101111 00000010100000000010100000001000 00000010100000100000000000000111 00000000000101010000001100000101 00000000000101010000000000000100 -00000011010000000000010110111100 -01010100000000111101000000000000 +00000011010000000000010111111011 +01010100000000111111110000000000 00101000100000000000001111001100 -01011011111111111111110110000000 -00101001100000000000001111000000 -01011000000000000001001110111011 -00101000100000000000001011001100 -01011011111111111111110110000000 -00101001100000000000001011000000 -00000000010000001000101110001101 +00000011010000000000100110001100 +01011011111111111111100110000000 +00101001100000000000001111011010 +00000010100000000000010000001100 +01011000000000000001011110101100 +00101000100000000101001111101100 +00000011010000000000100110001100 +01011011111111111111100110000000 +00101001100000000101001111111010 +00000000010000001000101101101111 00000010100000001100000001101100 -00000000000100000011010110001101 -00101000101111111100000110100101 +00000000000100000011110110001111 +00101000101111111100000111100101 00000010100000000101000000001000 00000010100000110000000000000111 00000000000101010000001100100110 00000010100000000000010000000100 -01010100000000111001000000000000 -00101000100000000000001111101100 -01011011111111111111110110000000 +01010100000000111011000000000000 +00101000100000000101001011001100 +00000011010000000000100110001100 +01011011111111111111100110000000 00000010100000001100000001101100 +00101001100000000101001011011010 00000000000100000101110110010111 -00101000101111111110001011101101 -00101001100000000000001111100000 +00101000101111111110001011101100 00000010100000000000011110111101 -00000010100000000010100000001100 -00101001100000000000001101001101 00000010100000100000001100011000 +00101001100000000000001110001100 +00101000100000000001000001101100 00000010100000110000001100111001 -01011111111111110110011110101100 -01010100000001000010110000000000 +01011111111111110101011110101100 +01010100000000111011100000000000 00101000100000000011000001101100 -00000000000100010011000010011101 -01010100000001000010000000000000 +00000000000100010011000010011111 +01010100000000111010110000000000 +00010101011111101010000000001110 00000000000101010000000010010111 -00101000100000000000001111001100 -01011011111111111111110110000000 -00101001100000000000001111000000 -00101000100000000000001011001100 -01011011111111111111110110000000 +00000011100000000001000111001110 +00101000100000000000000111001100 +00000011010000000000100110001100 +01011011111111111111100110000000 +00000010100000000000100000001100 +00010101011111100110000000001101 +00101001100000000000000111001100 +00000011100000010000000110101101 +00101000100000000101000110101100 +00000011010000000000100110001100 +01011011111111111111100110000000 +00000010100000000000100000001100 +00101001100000000101000110101100 00101000100000001001000001100101 -00010100001110001000000000000110 +00010100001110001011000011000110 00000010100000000101000000001000 00000010100000110000000000000111 -00000011101011110000000011000110 +00000011101001010000000011000110 00000010100000000000010000000100 -00101001100000000000001011000000 -01010100000000110001100000000000 -00000011010000000000000000000000 -00101000100000000000001011001100 -01011011111111111111110110000000 -00101001100000000000001011000000 -01010100000000111101010000000000 +01010100000000110001010000000000 +00010101011111100110000000001101 +00000011100000010000000110101101 +00101000100000000101000110101100 +00000011010000000000100110001100 +01011011111111111111100110000000 +00000010100000000000100000001100 +00101001100000000101000110101100 +01010100000000110011010000000000 00010101011111101010000000001100 00000011100000000100000110001100 00101000100000000000000110000101 00000000000100010101110010010111 00011100000000000001000000000100 -00000010101011110000000010000100 -01010100000000111111100000000000 +00000010101011011100000010000100 +01010100000000110101100000000000 00101000100000000010000001111000 00011100000000000001000000000100 -00000010101011110001000010000100 +00000010101011011101000010000100 00000000000101010000001100000101 -01010100000000111110010000000000 -00000000000101010000001110100101 +01010100000000110100010000000000 +00000000000101010000001111100101 00011100000000000001000000000100 -00000010101011110001000010000100 -01010100000000111101010000000000 -00000010100000000010100000000101 -00000000001000010001011110101100 +00000010101011011101000010000100 +01010100000000110011010000000000 +00010100000000000000000000100101 +00000011100011100010000010100101 +00000000001000010001011111101100 01011100000000000000100010100000 00000000001010100000000000000111 00011100000000000001000000000100 -00000010101011101110000010000100 +00000010101011011001000010000100 00000000000101010000000110000101 -01010100000000111011010000000000 +01010100000000110001000000000000 00000000000101010000001011100101 00011100000000000001000000000100 -00000010101011101110000010000100 -01010100000000111010010000000000 -00000000000100000111011100000101 -00000000000100000101110010100101 +00000010101011011001000010000100 +01010100000000110000000000000000 +00000000000100000111111100011111 +00000000000100000101111111100101 00011100000000000001000000000100 -00000010101011101110000010000100 -01010100000000111001000000000000 +00000010101011011001000010000100 +01010100000000101110110000000000 00011100000000000001000000000100 -00000010101011101111000010000100 -01010100000000111000010000000000 +00000010101011011010000010000100 +01010100000000101110000000000000 00101000100000010111000001100001 00101000100000010110000001110110 00101000100000010101000001110111 @@ -321,11 +342,6 @@ 00000010100000011000000001100011 01001100000000000000000000100000 00000011010000000000000000000000 -00000011010000000000000000000000 -00000000000000000000000000000000 -00000000000000000000000000000000 -00000000000000000000000000000000 -00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 @@ -383,27 +399,27 @@ 00000000000101010000000110101110 00000011010000000001000111001110 00000011100000000001000000010100 -01011000000000001111100111010100 +01011000000000001111010111010100 00000000000101010000000110101110 00000011010000000010000111001110 00000011100000000010000000010100 -01011000000000001111000111010100 +01011000000000001110100111010100 00000000000101010000000110101110 00000011010000000100000111001110 00000011100000000100000000010100 -01011000000000001110010111010100 +01011000000000001101110111010100 00000000000101010000000110101110 00000011010000001000000111001110 00000011100000001000000000010100 -01011000000000001101100111010100 +01011000000000001101000111010100 00000000000101010000000110101110 00000011010000010000000111001110 00000011100000010000000000010100 -01011000000000001100110111010100 +01011000000000001100010111010100 00000000000101010000000110101110 00000011010000100000000111001110 00000011100000100000000000010100 -01011000000000001100000111010100 +01011000000000001011100111010100 01010000000000000001000000000000 00000010100000000001000010110100 00000100000000000001100000110100 @@ -441,19 +457,15 @@ 00101000100000000000000001111111 00000010100000011111000001100011 00000110010010000011100000000000 -01010100000000000010110000000000 +01010100000000000010010000000000 01010011111111110111101111111111 -01010100000000001011110000000000 +01010011111111110111011111111111 01010011111111110111001111111111 -01010100000000001000010000000000 +01010011111111110110111111111111 01010011111111110110101111111111 01010011111111110110011111111111 01010011111111110110001111111111 01010011111111110101111111111111 -01010011111111110101101111111111 -01010011111111110101011111111111 -01010000000000000000000000000000 -01010000000000000000000000000000 01010000000000000000000000000000 00000011010000000000000000000000 00000011010000000000000000000000 @@ -462,6 +474,10 @@ 00000011010000000000000000000000 00000011010000000000000000000000 00000011010000000000000000000000 +00000011010000000000000000000000 +00000011010000000000000000000000 +00000011010000000000000000000000 +00000011010000000000000000000000 00010101011111100110000000001100 00000000010000001001100010000100 00000000000100000011000010000100 @@ -478,45 +494,9 @@ 00000011010000000000000000000000 00000011010000000000000000000000 00000011010000000000000000000000 -00011100000000000001000000001110 -00000010100100011101000111001110 -00000010100000000000010000001111 -00010101011111101010000000001100 -00000010100000000000100000001101 -00101001100000000000000111001111 -00000011100000000001000110001100 -00101001100000000000000110001101 -01001100000000000000000000100000 -00000011010000000000000000000000 -00000011010000000000000000000000 -00000011010000000000000000000000 -00010101011111100110000000001101 -00101000100000000101000110101100 -00000011010000000000100110001100 -01011000000000000001110110000000 -00011100000000000001000000001110 -00000010100100001100000111001110 -00000010100000000000010000001111 -00000010100000000000100000001100 -00101001100000000000000111001111 -00101001100000000101000110101100 -00010101011111100110000000001100 -00000011100000010000000110001100 -00101000100000000101000110001101 -00000011010000000000100110101101 -01011000000000000001110110100000 -00011100000000000001000000001110 -00000010100100000000000111001110 -00000010100000000000010000001111 -00000010100000000000100000001101 -00101001100000000000000111001111 -00101001100000000101000110001101 -01001100000000000000000000100000 -00000011010000000000000000000000 -00000011010000000000000000000000 00000000000000000110000000001101 00011100000000000001000000001110 -00000010101110111101000111001110 +00000010101111010001000111001110 00101000100000000000000111010000 00010100000000000001111010001100 00000010100011111010000000001111 @@ -532,7 +512,7 @@ 00000011010000000000000000000000 00000010101111110000000001100011 00011100000000000001000000001100 -00101000100000011011000110001100 +00101000100000101111000110001100 00101001100000001001000001100101 00101001100000001010000001100110 00000000000101010000000010000101 @@ -570,7 +550,7 @@ 00101001100000001110000001101100 01010100001111110101100000000000 00011100000000000001000000001100 -00101000101111111010000110001100 +00101000100000001110000110001100 00101000100000000000000110001100 00101001100000000110000001100100 00101001010000011101000001100000 @@ -639,7 +619,7 @@ 01101000000100011010101000101110 00000000010000001000100111001110 00011100000000000000111111101101 -00000010100110110101000110101101 +00000010100111001001000110101101 00000000000100000011100110101110 00101000100000000000000111001110 01001100000000000000000111000000 @@ -870,10 +850,10 @@ 00101000100000000010000001101110 00000010100000010001110000001101 00011100000000000000111111111000 -00000010100010111101001100011000 +00000010100011010001001100011000 01100100000000000000110110101110 00011100000000000000111111111000 -00000010100010111011001100011000 +00000010100011001111001100011000 00000010101111011111110000001101 00000000000101001011011011110111 00000000000101010000000000010110 @@ -906,10 +886,10 @@ 00101000100000000010000001101110 00000010100000010001110000001101 00011100000000000000111111111000 -00000010100010011011001100011000 +00000010100010101111001100011000 01100100000000000000110110101110 00011100000000000000111111111000 -00000010100010011001001100011000 +00000010100010101101001100011000 00000010101111011111110000001101 00000000000101001011011011110111 00000000000101010000000000001111 @@ -939,7 +919,7 @@ 01100100000000000110010000010000 00000010100000000100000000000110 00011100000000000000111111110100 -00000010100011101000001010010100 +00000010100011111100001010010100 00000010100000000001110000000111 00101000100000100110000001110010 00101000100000100101000001110001 @@ -1013,7 +993,7 @@ 01100100000000000110010000011110 00000010100000000100000000010011 00011100000000000000111111101101 -00000010100010011010000110101101 +00000010100010101110000110101101 00000010100000000001110000010100 00101000100000100110000001110001 00101000100000100101000001110000 @@ -1039,7 +1019,7 @@ 01100100000000000101110000011110 00000010100000000100000000010010 00011100000000000000111111101101 -00000010100010000000000110101101 +00000010100010010100000110101101 00000010100000000001110000010011 00101000100000100110000001101111 00101000100000100101000001110000 @@ -1131,7 +1111,7 @@ 00101001100000010110000001101100 01010100000101000110100000000000 00011100000000000000111111101110 -00000010100000101100000111001110 +00000010100001000000000111001110 00101000100000000000000111000110 00101000100000000001000111000111 01010100011010001011000000000000 @@ -1147,12 +1127,12 @@ 00101000100000000010000001101101 00000010100000011000010000001110 00011100000000000000111111111100 -00000010101110101100001110011100 +00000010101111000000001110011100 01011000000000000000110110101110 00011100000000000000111111111100 -00000010101110101110001110011100 +00000010101111000010001110011100 00011100000000000000111111101110 -00000010100000011001000111001110 +00000010100000101101000111001110 00101000100000000001000111001111 00101000100000000000000111001110 00000010101111111111111101011111 @@ -1192,7 +1172,7 @@ 00101000100000010111000001101100 01011111111111111000010010000000 00011100000000000000111111111111 -00000010101111110011001111111111 +00000010100000000111001111111111 00101000100000000000001111100110 00101000100000000001001111100111 00101000100000001010000001100100 @@ -1538,7 +1518,7 @@ 00101001100000000100000001101101 00010100000000000000000011101110 00011100000000000000111111101101 -00000010101000100101000110101101 +00000010101000111001000110101101 00000011101000001100000111001110 00101001100000010001000001101101 00000010100000011110000000001101 @@ -1563,7 +1543,7 @@ 00000000000101010000000000011011 00000000000101010000000000011111 00011100000000000000111111111000 -00000010101000010110001100011000 +00000010101000101010001100011000 01010011111101011110011111111111 00000010101111111111110000001110 00101001100000001010000001101100 @@ -1616,7 +1596,7 @@ 00101010000000000000001101111111 01010011111111111110111111111111 00011100000000000000111111001101 -00000010100111011100000110101101 +00000010100111110000000110101101 00101001100000010001000001101101 00000011010000001000001011101110 01011000000000000110000111000000 @@ -1641,7 +1621,7 @@ 00000010100000000000100000001110 01010011111111100001101111111111 00011100000000000000111111001101 -00000010100110111110000110101101 +00000010100111010010000110101101 01010011111111111001111111111111 00000010100000000001001101101101 00101001100000000100000001101101 @@ -1788,7 +1768,7 @@ 00000010100000100111000001110011 00000010100000000001110000000111 00011100000000000000111111010100 -00000010100110010111001010010100 +00000010100110101011001010010100 00000010100000000100000000000110 00000010101111111100001000010000 00000000000101010000001001101100 @@ -1807,7 +1787,7 @@ 00000010100000100111000001110010 00000010100000000001110000010100 00011100000000000000111111001101 -00000010100110000000000110101101 +00000010100110010100000110101101 00000010100000000100000000010011 00000010101111111100001111011110 00000000000101010000001001001100 @@ -1824,7 +1804,7 @@ 00000010100000100111000001110001 00000010100000000001110000010011 00011100000000000000111111001101 -00000010100101101111000110101101 +00000010100110000011000110101101 00000010100000000100000000010010 00000010101111111100001111011110 00000000000101010000001000101100 @@ -1843,7 +1823,7 @@ 00101000100000000010000001101100 01011100000000010111010010000000 00011100000000000000111111001101 -00000010100100000000000110101101 +00000010100100010100000110101101 00101001100000000000000110001101 00000010100000000000010000001101 00101001100000000001000110001101 @@ -1887,7 +1867,7 @@ 01100100000000000100100000011000 00000010100000000100000000011011 00011100000000000000111111011010 -00000010100100110000001101011010 +00000010100101000100001101011010 00000010100000000001110000011101 00101000100000100110000001101110 00101000100000100101000001101101 @@ -1937,7 +1917,7 @@ 00101000100000011110000001101101 01100000000000010101010000001101 00011100000000000000111111001101 -00000010100010100010000110101101 +00000010100010110110000110101101 00101001100000000000000110001101 00000010100000000000010000001101 00101001100000000001000110001101 @@ -1983,7 +1963,7 @@ 00000000000101010000000110001110 00000010100000000100000000011101 00011100000000000000111111011011 -00000010100011010000001101111011 +00000010100011100100001101111011 00000010100000000001110000011110 00101000100000100110000001101111 00101000100000100101000001101101 @@ -2045,7 +2025,7 @@ 01100100000000000101110000011010 00000010100000000100000000001110 00011100000000000000111111011110 -00000010100010010010001111011110 +00000010100010100110001111011110 00000010100000000001110000010001 00101000100000100110000001101111 00101000100000100101000001101101 @@ -2072,7 +2052,7 @@ 00000010100000000001110000011110 00101001100000000010000001101101 00011100000000000000111111011111 -00000010100001110111001111111111 +00000010100010001011001111111111 01011100000000011000001101100000 01011100000000011000001110100000 00000000000100000111001100001101 @@ -2133,7 +2113,7 @@ 01100111111111000111000000011000 00000010100000000100000000011011 00011100000000000000111111011010 -00000010100000111010001101011010 +00000010100001001110001101011010 00000010100000000001110000011101 00101000100000100110000001101110 00101000100000100101000001101101 @@ -2347,7 +2327,7 @@ 01100111111111111100010000011011 00000010100000000100000000011101 00011100000000000000111111011000 -00000010101101100100001100011000 +00000010101101111000001100011000 00000010100000000001110000011110 00101000100000100110000001101100 00101000100000100101000001101101 @@ -2386,7 +2366,7 @@ 01100111111110001000010000010111 00000010100000000100000000011010 00011100000000000000111111011000 -00000010101101000001001100011000 +00000010101101010101001100011000 00000010100000000001110000011011 00101000100000100110000001101110 00101000100000100101000001101101 @@ -2464,7 +2444,7 @@ 00000000000101010000000010101110 01011100000000000010111000000000 00011100000000000000111111001100 -00000010101011111101000110001100 +00000010101100010001000110001100 00101000100000000000000110000110 00101000100000000001000110000111 01010100010100111101110000000000 @@ -2508,7 +2488,7 @@ 00000010101111111111000010001101 00101001100000000000000010000000 00011100000000000000111111001110 -00101000100001101100000111001110 +00101000100010000000000111001110 00101000100000000000000111001100 01011100000000000001000110000000 00101001100000000000000010001100 @@ -2534,7 +2514,7 @@ 01001100000000000000000000100000 01011100000000000001100110001101 00011100000000000000111111001100 -00101000100001000100000110001100 +00101000100001011000000110001100 00000010100000000011000000001101 00101001100000000000000110001101 01001100000000000000000000100000 @@ -2564,7 +2544,7 @@ 00000010101111111110000000001100 00000000000100000101110010010111 00011100000000000000111111011010 -00000010100000110111001101011010 +00000010100001001011001101011010 00000000000101001011001100011000 00101001100000000000001101010111 00000010101111111111001100011000 @@ -2576,7 +2556,7 @@ 00000000000100000110011011110111 00101001100000000000001101010111 00011100000000000000111111001100 -00000010100000101100000110001100 +00000010100001000000000110001100 00101000100000000000000110001101 01011111111111111000100110100000 00101001100000000000000110011000 @@ -2584,7 +2564,7 @@ 00000010101111111100000001100011 00101001100000000010000001110111 00011100000000000000111111001100 -00000010100000100011000110001100 +00000010100000110111000110001100 00101000100000000000000010010111 00101000100000000000000110001100 00101001100000000000000001111001 @@ -2627,7 +2607,7 @@ 00000010101111111010110000001100 01101100000000000011100110000100 00011100000000000000111111001100 -00101000101111100111000110001100 +00101000101111111011000110001100 00000010100000000011000000001101 00101001100000000000000110001101 00000000000101010000000000010111 @@ -2644,7 +2624,7 @@ 00000000000101001001001100011000 00000010100000000010001100011001 00011100000000000000111111011010 -00000010101111101001001101011010 +00000010101111111101001101011010 00101000100000000000001101010111 01011100000000000001111011100000 00000000000101010000001100100100 @@ -2836,7 +2816,7 @@ 01011000000011111111011101000000 00101000100000000111000001101101 00011100000000000000111110101100 -00000010100110001110000110001100 +00000010100110100010000110001100 00101001100000000001000001101100 01011000000000000001000110100000 00000010100000000000110110001100 @@ -2872,7 +2852,7 @@ 00101001100000000000000110101100 00101000100000000111000001101101 00011100000000000000111110101100 -00000010100011111011000110001100 +00000010100100001111000110001100 00101001100000000001000001101100 01011011111111111000000110100000 00101000100000000111000001101110 @@ -2901,17 +2881,17 @@ 00000010101100000000011100011000 00101001100000010010000001100000 00011100000000000000111110101100 -00000010100101001110000110001100 +00000010100101100010000110001100 00101000100000000000000110000110 00101000100000000001000110000111 01010100010100111011100000000000 00011100000000000000111110101100 -00000010100101001011000110001100 +00000010100101011111000110001100 00101000100000000000000110000110 00101000100000000001000110000111 01010100010011001111010000000000 00011100000000000000111110101100 -00000010100101001000000110001100 +00000010100101011100000110001100 00101000100000000000000110000110 00101000100000000001000110000111 01010100001110000111000000000000 @@ -2920,7 +2900,7 @@ 00000000000101010000000010111011 01010100010111011001000000000000 00011100000000000000111110101100 -00000010100101000001000110001100 +00000010100101010101000110001100 00101000100000000000000110000110 00101000100000000001000110000111 01010100010011001011110000000000 @@ -2952,7 +2932,7 @@ 01101000000000000011010110010110 00000000010000001000111011001101 00011100000000000000111111001100 -00101000101010100011000110001100 +00101000101010110111000110001100 00000000000100000011010110001100 00101000100000000000000110000110 00101000100000000001000110000111 @@ -3073,7 +3053,7 @@ 00000000010000001000110110001101 00000000010010001001001011011101 00011100000000000000111111001100 -00101000101000101010000110001100 +00101000101000111110000110001100 00000000000100000011010110001100 00000011010000000100001110101110 00101000100000000001000110001101 @@ -3081,7 +3061,7 @@ 00101000100000000000000110001100 01011000000000000100000111000000 00011100000000000000111111001110 -00101000101000100100000111001110 +00101000101000111000000111001110 00101000100000001000000111000110 00101000100000001001000111000111 00101000100000001011000001100100 @@ -3096,7 +3076,7 @@ 00000000000101010000000010111100 00000010100000000000110000011000 00011100000000000000111111011110 -00101000101000010101001111011110 +00101000101000101001001111011110 01010000000000000011010000000000 00000011010000000000011110101111 01011000000000000010010111100000 @@ -3124,16 +3104,16 @@ 00000000000100010101100000011101 00000011010000000011111110101100 00000000010000001000110110001101 -00011100000000000000111110101100 -00101000100111110110000110001100 +00011100000000000000111111001100 +00101000101000001010000110001100 00000000000100000011010110001100 00101000100000000000000110000110 00101000100000000001000110000111 00101000100000001011000001100100 00101000100000001110000001100101 00000000010010001001001110111101 -00011100000000000000111110111110 -00101000100111110000001111011110 +00011100000000000000111111011110 +00101000101000000100001111011110 01010100010010010111000000000000 00000000000101010000000010011001 00000000000101010000000010111100 @@ -3143,7 +3123,7 @@ 00101000100000001111000001101100 01011000000000011100110110000000 00011100000000000000111110101110 -00000010100001100100000111001110 +00000010100001111000000111001110 00101000100000000000000111000110 00101000100000000001000111000111 00000000000101010000001100100100 @@ -3155,7 +3135,7 @@ 00101000100000000100000001101100 01100100000000001110010000001100 00011100000000000000111110101110 -00000010100001011010000111001110 +00000010100001101110000111001110 00101000100000001000000001101101 00101000100000000000000111000110 00101000100000000001000111000111 @@ -3180,7 +3160,7 @@ 00000000000101010000000110100111 01010100010010001100000000000000 00011100000000000000111110101111 -00000010100001000011000111101111 +00000010100001010111000111101111 00101000100000000000000111100110 00101000100000000001000111100111 01010100001101000011110000000000 @@ -3188,7 +3168,7 @@ 00000000000100000001011100011000 01011100000000010011001111000000 00011100000000000000111110101100 -00000010100000111101000110001100 +00000010100001010001000110001100 00101000100000010001000001101110 00101000100000001100000001101101 00101000100000000000000110000110 @@ -3218,7 +3198,7 @@ 01100000000001000010110110110110 00000000010000001000111011001101 00011100000000000000111110101100 -00101000100110011001000110001100 +00101000100110101101000110001100 00000000000100000011010110001100 00101000100000000000000110011010 00101000100000000001000110011011 @@ -3227,7 +3207,7 @@ 01100000000000101100000000011111 01011100000001110010001111100000 00011100000000000000111110101100 -00000010100000010110000110001100 +00000010100000101010000110001100 00101000100000000000000110000110 00101000100000000001000110000111 00000000000101010000001101000100 @@ -3269,23 +3249,23 @@ 00101001100000010001000001101100 00101000100000000110000001101100 00011100000000000000111110101101 -00101000100101100110000110101101 +00101000100101111010000110101101 00000000000100000011100110101101 00101000100000000000000110100110 00101000100000000001000110100111 01011000000000001111110110000000 00011100000000000000111110101100 -00000010101111010000000110001100 +00000010101111100100000110001100 00101000100000000000000110000100 00101000100000000001000110000101 00101001100000001100000001111000 00011100000000000000111110111000 -00000010101111011101001100011000 +00000010101111110001001100011000 01010100001111000000010000000000 00101000100000001100000001101111 00000000000101010000001100100110 00011100000000000000111110111001 -00000010101111010110001100111001 +00000010101111101010001100111001 00000000000101010000000111100111 01010100010011011011110000000000 00101000100000000001000001111110 @@ -3361,7 +3341,7 @@ 00000000000101010000000010111001 01011100000000001000011110001100 00011100000000000000111110111100 -00000010101101111010001110011100 +00000010101110001110001110011100 00101000100000000000001110000110 00101000100000000001001110000111 00101000100000001100000001100100 @@ -3393,7 +3373,7 @@ 00000000000101010000000111011110 01010011111111111110101111111111 00011100000000000000111110101100 -00000010101101101100000110001100 +00000010101110000000000110001100 00101000100000000000000110000110 00101000100000000001000110000111 01010100010001010101100000000000 @@ -3470,7 +3450,7 @@ 00000000000101010000000110011110 01010011111111111100111111111111 00011100000000000000111110101100 -00000010101100011111000110001100 +00000010101100110011000110001100 00101000100000000000000110000110 00101000100000000001000110000111 00000010100000000000011100011000 @@ -3856,7 +3836,7 @@ 01010011111111010010101111111111 00101000100000000111000001101101 00011100000000000000111110001100 -00000010100110001111000110001100 +00000010100110100011000110001100 00101001100000000001000001101100 00000010100000000010000110001100 01011111111100000001010110100000 @@ -3889,13 +3869,13 @@ 00000010101111111100000001100011 00101001100000000010000001110111 00011100000000000000111110110111 -00000010101100010000001011110111 +00000010101100100100001011110111 00101000100000000000001011100100 00101001100000000011000001100001 01011000000000000001100010000000 01010111111010100100111111111111 00011100000000000000111110101100 -00000010101100001001000110001100 +00000010101100011101000110001100 00101001100000000000001011100000 00101001100000000000000110000000 00101000100000000011000001100001 @@ -3903,7 +3883,7 @@ 00000010100000000100000001100011 01001100000000000000000000100000 00011100000000000000111110101100 -00000010101100000000000110001100 +00000010101100010100000110001100 00101000100000000000000110001101 01011100000000000001100110100000 00000010100000000000010000001101 @@ -3914,7 +3894,7 @@ 00000000000101010000000000000100 01001100000000000000000000100000 00011100000000000000111110101100 -00000010101011110110000110001100 +00000010101100001010000110001100 00101000100000000000000110001101 01100100000000001000000110100100 00000010101111111100000001100011 @@ -3928,7 +3908,7 @@ 00000000000101010000000000001100 01011100000000000011110010000000 00011100000000000000111110101100 -00000010101011101001000110001100 +00000010101011111101000110001100 00101000100000000000000110000100 00000000000101010000000110011001 01011000000000000000100010000000 @@ -3939,7 +3919,7 @@ 01011000000000000000100010000000 00101001100000000000001100010111 00011100000000000000111110101100 -00000010101011011110000110001100 +00000010101011110010000110001100 00101000100000000000000110001100 00101000100000000011000001100001 00101000100000000010000001110111 @@ -3949,7 +3929,7 @@ 00000010100000000100000001100011 01001100000000000000000000100000 00011100000000000000111110101100 -00000010101011010100000110001100 +00000010101011101000000110001100 00101000100000000000000110001100 00000000000101010000000110000100 01001100000000000000000000100000 @@ -4263,7 +4243,7 @@ 00000010101111111111110110001100 00000000010000001000100110001100 00011100000000000000111110001101 -00000010100000001100000110101101 +00000010100000100000000110101101 00000000000100000011000110101100 00101000100000000000000110000101 00000000000101010000000000000110 @@ -4574,7 +4554,7 @@ 00000010100000000000100000000100 01010000000000000000010000000000 00011100000000000000111110001110 -00000010100001100100000111001110 +00000010100001111000000111001110 00000000000101010000000000001100 00000000000101010000000111001101 00000010100000001000000000010000 @@ -4644,48 +4624,48 @@ 00101001001111111111110110000000 01010011111111111111001111111111 00011100000000000000111110000100 -00101000100000010101000010000100 +00101000100000101001000010000100 00000010100000111100000010000100 01001100000000000000000000100000 00000000000101010000000010001100 00011100000000000000111110001101 -00000010101110011010000110101101 +00000010101110101110000110101101 00101000100000000000000110100100 01100100000000000011000110000000 00011100000000000000111110001110 -00101000100000001001000111001110 +00101000100000011101000111001110 00000000000100010011100010001110 00000000000100010011000000001111 01101100000000000010110111001111 00011100000000000000111110001100 -00101000101111111000000110001100 +00101000100000001100000110001100 00000010100000000011000000001101 00101001100000000000000110001101 00000010101111111111110000000100 01001100000000000000000000100000 00011100000000000000111110001110 -00101000101111111011000111001110 +00101000100000001111000111001110 00000000000100010001000111001110 01101011111111111101110111001100 00000000000100000011000010001100 00101001100000000000000110101100 01001100000000000000000000100000 00011100000000000000111110001100 -00101000101111110010000110001100 +00101000100000000110000110001100 00101001100000001000000010001100 00011100000000000000111110001100 -00101000101111101100000110001100 +00101000100000000000000110001100 00101001100000001001000010001100 00011100000000000000111110001100 -00101000101111101011000110001100 +00101000101111111111000110001100 00101001100000011000000010001100 00010101111111111111111100001100 00000000000101010011000010100101 00011100000000000000111110001100 -00101000101111011110000110001100 +00101000101111110010000110001100 00101001100000001010000010001100 00011100000000000000111110001100 -00101000101111100101000110001100 +00101000101111111001000110001100 00101001100000000000000010000000 00101001100000000001000010000000 00101001100000000010000010000000 @@ -4701,28 +4681,28 @@ 00101001100000001011000010001100 01001100000000000000000000100000 00011100000000000000111110000101 -00000010101101101010000010100101 +00000010101101111110000010100101 00011100000000000000111110000100 -00101000101111001101000010000100 +00101000101111100001000010000100 01010000000000010000110000000000 00011100000000000000111110001100 -00000010101101100100000110001100 +00000010101101111000000110001100 00101000100000000000000110000100 00000010101111111100000001100011 00101001100000000010000001110111 00101001100000000011000001100001 00011100000000000000111110010111 -00000010100000111101001011110111 +00000010100001010001001011110111 01011000000000000000100010010111 01010100000001110000010000000000 00011100000000000000111110001100 -00000010101101011001000110001100 +00000010101101101101000110001100 00101000100000000000000110000100 00000010100000011100001011101100 01011000000000000000100010001100 01010100000001101110110000000000 00011100000000000000111110001100 -00000010101101010010000110001100 +00000010101101100110000110001100 00101000100000000000000110000100 00000010100000111000001011110111 01011000000000000001010010010111 @@ -4736,18 +4716,18 @@ 01001100000000000000000000100000 00000010101111111100000001100011 00011100000000000000111110001100 -00000010100001111001000110001100 +00000010100010001101000110001100 00011100000000000000000000001101 00000010101111011011000110101101 00000000000101010000000000000110 00000010100000000001000000000101 00011100000000000000111110000100 -00000010100000011111000010000100 +00000010100000110011000010000100 00101001100000000011000001100001 00101001100000000000000110001101 01010111111111101101011111111111 00011100000000000000111110001101 -00000010100000011010000110101101 +00000010100000101110000110101101 00000010100000000000010000000110 00000010100000000010010000000101 00000010100000011100000110100100 @@ -4759,14 +4739,14 @@ 00000010100000000100000001100011 01010011111111101010011111111111 00011100000000000000111110001100 -00000010100000001100000110001100 +00000010100000100000000110001100 00101000100000000000000110001101 01011100000000000010010110100000 00011100000000000000000000001101 00000010101111000111000110101101 00101001100000000000000110001101 00011100000000000000111110001100 -00000010100001011011000110001100 +00000010100001101111000110001100 00101000100000000000000110001100 01011100000000000000100110000000 01010011111111110111011111111111 @@ -4880,7 +4860,7 @@ 00101000010000000011100010000100 01010000000011100111000000000000 00011100000000000000111110001100 -00101000101100100100000110001100 +00101000101100111000000110001100 00101000100000000000000110001100 00000010101111111100000001100011 00101001100000000010000001110111 @@ -4894,7 +4874,7 @@ 00000011010000000100000110001101 01011100000000000010010110100000 00011100000000000000111110001101 -00101000101100001100000110101101 +00101000101100100000000110101101 00000010100000000010010000001110 00101001100000000000000110101110 00000011100000010000000110001100 @@ -5009,7 +4989,7 @@ 01011100000000000000100110000000 01010011110110101010111111111111 00011100000000000000111110001100 -00101000101010011001000110001100 +00101000101010101101000110001100 00000010100000000011000000001101 00101001100000000000000110001101 00000000000101010000000000000100 @@ -5037,7 +5017,7 @@ 00101000100000001010001011101110 01011011111111111110000111000000 00011100000000000000111110011000 -00101000101001111101001100011000 +00101000101010010001001100011000 00000000010001001011000110001101 00101000100000000000001100011001 00000011010000000000010110101101 @@ -5165,12 +5145,12 @@ 01010011111111111100111111111111 01011100000000000001100010000000 00011100000000000000111110000101 -00101000101000001010000010100101 +00101000101000011110000010100101 00011100000000000000000000000100 00000010101111111101000010000100 01010011111110011100111111111111 00011100000000000000111110001100 -00101000101000000010000110001100 +00101000101000010110000110001100 00101000100000000000000110001100 00000010101111111100000001100011 00101001100000000010000001110111 @@ -5341,7 +5321,7 @@ 00101000100000000011000001101110 01011100000000000100000010000000 00011100000000000000111101101100 -00101000100101001101000110001100 +00101000100101100001000110001100 00000010100000000011000000001101 00101001100000000000000110001101 00101010010000000011001011101100 @@ -5576,7 +5556,7 @@ 00000010101111111010110000001100 01101100000000000100010110000101 00011100000000000000111101101100 -00101000100001100010000110001100 +00101000100001110110000110001100 00000010100000000011000000001101 00101001100000000000000110001101 00000000000101010000000000011010 @@ -5605,7 +5585,7 @@ 01010111110100001100111111111111 01011100000000000110010010000000 00011100000000000000111101101101 -00101000100001010011000110101101 +00101000100001100111000110101101 00101000100000000000000110101100 01011000000000000011000110000000 01011100000000001000111110001100 @@ -5675,7 +5655,7 @@ 00000010100000111111110000001100 01101100000000000001110110000101 00011100000000000000111101101100 -00101000101111111111000110001100 +00101000100000010011000110001100 00000010100000100010100000001101 00101001100000000000000110001101 00000010101111111111110000000100 @@ -5711,7 +5691,7 @@ 00000010100000000000100000001100 01101100000000000001110110000100 00011100000000000000111101101100 -00101000101111011011000110001100 +00101000101111101111000110001100 00000010100000000010010000001101 00101001100000000000000110001101 00000010101111111111110000000100 @@ -5721,7 +5701,7 @@ 00000010100000000000100000001100 01101000000000000110000110000100 00011100000000000000111101101100 -00101000101111010000000110001100 +00101000101111100100000110001100 00101000100000000000000110001100 00000010101111111000000001100011 00101001100000000110000001110111 @@ -5744,7 +5724,7 @@ 01010100000000011010010000000000 01010011111111111110001111111111 00011100000000000000111101101100 -00101000101110111010000110001100 +00101000101111001110000110001100 00000010100000000010010000001101 00101001100000000000000110001101 00000010101111111111110000000100 @@ -5767,7 +5747,7 @@ 01001100000000000000000000100000 01011100000000000111100010000000 00011100000000000000111101101100 -00101000101110100010000110001100 +00101000101110110110000110001100 00101000100000000000000110001100 01011000000000001000000110000000 00000010101111111000000001100011 @@ -5796,14 +5776,14 @@ 00000010100000000000011011110111 01010011111111111100101111111111 00011100000000000000111101101100 -00101000101110000110000110001100 +00101000101110011010000110001100 00000010100000000010010000001101 00101001100000000000000110001101 00000010101111111111110000000100 01001100000000000000000000100000 01001100000000000000000000100000 00011100000000000000111101101100 -00101000101101111111000110001100 +00101000101110010011000110001100 00000010100000000010010000001101 00101001100000000000000110001101 00000010101111111111110000000100 @@ -5815,7 +5795,7 @@ 00000000000101010000000000000100 01001100000000000000000000100000 00011100000000000000111101101100 -00101000101101110011000110001100 +00101000101110000111000110001100 00000010100000000010010000001101 00101001100000000000000110001101 00000010101111111111110000000100 @@ -5823,7 +5803,7 @@ 00000010100000000000100000001100 01101100000000000001110110000100 00011100000000000000111101101100 -00101000101101101011000110001100 +00101000101101111111000110001100 00000010100000000010010000001101 00101001100000000000000110001101 00000010101111111111110000000100 @@ -5833,7 +5813,7 @@ 00000010100000000000100000001100 01101100000000000010000110000100 00011100000000000000111101101100 -00101000101101100001000110001100 +00101000101101110101000110001100 00000010100000000010010000001101 00101001100000000000000110001101 00000010101111111111110000000100 @@ -5842,12 +5822,12 @@ 00000000000101010000000000000100 01010011111111111111011111111111 00011100000000000000111101101100 -00000010101101010100000110001100 +00000010101101101000000110001100 00101000100000000000000110001100 00101001000000000000000110000100 01001100000000000000000000100000 00011100000000000000111101101100 -00000010101011101011000110001100 +00000010101011111111000110001100 00101000100000000000000110001101 00000010100000000001010110101110 00101010000000000000000111001100 @@ -5856,7 +5836,7 @@ 00101001000000000000000110100100 01001100000000000000000000100000 00011100000000000000111101101100 -00000010101011100010000110001100 +00000010101011110110000110001100 00101000100000000000000110001101 00000010101111111100000001100011 00000010100000000001010110101110 @@ -5885,7 +5865,7 @@ 00000000010001001010000011010010 00000010100000000010000000001111 00011100000000000000111101101100 -00101000101100111000000110001100 +00101000101101001100000110001100 00000000000100000100100110001100 00101010000000000000000110001100 00000010100000001000000000010000 @@ -5956,7 +5936,7 @@ 00000000010001001110000111010010 00000010100000000110000000001111 00011100000000000000111101110000 -00101000101011110001001000010000 +00101000101100000101001000010000 00000000000100000100101000010000 00101010000000000000001000010000 00000010100000001000000000001100 @@ -6020,7 +6000,7 @@ 00000000010001001110000011101110 00000010100000000110000000010001 00011100000000000000111101101111 -00101000101010110001000111101111 +00101000101011000101000111101111 00000000000100000011100111101111 00101010000000000000000111101110 00000010100000001000000000010000 @@ -6222,7 +6202,7 @@ 00000000010001001110000011010010 00000010100000000110000000001111 00011100000000000000111101010000 -00101000100111100111001000010000 +00101000100111111011001000010000 00000000000100000100101000010000 00101010000000000000001000010000 00000010100000001000000000001110 @@ -6288,7 +6268,7 @@ 00000000010001001110000110110001 00000010100000000110000000001111 00011100000000000000111101010000 -00101000100110100101001000010000 +00101000100110111001001000010000 00000000000100000100011000010000 00101010000000000000001000010001 00000010100000001000000000001110 @@ -6340,7 +6320,7 @@ 00000000010001001110000011110001 00000010100000000110000000001110 00011100000000000000111101001100 -00101000100101110001000110001100 +00101000100110000101000110001100 00000000000100000100010110001100 00101010000000000000000110001100 00000010100000001000000000001111 @@ -7173,7 +7153,7 @@ 00000000000101011110001110110000 01101000000000101001010110011011 00011100000000000000111100101111 -00000010100101011100000111101111 +00000010100101110000000111101111 00000000010000001000101101101110 00000000000100000011100111101110 00101000100000000000000111001100 @@ -7886,7 +7866,7 @@ 00000010100000000000011101110001 01101000000000100100000110011001 00011100000000000000111100101110 -00000010101010100011000111001110 +00000010101010110111000111001110 00000000010000001000101100111001 00000000000100000110010111011001 00101000100000000000001100101100 @@ -9264,15 +9244,15 @@ 00000010100000001000000000001101 01101000000000000010000110000100 00011100000000000000111100001100 -00101000101000000101000110001100 +00101000101000011001000110001100 00000000000100000001000110001100 00101010000000000000000110000100 00000000000100010001000110100100 01001100000000000000000000100000 00000011010000000000000000000000 00000000010001001010000010000100 -00011100000000000000111011101100 -00101000100111111101000110001100 +00011100000000000000111100001100 +00101000101000010001000110001100 00000000000100000001000110001100 00101010000000000000000110000100 00000010100000000110000000001101 @@ -9281,8 +9261,8 @@ 00010100000000100000000000001100 01101000000000000010010010001100 00000000010001001110000010000100 -00011100000000000000111011101100 -00101000100111110011000110001100 +00011100000000000000111100001100 +00101000101000000111000110001100 00000000000100000001000110001100 00101010000000000000000110000100 00000010100000000010000000001101 @@ -9290,7 +9270,7 @@ 01001100000000000000000000100000 00000000010001001100000010000100 00011100000000000000111011101100 -00101000100111101011000110001100 +00101000100111111111000110001100 00000000000100000001000110001100 00101010000000000000000110000100 00000010100000000100000000001101 @@ -9671,97 +9651,97 @@ 01101100011101010110111000101000 00000000000000000010100101101100 00000000000000000000000000110000 -00011100000000000000101010111000 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000000101011001100 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000001101110100000 00011100000000000000101001101000 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000000101011010100 -00011100000000000000101011110100 -00011100000000000001101110100000 -00011100000000000000101011101100 -00011100000000000000101011111100 -00011100000000000001101110100000 -00011100000000000000101101100100 -00011100000000000000101101101100 -00011100000000000000101101101100 -00011100000000000000101101101100 -00011100000000000000101101101100 -00011100000000000000101101101100 -00011100000000000000101101101100 -00011100000000000000101101101100 -00011100000000000000101101101100 -00011100000000000000101101101100 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000000110011111000 -00011100000000000001101110100000 -00011100000000000000110000000100 -00011100000000000000110000111000 -00011100000000000000110011111000 -00011100000000000000110011111000 -00011100000000000000110011111000 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000000101110101100 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000001011110001000 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000001100000111100 -00011100000000000001101110100000 -00011100000000000001100011011000 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000001100101000100 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000000110011111000 -00011100000000000001101110100000 -00011100000000000000110000000100 -00011100000000000000110000111100 -00011100000000000000110011111000 -00011100000000000000110011111000 -00011100000000000000110011111000 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000000101001111100 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000000101000011000 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000000101010000100 +00011100000000000000101010100100 +00011100000000000001101101010000 +00011100000000000000101010011100 +00011100000000000000101010101100 +00011100000000000001101101010000 +00011100000000000000101100010100 +00011100000000000000101100011100 +00011100000000000000101100011100 +00011100000000000000101100011100 +00011100000000000000101100011100 +00011100000000000000101100011100 +00011100000000000000101100011100 +00011100000000000000101100011100 +00011100000000000000101100011100 +00011100000000000000101100011100 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000000110010101000 +00011100000000000001101101010000 00011100000000000000101110110100 -00011100000000000000110000111100 -00011100000000000000101111110100 -00011100000000000001101110100000 -00011100000000000000101111011100 -00011100000000000001101110100000 -00011100000000000001011100011100 -00011100000000000001011110001100 -00011100000000000001100000000000 -00011100000000000000101111110100 -00011100000000000001101110100000 -00011100000000000001100000111100 -00011100000000000000101010110000 -00011100000000000001100011011100 -00011100000000000001101110100000 -00011100000000000001101110100000 -00011100000000000001100110101000 -00011100000000000001101110100000 -00011100000000000000101010110000 +00011100000000000000101111101000 +00011100000000000000110010101000 +00011100000000000000110010101000 +00011100000000000000110010101000 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000000101101011100 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000001011100111000 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000001011111101100 +00011100000000000001101101010000 +00011100000000000001100010001000 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000001100011110100 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000000110010101000 +00011100000000000001101101010000 +00011100000000000000101110110100 +00011100000000000000101111101100 +00011100000000000000110010101000 +00011100000000000000110010101000 +00011100000000000000110010101000 +00011100000000000000101101100100 +00011100000000000000101111101100 +00011100000000000000101110100100 +00011100000000000001101101010000 +00011100000000000000101110001100 +00011100000000000001101101010000 +00011100000000000001011011001100 +00011100000000000001011100111100 +00011100000000000001011110110000 +00011100000000000000101110100100 +00011100000000000001101101010000 +00011100000000000001011111101100 +00011100000000000000101001100000 +00011100000000000001100010001100 +00011100000000000001101101010000 +00011100000000000001101101010000 +00011100000000000001100101011000 +00011100000000000001101101010000 +00011100000000000000101001100000 00110000001100000011000000110000 00110000001100000011000000110000 00110000001100000011000000110000 @@ -9972,38 +9952,38 @@ 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 -11111111111110000110110100100000 -11111111111110000110101011001100 -11111111111110000110101111001000 -11111111111110000110101100101000 -11111111111110000110101111001000 -11111111111110000110110011101000 -11111111111110000110101111001000 -11111111111110000110101100101000 -11111111111110000110101011001100 -11111111111110000110101011001100 -11111111111110000110110011101000 -11111111111110000110101100101000 -11111111111110000110101100111000 -11111111111110000110101100111000 -11111111111110000110101100111000 -11111111111110000110110100000000 -11111111111110000111011110110000 -11111111111110000111010110110000 -11111111111110000111010110110000 -11111111111110000111010110101100 -11111111111110000111010110111100 -11111111111110000111010110111100 -11111111111110000111011101111000 -11111111111110000111010110101100 -11111111111110000111010110111100 -11111111111110000111011101111000 -11111111111110000111010110111100 -11111111111110000111010110101100 -11111111111110000111011101110000 -11111111111110000111011101110000 -11111111111110000111011101110000 -11111111111110000111011110010000 +11111111111110000110110011010000 +11111111111110000110101001111100 +11111111111110000110101101111000 +11111111111110000110101011011000 +11111111111110000110101101111000 +11111111111110000110110010011000 +11111111111110000110101101111000 +11111111111110000110101011011000 +11111111111110000110101001111100 +11111111111110000110101001111100 +11111111111110000110110010011000 +11111111111110000110101011011000 +11111111111110000110101011101000 +11111111111110000110101011101000 +11111111111110000110101011101000 +11111111111110000110110010110000 +11111111111110000111011101100000 +11111111111110000111010101100000 +11111111111110000111010101100000 +11111111111110000111010101011100 +11111111111110000111010101101100 +11111111111110000111010101101100 +11111111111110000111011100101000 +11111111111110000111010101011100 +11111111111110000111010101101100 +11111111111110000111011100101000 +11111111111110000111010101101100 +11111111111110000111010101011100 +11111111111110000111011100100000 +11111111111110000111011100100000 +11111111111110000111011100100000 +11111111111110000111011101000000 00000010000000100000000100000000 00000011000000110000001100000011 00000100000001000000010000000100 @@ -10070,7 +10050,7 @@ 00001000000010000000100000001000 00000001111101111000101001000000 10111111000000000000000000000000 -00011100000010000000110000000000 +00011100000010000000101111110000 00011100000010000000101101111000 00011100000010000000101100001000 00011100000010000000101010011000 @@ -10133,8 +10113,8 @@ 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 -00011100000000000101100010100100 -00011100000000000101100001000100 +00011100000000000101100001010100 +00011100000000000101011111110100 00000000000000000000000000000000 00011100000010000000010010000111 00011100000010000000010000000100 @@ -10171,21 +10151,21 @@ 10111111111000000000000111100000 10111111101011111111111100010000 00000000000000000000000000000000 -00011100000000000100101111011100 +00011100000000000100101110001100 00011100000010000000011100001100 00011100000010000000100011111100 00011100000010000000001100110000 -00011100000000000101000010110100 +00011100000000000101000001100100 00011100000010000000001100001000 -00011100000000000100110110111100 +00011100000000000100110101101100 00011100000010000000011100011000 -00011100000000000100110101011100 -00011100000000000100101101110100 -00011100000000000100110000111100 +00011100000000000100110100001100 +00011100000000000100101100100100 +00011100000000000100101111101100 00011100000011110000000000000000 00011100000010000000101010010000 00011100000010000000011000001000 -00011100000010000000110000000000 +00011100000010000000101111110000 00011100000010000000011100100000 00011100000010000000100011111000 00011100000010000000011100101100 diff --git a/sdk/software/examples/asm/Makefile b/sdk/software/examples/asm/Makefile index a3f3448..dfb310f 100644 --- a/sdk/software/examples/asm/Makefile +++ b/sdk/software/examples/asm/Makefile @@ -1,7 +1,7 @@ TARGET = user-sample MATMUL_GROUP_NUM ?= 5000 -CFLAGS += -O2 -g -DMATMUL_GROUP_NUM=$(MATMUL_GROUP_NUM) +CFLAGS += -O3 -g -DMATMUL_GROUP_NUM=$(MATMUL_GROUP_NUM) C_SRCS := $(wildcard ./*.c ) diff --git a/sdk/software/examples/asm/user-sample.c b/sdk/software/examples/asm/user-sample.c index 2396967..4b8b243 100644 --- a/sdk/software/examples/asm/user-sample.c +++ b/sdk/software/examples/asm/user-sample.c @@ -1,14 +1,19 @@ /** * user-sample - CIC-IEC 2026 Stage 3 Evaluation Program * - * (ULTIMATE PERFORMANCE DMA + PING-PONG BUFFER ARCHITECTURE) + * (ULTIMATE PERFORMANCE DMA + PING-PONG BUFFER ARCHITECTURE v2) * - * Utilizes true DMA transfers (Channel 0 for memory->IP, Channel 1 for IP->memory) + * Optimizations over v1: + * 1. Pre-fire DMA Ch0 load at loop tail → fully overlaps with IP compute + * 2. Inlined wait loops → zero function-call overhead in hot path + * 3. Inlined DMA start → skips redundant STATUS_BUSY_BIT check + * 4. XOR bank toggle → avoids g%2 recomputation per iteration + * + * Utilizes true DMA transfers (Channel 0 for memory→IP, Channel 1 for IP→memory) * perfectly overlapped with Hardware IP computation to achieve Zero-Wait execution. */ #include -#include #include #include @@ -16,7 +21,7 @@ #include #include -/* ─── Configurable group count (default 10 for fast local testing) ─── */ +/* ─── Configurable group count (default 5000) ──────────────────────── */ #ifndef MATMUL_GROUP_NUM #define MATMUL_GROUP_NUM 5000 #endif @@ -49,7 +54,7 @@ unsigned long CORE_CLOCKS_PER_SEC = 33000000L; // DMA Physical Addresses for IP Space // (A and B are contiguous: A is 0x100~0x13F, B is 0x140~0x17F. Total 128 bytes) -#define MATMUL_PHYS_B0_AB (MATMUL_BASE_PHYS + 0x100) +#define MATMUL_PHYS_B0_AB (MATMUL_BASE_PHYS + 0x100) #define MATMUL_PHYS_B0_C (MATMUL_BASE_PHYS + 0x180) // 192 bytes #define MATMUL_PHYS_B1_AB (MATMUL_BASE_PHYS + 0x300) #define MATMUL_PHYS_B1_C (MATMUL_BASE_PHYS + 0x380) @@ -62,99 +67,151 @@ unsigned long CORE_CLOCKS_PER_SEC = 33000000L; // Hardware CRC register (offset 0x010 in matmul IP) #define MATMUL_CRC (MATMUL_BASE_UNCACHED + 0x010) -/* ─── Convenience macros ──────────────────────────────────────────── */ -#define REG_WR(addr, val) (*(volatile uint32_t *)(addr) = (uint32_t)(val)) -#define REG_RD(addr) (*(volatile uint32_t *)(addr)) - -static void wait_matmul_done(void) -{ - while (!(REG_RD(MATMUL_STATUS) & STATUS_DONE)) { } - REG_WR(MATMUL_STATUS, STATUS_DONE); // W1C: deassert -} - -static void wait_dma_done(int ch) -{ - while (!(DMA_CH(ch)->STATUS & STATUS_DONE_BIT)) { } - DMA_CH(ch)->STATUS = STATUS_DONE_BIT; // W1C -} +/* ─── Pre-computed DMA burst control word ──────────────────────────── */ +#define DMA_CTRL_VAL (CTRL_BURST_SIZE(2) | CTRL_BURST_LEN(63) | CTRL_START_BIT) /* ═══════════════════════════════════════════════════════════════════ */ int main(void) { if (MATMUL_GROUP_NUM <= 0) return 0; - volatile uint32_t *extram = (volatile uint32_t *)EXTRAM_BASE_UNCACHED; + /* ── Hot-path local volatile pointers (one-time addr calc) ──────── */ + volatile uint32_t *extram = (volatile uint32_t *)EXTRAM_BASE_UNCACHED; + volatile uint32_t *mat_status = (volatile uint32_t *)MATMUL_STATUS; + volatile uint32_t *mat_ctrl = (volatile uint32_t *)MATMUL_CTRL; + volatile uint32_t *mat_crc = (volatile uint32_t *)MATMUL_CRC; + volatile dma_ch_regs_t *ch0 = DMA_CH(0); + volatile dma_ch_regs_t *ch1 = DMA_CH(1); + uint32_t crc, t_prologue, t_mainloop, t_epilogue; - int g; + int g, bank; // Ping-Pong Register Address Arrays (Physical for DMA) uint32_t phys_bank_AB[2] = {MATMUL_PHYS_B0_AB, MATMUL_PHYS_B1_AB}; uint32_t phys_bank_C[2] = {MATMUL_PHYS_B0_C, MATMUL_PHYS_B1_C}; - + // IP Control Command Arrays uint32_t ctrl_start[2] = {CTRL_START_B0, CTRL_START_B1}; - + /* ── Start marker (must be first output) ──────────────────── */ printf("MATMUL_START\n"); - // 清理寄存器状态 - REG_WR(MATMUL_STATUS, STATUS_DONE | STATUS_ERROR); - REG_WR(MATMUL_CRC, 0); // 复位硬件 CRC32 为 0xFFFFFFFF + // Reset IP state + *mat_status = STATUS_DONE | STATUS_ERROR; + *mat_crc = 0; // Reset hardware CRC32 to 0xFFFFFFFF - /* ── Prologue: 第0组数据初始化 ────────────────────────── */ + /* ═══════════════════════════════════════════════════════════════ + * PROLOGUE: Load group 0 → Bank 0, start IP, pre-fire group 1 + * ═══════════════════════════════════════════════════════════════ */ t_prologue = get_ns(); - // DMA Ch0: 从 ExtRAM 将 Group 0 的 A、B (128 bytes) 搬入 IP 的 Bank 0 - dma_start_transfer(0, EXTRAM_PHYS_AB(0), phys_bank_AB[0], 128, 10); - wait_dma_done(0); - - // 启动 IP Bank 0 计算 - REG_WR(MATMUL_CTRL, ctrl_start[0]); + + // DMA Ch0: Load group 0 A+B (128 bytes) from ExtRAM → IP Bank 0 + ch0->SRC_ADDR = EXTRAM_PHYS_AB(0); + ch0->DST_ADDR = phys_bank_AB[0]; + ch0->LENGTH = 128; + ch0->TAG = 10; + ch0->CTRL = DMA_CTRL_VAL; + while (!(ch0->STATUS & STATUS_DONE_BIT)) {} + ch0->STATUS = STATUS_DONE_BIT; + + // Start IP Bank 0 (group 0) + *mat_ctrl = ctrl_start[0]; + + // Pre-fire: DMA Ch0 load group 1 → Bank 1 (overlaps with IP compute of group 0!) + if (MATMUL_GROUP_NUM > 1) { + ch0->SRC_ADDR = EXTRAM_PHYS_AB(1); + ch0->DST_ADDR = phys_bank_AB[1]; + ch0->LENGTH = 128; + ch0->TAG = 10; + ch0->CTRL = DMA_CTRL_VAL; + } + t_prologue = get_ns() - t_prologue; - /* ── Main Loop: 硬件完全流水线 (Overlapped Execution) ──── */ + /* ═══════════════════════════════════════════════════════════════ + * MAIN LOOP: Fully-pipelined — pre-fire DMA load at loop tail + * + * At iteration g: + * IP is computing group (g-1) on prev_bank + * Ch0 loaded group g to cur_bank (pre-fired in iteration g-1) + * + * Pipeline: + * Ch0: | load g+1 | | load g+2 | + * Ch1: | store g-1 | | store g | + * IP : | compute g | | compute g+1 | + * ═══════════════════════════════════════════════════════════════ */ t_mainloop = get_ns(); - // 在 g 循环中: - // IP 正在计算 prev_bank (g-1) - // DMA_CH0 正在加载 cur_bank (g) - // DMA_CH1 正在写回 prev_prev_bank (g-2) + bank = 1; // cur_bank for iteration g=1; prev_bank = bank ^ 1 + for (g = 1; g < MATMUL_GROUP_NUM; g++) { - int cur_bank = g % 2; - int prev_bank = (g - 1) % 2; + int cur_bank = bank; + int prev_bank = bank ^ 1; - // 1. 发起加载下一组数据的 DMA 传输 (Channel 0: Memory -> IP) - dma_start_transfer(0, EXTRAM_PHYS_AB(g), phys_bank_AB[cur_bank], 128, 10); + // 1. Wait for previous IP computation (group g-1 on prev_bank) + while (!(*mat_status & STATUS_DONE)) {} + *mat_status = STATUS_DONE; - // 2. 等待上一组在 IP 中的计算完成 - wait_matmul_done(); - - // 3. 确保上一次的结果写回 (Channel 1) 已经空闲 + // 2. Ensure previous DMA Ch1 store is done (group g-2) if (g > 1) { - wait_dma_done(1); + while (!(ch1->STATUS & STATUS_DONE_BIT)) {} + ch1->STATUS = STATUS_DONE_BIT; } - // 4. 发起写回刚才计算完成的结果 (Channel 1: IP -> Memory) - dma_start_transfer(1, phys_bank_C[prev_bank], EXTRAM_PHYS_C(g - 1), 192, 20); + // 3. Start DMA Ch1 store: group (g-1) result → ExtRAM + ch1->SRC_ADDR = phys_bank_C[prev_bank]; + ch1->DST_ADDR = EXTRAM_PHYS_C(g - 1); + ch1->LENGTH = 192; + ch1->TAG = 20; + ch1->CTRL = DMA_CTRL_VAL; - // 5. 确保当前要计算的输入数据 (Channel 0) 已经加载完毕 - wait_dma_done(0); + // 4. Wait for current DMA Ch0 load (group g → cur_bank, pre-fired in iteration g-1) + while (!(ch0->STATUS & STATUS_DONE_BIT)) {} + ch0->STATUS = STATUS_DONE_BIT; - // 6. 立即启动当前组在 IP 中的计算 - REG_WR(MATMUL_CTRL, ctrl_start[cur_bank]); + // 5. Start IP computation for current group on cur_bank + *mat_ctrl = ctrl_start[cur_bank]; + + // ★ 6. PRE-FIRE: DMA Ch0 load next group (g+1) → next_bank + // This runs CONCURRENTLY with IP computation started in step 5! + if (g < MATMUL_GROUP_NUM - 1) { + int next_bank = bank ^ 1; + ch0->SRC_ADDR = EXTRAM_PHYS_AB(g + 1); + ch0->DST_ADDR = phys_bank_AB[next_bank]; + ch0->LENGTH = 128; + ch0->TAG = 10; + ch0->CTRL = DMA_CTRL_VAL; + } + + // Toggle bank for next iteration + bank ^= 1; } t_mainloop = get_ns() - t_mainloop; - /* ── Epilogue: 收尾最后一组 ───────────────────────────── */ + /* ═══════════════════════════════════════════════════════════════ + * EPILOGUE: Flush the final group + * ═══════════════════════════════════════════════════════════════ */ t_epilogue = get_ns(); - wait_matmul_done(); // 等待最后一次计算完成 - wait_dma_done(1); // 确保之前的 DMA CH1 空闲 - - // DMA CH1 将最后一组结果写回 - dma_start_transfer(1, phys_bank_C[(MATMUL_GROUP_NUM - 1) % 2], EXTRAM_PHYS_C(MATMUL_GROUP_NUM - 1), 192, 20); - wait_dma_done(1); + + // Wait for last IP computation to finish + while (!(*mat_status & STATUS_DONE)) {} + *mat_status = STATUS_DONE; + + // Wait for last DMA Ch1 store (group MATMUL_GROUP_NUM-2) and then store final group + while (!(ch1->STATUS & STATUS_DONE_BIT)) {} + ch1->STATUS = STATUS_DONE_BIT; + + ch1->SRC_ADDR = phys_bank_C[(MATMUL_GROUP_NUM - 1) % 2]; + ch1->DST_ADDR = EXTRAM_PHYS_C(MATMUL_GROUP_NUM - 1); + ch1->LENGTH = 192; + ch1->TAG = 20; + ch1->CTRL = DMA_CTRL_VAL; + while (!(ch1->STATUS & STATUS_DONE_BIT)) {} + ch1->STATUS = STATUS_DONE_BIT; + t_epilogue = get_ns() - t_epilogue; /* ── Read hardware CRC32 result ──────────────────────────── */ - crc = REG_RD(MATMUL_CRC); + crc = *mat_crc; /* ── Final markers ────────────────────────────────────────── */ printf("MATMUL_CRC32=%08lx\n", (unsigned long)crc); @@ -166,4 +223,4 @@ int main(void) printf("MATMUL_DONE\n"); return 0; -} \ No newline at end of file +} diff --git a/sdk/user-sample.bin b/sdk/user-sample.bin index d3159bc92fabdf872afdc75f8ac19b45be856775..dbb16fd51a57cc77c80f68dc5635144409350532 100755 GIT binary patch delta 2727 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 LO8ybbn@jrN$+UPM delta 2810 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