From 77517498565d2639c52c2c640021ab4683564264 Mon Sep 17 00:00:00 2001 From: ZoroGH Date: Thu, 25 Jul 2024 23:32:28 +0800 Subject: [PATCH] fix(system): adjust cp len, frame sync pos, IQ map --- coe/agc.coe | 10589 +++++++++++++++++++++++++++++++++++++ coe/chu256.coe | 2 + coe/fir_interp4.coe | 48 +- coe/fir_interp4_0.15.coe | 28 + hdl/RecvTop.v | 2 +- hdl/Transmitter.v | 48 +- hdl/add_prefix.v | 2 +- hdl/enc_control.v | 8 +- sim/tb_sys_tx_rx_e_d.v | 215 + 9 files changed, 10900 insertions(+), 42 deletions(-) create mode 100644 coe/agc.coe create mode 100644 coe/chu256.coe create mode 100644 coe/fir_interp4_0.15.coe create mode 100644 sim/tb_sys_tx_rx_e_d.v diff --git a/coe/agc.coe b/coe/agc.coe new file mode 100644 index 0000000..4450b08 --- /dev/null +++ b/coe/agc.coe @@ -0,0 +1,10589 @@ +memory_initialization_radix=2; +memory_initialization_vector= +01 +01 +10 +00 +01 +11 +01 +01 +00 +10 +11 +01 +00 +11 +10 +11 +01 +11 +11 +10 +01 +11 +01 +00 +11 +10 +01 +10 +11 +00 +00 +00 +01 +00 +00 +00 +10 +11 +00 +00 +01 +01 +00 +11 +10 +01 +10 +01 +10 +11 +01 +01 +00 +00 +01 +00 +10 +11 +01 +11 +10 +01 +10 +01 +10 +11 +10 +11 +10 +01 +00 +01 +00 +11 +10 +01 +00 +00 +00 +01 +11 +00 +01 +10 +11 +00 +00 +11 +10 +10 +01 +01 +01 +01 +11 +10 +01 +11 +11 +00 +01 +01 +01 +10 +10 +00 +11 +00 +11 +01 +11 +10 +10 +10 +01 +01 +00 +00 +01 +11 +11 +01 +11 +00 +10 +00 +10 +11 +10 +11 +00 +00 +01 +11 +00 +11 +01 +11 +00 +10 +10 +10 +10 +00 +11 +01 +10 +00 +01 +01 +00 +01 +11 +01 +10 +00 +10 +11 +11 +10 +00 +00 +11 +00 +00 +00 +11 +00 +00 +00 +00 +01 +10 +11 +11 +10 +11 +11 +00 +10 +10 +10 +00 +01 +10 +00 +00 +00 +11 +00 +10 +00 +10 +11 +00 +10 +11 +10 +00 +11 +01 +11 +11 +11 +00 +10 +00 +01 +01 +00 +01 +11 +11 +10 +10 +01 +11 +00 +10 +11 +01 +10 +11 +01 +01 +11 +11 +11 +10 +10 +01 +01 +00 +11 +11 +00 +01 +00 +01 +11 +00 +00 +00 +11 +11 +01 +10 +01 +00 +11 +11 +11 +10 +01 +01 +00 +00 +11 +00 +11 +01 +01 +11 +01 +00 +00 +00 +01 +01 +01 +00 +10 +10 +00 +11 +11 +10 +11 +10 +00 +00 +10 +11 +10 +11 +01 +01 +11 +00 +01 +00 +10 +11 +11 +00 +00 +01 +10 +10 +01 +10 +11 +10 +10 +01 +10 +11 +00 +01 +11 +01 +01 +00 +11 +00 +10 +11 +11 +10 +10 +10 +00 +10 +11 +01 +10 +01 +00 +00 +00 +00 +00 +01 +11 +00 +00 +11 +10 +01 +10 +11 +11 +01 +01 +10 +10 +00 +10 +10 +00 +01 +10 +10 +00 +01 +00 +00 +11 +10 +01 +11 +11 +11 +00 +00 +11 +10 +00 +10 +10 +10 +11 +01 +01 +01 +11 +10 +10 +01 +00 +11 +10 +01 +11 +10 +10 +10 +10 +10 +01 +11 +01 +11 +11 +11 +01 +10 +00 +00 +11 +01 +01 +11 +11 +01 +10 +00 +10 +10 +10 +01 +11 +01 +00 +01 +10 +01 +00 +00 +00 +01 +11 +10 +00 +11 +11 +00 +10 +10 +10 +10 +00 +01 +11 +10 +01 +00 +01 +01 +00 +11 +00 +00 +01 +01 +00 +11 +11 +11 +11 +11 +10 +10 +01 +01 +00 +11 +00 +11 +01 +11 +00 +11 +00 +01 +01 +00 +01 +00 +11 +00 +01 +01 +11 +10 +00 +11 +01 +11 +01 +11 +00 +01 +01 +10 +00 +01 +11 +01 +10 +01 +01 +01 +01 +11 +01 +00 +11 +11 +01 +00 +01 +01 +01 +11 +01 +10 +10 +00 +01 +01 +10 +01 +01 +00 +11 +10 +11 +10 +10 +11 +00 +11 +11 +10 +00 +11 +11 +10 +11 +10 +10 +01 +11 +00 +11 +10 +11 +11 +00 +01 +00 +11 +00 +00 +11 +11 +10 +00 +10 +00 +00 +10 +01 +00 +10 +10 +10 +01 +00 +11 +01 +01 +00 +00 +10 +01 +00 +00 +00 +11 +10 +00 +00 +01 +00 +00 +00 +10 +00 +01 +00 +11 +11 +10 +11 +10 +10 +11 +10 +11 +10 +00 +11 +11 +11 +00 +00 +00 +11 +10 +00 +01 +11 +11 +00 +00 +01 +10 +00 +00 +10 +11 +01 +01 +11 +11 +11 +10 +11 +01 +11 +11 +10 +00 +00 +00 +01 +00 +00 +11 +00 +11 +11 +11 +00 +10 +11 +11 +00 +01 +01 +11 +10 +00 +10 +00 +11 +00 +00 +11 +10 +11 +11 +10 +00 +01 +01 +01 +00 +01 +10 +10 +00 +10 +10 +10 +01 +01 +01 +00 +01 +00 +01 +10 +10 +01 +01 +10 +00 +01 +01 +01 +01 +01 +11 +11 +01 +10 +11 +10 +11 +00 +11 +10 +11 +11 +00 +11 +11 +01 +00 +11 +10 +00 +11 +10 +10 +10 +11 +00 +10 +01 +01 +10 +11 +10 +00 +11 +01 +01 +00 +01 +11 +00 +00 +00 +00 +01 +10 +11 +00 +11 +11 +10 +01 +01 +11 +01 +00 +01 +10 +01 +01 +11 +01 +11 +00 +01 +01 +00 +11 +10 +10 +01 +01 +11 +10 +00 +10 +10 +01 +01 +00 +00 +00 +11 +00 +01 +00 +01 +00 +00 +00 +00 +00 +11 +10 +01 +10 +10 +11 +00 +10 +10 +10 +01 +01 +11 +11 +00 +01 +10 +00 +01 +11 +00 +01 +00 +10 +11 +01 +11 +11 +00 +00 +11 +01 +10 +01 +00 +11 +01 +01 +11 +00 +10 +11 +00 +11 +00 +00 +00 +01 +01 +11 +10 +11 +11 +00 +01 +00 +01 +11 +01 +01 +11 +11 +11 +10 +10 +10 +10 +10 +11 +01 +01 +01 +00 +01 +11 +00 +00 +01 +11 +11 +10 +01 +10 +00 +00 +01 +00 +01 +01 +00 +10 +01 +10 +01 +10 +01 +10 +10 +11 +11 +11 +01 +01 +10 +10 +10 +00 +11 +10 +10 +11 +11 +01 +10 +11 +00 +11 +01 +00 +00 +10 +10 +01 +01 +10 +01 +10 +10 +01 +01 +01 +11 +01 +00 +11 +00 +01 +11 +01 +10 +11 +10 +00 +11 +00 +10 +11 +01 +11 +01 +01 +00 +01 +10 +01 +10 +00 +10 +00 +10 +11 +00 +00 +01 +00 +10 +00 +00 +10 +00 +01 +00 +10 +11 +00 +11 +10 +00 +10 +10 +00 +01 +11 +11 +00 +00 +11 +01 +11 +00 +01 +11 +10 +10 +11 +11 +11 +10 +11 +11 +10 +00 +01 +01 +11 +00 +01 +00 +00 +00 +00 +01 +10 +10 +01 +10 +11 +01 +01 +11 +00 +00 +00 +00 +10 +11 +01 +01 +10 +11 +01 +10 +10 +11 +10 +01 +11 +11 +00 +10 +00 +00 +10 +00 +11 +11 +11 +11 +10 +00 +10 +00 +00 +00 +10 +01 +00 +00 +11 +00 +00 +01 +10 +01 +01 +00 +10 +01 +00 +11 +11 +01 +10 +01 +01 +10 +10 +11 +01 +11 +01 +00 +11 +01 +01 +10 +10 +01 +01 +00 +10 +10 +00 +11 +00 +01 +01 +00 +10 +11 +10 +10 +00 +01 +00 +10 +11 +00 +11 +11 +00 +00 +10 +01 +11 +10 +11 +01 +00 +01 +00 +10 +11 +00 +10 +00 +10 +01 +11 +00 +00 +01 +00 +11 +10 +01 +11 +01 +10 +10 +00 +00 +00 +00 +01 +10 +11 +00 +01 +10 +01 +01 +10 +00 +00 +11 +01 +01 +01 +01 +01 +10 +10 +11 +00 +00 +01 +00 +10 +11 +00 +00 +00 +01 +00 +00 +01 +00 +10 +00 +00 +10 +10 +10 +01 +10 +01 +01 +11 +11 +01 +00 +10 +00 +01 +01 +10 +10 +10 +10 +01 +10 +10 +01 +00 +01 +11 +00 +01 +00 +11 +11 +11 +00 +11 +10 +10 +11 +01 +00 +00 +01 +11 +10 +01 +11 +11 +01 +00 +10 +10 +11 +11 +10 +11 +11 +10 +10 +11 +01 +00 +11 +00 +00 +00 +00 +11 +00 +11 +00 +01 +01 +10 +00 +10 +01 +00 +01 +00 +11 +10 +01 +01 +11 +11 +11 +11 +11 +10 +11 +00 +01 +00 +01 +11 +01 +10 +11 +11 +00 +00 +10 +00 +10 +11 +01 +00 +00 +11 +10 +10 +01 +11 +01 +01 +10 +11 +10 +11 +11 +10 +01 +11 +10 +00 +01 +00 +00 +00 +10 +01 +11 +01 +11 +10 +00 +10 +01 +10 +01 +11 +00 +00 +00 +01 +01 +10 +01 +11 +11 +00 +11 +10 +10 +11 +10 +01 +01 +01 +10 +11 +00 +00 +10 +10 +11 +10 +00 +01 +00 +01 +10 +01 +10 +11 +11 +10 +11 +11 +00 +00 +01 +01 +10 +10 +10 +01 +01 +00 +11 +11 +00 +10 +11 +10 +10 +01 +11 +11 +01 +00 +00 +01 +10 +11 +01 +10 +01 +10 +01 +01 +10 +11 +01 +01 +00 +01 +01 +01 +11 +01 +00 +01 +01 +00 +00 +01 +01 +00 +01 +00 +10 +10 +01 +00 +10 +10 +11 +11 +10 +11 +00 +00 +11 +10 +00 +00 +11 +11 +11 +01 +10 +11 +10 +11 +00 +11 +01 +01 +11 +11 +01 +01 +10 +11 +11 +11 +00 +00 +01 +11 +11 +10 +01 +11 +01 +11 +11 +11 +10 +10 +10 +11 +01 +01 +11 +01 +10 +11 +11 +10 +00 +00 +01 +01 +11 +01 +11 +00 +01 +11 +01 +01 +11 +00 +00 +00 +10 +11 +00 +10 +00 +00 +11 +10 +01 +10 +11 +00 +01 +01 +00 +00 +00 +11 +01 +00 +01 +10 +10 +01 +01 +11 +00 +01 +10 +10 +10 +01 +11 +01 +01 +00 +11 +01 +01 +10 +11 +11 +01 +00 +01 +01 +11 +11 +11 +10 +10 +10 +11 +11 +01 +10 +00 +11 +11 +00 +11 +11 +00 +10 +00 +01 +10 +10 +11 +01 +00 +10 +11 +10 +00 +00 +10 +00 +10 +00 +01 +11 +01 +10 +11 +00 +01 +01 +10 +11 +11 +01 +00 +11 +10 +00 +01 +10 +01 +10 +00 +01 +10 +00 +01 +01 +10 +11 +11 +11 +10 +00 +01 +00 +10 +11 +00 +10 +11 +00 +00 +11 +10 +11 +01 +10 +10 +11 +11 +00 +11 +00 +11 +10 +00 +01 +00 +00 +00 +10 +01 +01 +10 +01 +01 +10 +01 +00 +11 +10 +01 +10 +10 +11 +11 +00 +11 +01 +01 +00 +10 +10 +10 +01 +10 +00 +11 +10 +10 +11 +01 +11 +01 +01 +10 +00 +01 +01 +01 +00 +10 +01 +01 +10 +01 +10 +01 +10 +10 +00 +00 +01 +01 +01 +10 +11 +11 +00 +00 +10 +01 +00 +11 +11 +01 +01 +11 +10 +10 +11 +00 +00 +11 +01 +11 +11 +10 +10 +00 +00 +01 +01 +01 +10 +01 +01 +00 +00 +00 +00 +11 +10 +10 +01 +11 +10 +11 +10 +01 +00 +11 +10 +11 +11 +01 +00 +00 +00 +10 +11 +01 +01 +11 +01 +11 +01 +10 +10 +10 +10 +11 +00 +00 +10 +11 +11 +10 +00 +00 +11 +01 +01 +10 +11 +01 +00 +01 +11 +01 +10 +00 +10 +10 +01 +10 +00 +10 +00 +11 +11 +01 +00 +11 +00 +01 +01 +00 +11 +00 +11 +11 +01 +11 +01 +10 +01 +10 +11 +10 +01 +10 +01 +10 +11 +00 +10 +01 +01 +00 +10 +11 +00 +01 +01 +00 +01 +00 +00 +01 +10 +11 +10 +10 +01 +11 +10 +00 +10 +10 +01 +01 +10 +11 +10 +11 +00 +01 +01 +00 +01 +01 +10 +00 +11 +00 +11 +11 +10 +01 +00 +11 +11 +10 +01 +01 +10 +11 +00 +00 +00 +11 +01 +00 +11 +01 +10 +01 +01 +01 +00 +01 +00 +01 +01 +01 +00 +00 +01 +00 +01 +00 +10 +10 +00 +01 +11 +11 +00 +11 +01 +10 +11 +00 +11 +11 +01 +11 +10 +00 +01 +00 +11 +11 +11 +10 +11 +11 +00 +01 +00 +10 +01 +01 +10 +01 +01 +11 +11 +00 +00 +00 +00 +10 +01 +10 +00 +00 +01 +10 +11 +10 +00 +11 +00 +00 +11 +10 +11 +01 +00 +01 +11 +01 +10 +10 +11 +10 +11 +00 +01 +10 +11 +00 +11 +11 +11 +00 +10 +10 +11 +10 +00 +11 +00 +11 +10 +11 +00 +01 +01 +00 +10 +11 +11 +10 +01 +10 +00 +00 +10 +00 +10 +01 +10 +00 +00 +10 +10 +01 +10 +10 +11 +10 +10 +10 +11 +10 +01 +11 +00 +10 +11 +11 +01 +00 +01 +11 +10 +01 +11 +00 +01 +11 +01 +11 +11 +10 +01 +00 +01 +00 +11 +11 +11 +10 +00 +10 +00 +01 +01 +11 +11 +10 +00 +00 +10 +11 +00 +00 +10 +10 +10 +01 +10 +11 +01 +01 +00 +10 +11 +10 +10 +00 +11 +00 +10 +00 +01 +01 +00 +11 +00 +10 +11 +10 +01 +01 +11 +01 +00 +11 +01 +10 +11 +01 +10 +00 +11 +11 +00 +01 +11 +11 +10 +01 +00 +01 +00 +01 +01 +10 +10 +00 +11 +00 +11 +00 +00 +00 +11 +00 +00 +00 +11 +01 +01 +10 +00 +11 +01 +01 +00 +01 +01 +11 +01 +01 +00 +00 +11 +11 +00 +11 +10 +01 +10 +00 +11 +00 +10 +10 +10 +10 +11 +10 +11 +11 +10 +00 +11 +00 +10 +01 +11 +10 +11 +10 +10 +10 +01 +00 +10 +00 +01 +00 +11 +11 +01 +00 +10 +11 +00 +01 +00 +11 +00 +10 +10 +01 +01 +00 +01 +00 +10 +01 +10 +10 +00 +01 +11 +01 +11 +10 +00 +01 +11 +01 +11 +01 +11 +10 +10 +11 +00 +00 +00 +11 +11 +10 +10 +00 +00 +01 +11 +00 +11 +11 +01 +00 +10 +11 +10 +00 +00 +10 +01 +01 +01 +11 +00 +00 +10 +00 +10 +11 +11 +11 +10 +10 +01 +00 +11 +00 +11 +01 +11 +00 +10 +10 +00 +00 +11 +01 +01 +10 +00 +11 +00 +11 +10 +00 +10 +01 +01 +10 +11 +10 +11 +11 +11 +11 +11 +00 +00 +11 +01 +11 +00 +00 +00 +10 +00 +10 +01 +11 +00 +11 +00 +11 +00 +01 +11 +00 +01 +00 +10 +10 +01 +00 +10 +11 +00 +00 +00 +01 +01 +10 +00 +00 +10 +10 +10 +10 +10 +00 +10 +11 +10 +10 +11 +10 +10 +00 +10 +10 +10 +01 +11 +10 +11 +00 +00 +11 +10 +11 +01 +00 +00 +01 +00 +11 +00 +00 +00 +01 +01 +11 +00 +11 +00 +10 +10 +01 +01 +00 +00 +01 +01 +11 +01 +01 +00 +01 +11 +00 +00 +10 +11 +01 +00 +11 +11 +10 +00 +10 +01 +11 +10 +00 +01 +10 +00 +11 +10 +01 +11 +11 +00 +01 +00 +11 +10 +10 +10 +10 +00 +01 +00 +00 +11 +00 +01 +01 +00 +01 +01 +10 +10 +01 +01 +11 +11 +11 +10 +10 +11 +10 +11 +01 +11 +01 +10 +01 +01 +01 +10 +10 +10 +11 +11 +00 +11 +11 +00 +11 +11 +00 +10 +00 +01 +01 +11 +11 +11 +11 +00 +11 +10 +01 +11 +01 +01 +10 +00 +10 +00 +11 +11 +01 +00 +01 +00 +01 +00 +00 +10 +01 +10 +00 +00 +00 +01 +01 +00 +01 +11 +00 +00 +11 +11 +00 +00 +00 +10 +00 +11 +00 +11 +10 +11 +00 +11 +00 +00 +01 +11 +01 +10 +11 +10 +00 +11 +00 +11 +00 +01 +10 +11 +01 +11 +00 +11 +10 +10 +01 +11 +01 +01 +11 +00 +10 +11 +11 +11 +00 +10 +01 +11 +00 +01 +01 +11 +11 +01 +11 +10 +01 +10 +01 +11 +00 +01 +10 +10 +00 +10 +00 +00 +10 +00 +10 +01 +10 +10 +00 +00 +11 +01 +10 +00 +01 +00 +01 +10 +01 +01 +01 +01 +01 +10 +00 +11 +10 +11 +11 +11 +10 +10 +00 +00 +10 +11 +00 +10 +00 +10 +00 +10 +11 +10 +00 +00 +00 +11 +10 +00 +11 +01 +01 +00 +11 +11 +11 +01 +00 +11 +10 +01 +00 +01 +11 +01 +10 +11 +11 +10 +00 +01 +11 +00 +11 +11 +10 +01 +00 +11 +00 +01 +00 +11 +01 +10 +10 +11 +01 +10 +11 +11 +00 +00 +00 +10 +01 +10 +00 +01 +01 +11 +00 +00 +00 +00 +10 +00 +01 +11 +11 +11 +01 +11 +01 +11 +00 +00 +10 +00 +10 +11 +00 +10 +01 +00 +11 +01 +10 +00 +00 +00 +11 +10 +11 +00 +11 +01 +10 +11 +10 +00 +10 +00 +00 +11 +01 +11 +01 +10 +10 +01 +01 +00 +00 +11 +00 +10 +01 +10 +01 +10 +10 +01 +00 +01 +01 +00 +11 +00 +00 +01 +11 +01 +01 +10 +11 +11 +00 +10 +01 +01 +01 +01 +10 +11 +10 +10 +00 +01 +11 +00 +01 +00 +11 +01 +11 +10 +00 +11 +10 +01 +11 +11 +00 +00 +01 +11 +00 +00 +10 +10 +00 +11 +00 +11 +11 +00 +01 +11 +01 +01 +11 +10 +00 +11 +00 +10 +00 +00 +01 +01 +10 +01 +00 +11 +11 +11 +11 +01 +10 +10 +01 +01 +00 +01 +10 +01 +01 +01 +11 +00 +11 +00 +01 +10 +11 +01 +01 +10 +10 +11 +10 +00 +01 +00 +01 +01 +10 +01 +00 +10 +00 +01 +01 +00 +01 +11 +01 +01 +10 +11 +10 +00 +11 +11 +01 +11 +00 +00 +00 +00 +10 +01 +10 +01 +00 +01 +10 +11 +00 +00 +11 +10 +01 +00 +01 +11 +01 +11 +10 +01 +00 +10 +01 +10 +00 +11 +01 +00 +10 +10 +00 +11 +01 +11 +01 +00 +00 +10 +10 +11 +01 +10 +00 +01 +11 +11 +00 +11 +11 +10 +10 +01 +10 +00 +11 +00 +11 +01 +00 +01 +00 +10 +11 +11 +11 +01 +00 +10 +00 +01 +11 +10 +00 +00 +11 +11 +10 +01 +10 +00 +00 +01 +11 +00 +01 +10 +10 +10 +11 +01 +10 +01 +01 +10 +00 +01 +11 +11 +10 +00 +01 +10 +00 +01 +11 +00 +10 +11 +10 +00 +00 +10 +01 +11 +00 +01 +10 +00 +01 +01 +11 +00 +11 +11 +10 +10 +10 +10 +01 +10 +10 +10 +10 +00 +01 +01 +11 +11 +10 +01 +10 +01 +10 +01 +10 +00 +01 +10 +01 +01 +00 +00 +11 +01 +11 +00 +11 +01 +11 +11 +10 +10 +10 +01 +00 +11 +00 +11 +10 +00 +10 +11 +10 +00 +11 +10 +00 +01 +10 +00 +01 +10 +01 +01 +11 +01 +10 +01 +11 +10 +00 +00 +00 +11 +01 +10 +11 +00 +10 +00 +11 +11 +11 +01 +10 +11 +01 +00 +11 +01 +11 +11 +01 +00 +10 +00 +00 +11 +10 +01 +00 +11 +10 +00 +11 +00 +00 +11 +01 +01 +11 +11 +00 +10 +10 +11 +01 +00 +00 +10 +00 +00 +11 +11 +00 +10 +10 +10 +10 +01 +01 +10 +10 +10 +11 +10 +10 +01 +11 +11 +11 +00 +10 +11 +01 +11 +01 +01 +10 +10 +10 +01 +11 +00 +11 +01 +10 +10 +10 +01 +01 +11 +00 +01 +00 +10 +00 +01 +10 +10 +00 +01 +10 +00 +10 +10 +11 +11 +01 +11 +01 +11 +00 +00 +01 +01 +11 +00 +11 +00 +10 +01 +11 +11 +01 +10 +01 +01 +10 +00 +00 +00 +10 +00 +11 +10 +11 +01 +11 +00 +11 +11 +11 +11 +00 +00 +01 +11 +10 +00 +00 +10 +11 +11 +01 +10 +11 +01 +01 +01 +00 +11 +00 +11 +01 +11 +10 +00 +10 +00 +11 +01 +10 +11 +00 +11 +11 +01 +01 +00 +11 +01 +10 +00 +01 +10 +01 +01 +00 +01 +11 +11 +01 +00 +00 +11 +10 +11 +00 +01 +01 +00 +11 +11 +10 +11 +01 +11 +10 +01 +11 +11 +11 +00 +11 +10 +11 +01 +11 +00 +10 +00 +11 +01 +00 +01 +10 +10 +11 +11 +10 +10 +00 +11 +11 +11 +10 +00 +01 +00 +11 +11 +01 +01 +11 +11 +10 +10 +01 +00 +01 +00 +10 +10 +00 +01 +00 +01 +10 +01 +01 +01 +11 +00 +00 +00 +11 +11 +11 +11 +11 +10 +00 +01 +10 +10 +11 +11 +10 +10 +01 +00 +11 +01 +01 +01 +00 +01 +00 +10 +11 +01 +01 +00 +00 +10 +10 +01 +11 +00 +10 +11 +10 +01 +01 +10 +10 +11 +01 +11 +00 +10 +11 +11 +10 +11 +10 +00 +11 +00 +01 +10 +11 +11 +10 +10 +10 +10 +11 +00 +11 +10 +01 +01 +00 +10 +01 +00 +10 +00 +00 +00 +01 +10 +00 +00 +01 +01 +11 +01 +01 +11 +01 +01 +01 +00 +11 +01 +00 +10 +01 +01 +11 +00 +10 +10 +11 +11 +01 +10 +11 +10 +10 +10 +10 +10 +11 +00 +11 +01 +10 +10 +10 +01 +01 +01 +11 +01 +01 +11 +00 +01 +11 +10 +10 +10 +01 +10 +11 +10 +11 +10 +00 +10 +00 +10 +11 +11 +11 +00 +11 +11 +11 +10 +00 +00 +10 +00 +11 +10 +01 +11 +10 +10 +00 +01 +01 +01 +10 +11 +10 +10 +01 +10 +10 +11 +10 +11 +11 +11 +01 +10 +00 +11 +00 +01 +01 +11 +10 +11 +11 +01 +01 +11 +10 +11 +10 +11 +00 +00 +11 +01 +11 +10 +11 +01 +01 +01 +11 +01 +01 +01 +10 +00 +10 +00 +00 +11 +10 +11 +11 +10 +10 +10 +10 +11 +01 +00 +00 +01 +00 +10 +11 +01 +00 +11 +10 +11 +11 +11 +01 +01 +01 +11 +11 +01 +11 +00 +01 +10 +11 +00 +11 +11 +11 +11 +11 +10 +00 +01 +00 +01 +11 +01 +00 +11 +11 +00 +01 +00 +00 +01 +01 +11 +10 +00 +11 +10 +00 +11 +01 +11 +11 +00 +01 +01 +01 +01 +10 +11 +11 +11 +00 +11 +10 +11 +01 +00 +11 +11 +11 +01 +01 +01 +00 +00 +01 +01 +00 +00 +00 +00 +01 +01 +01 +01 +11 +10 +10 +11 +00 +00 +00 +10 +01 +01 +10 +11 +10 +00 +00 +10 +01 +10 +01 +10 +10 +00 +00 +11 +00 +11 +10 +11 +00 +01 +00 +10 +11 +10 +11 +01 +01 +00 +11 +10 +11 +11 +10 +11 +00 +10 +10 +11 +11 +00 +10 +01 +00 +01 +01 +10 +10 +10 +10 +10 +01 +00 +00 +01 +00 +00 +01 +11 +01 +11 +10 +01 +10 +10 +11 +10 +00 +01 +10 +11 +10 +11 +01 +11 +10 +10 +01 +01 +11 +00 +10 +10 +00 +10 +00 +00 +11 +00 +10 +11 +00 +11 +01 +11 +01 +10 +10 +11 +01 +01 +11 +11 +00 +00 +10 +00 +10 +01 +00 +11 +00 +01 +00 +11 +00 +11 +10 +01 +00 +10 +11 +00 +11 +01 +11 +10 +01 +10 +10 +11 +10 +11 +00 +01 +00 +11 +01 +00 +01 +10 +11 +11 +10 +01 +00 +11 +00 +00 +00 +00 +11 +10 +01 +10 +11 +11 +01 +10 +10 +11 +11 +11 +10 +10 +01 +00 +11 +11 +10 +10 +00 +11 +11 +01 +11 +01 +11 +01 +00 +00 +01 +01 +11 +10 +11 +11 +11 +10 +11 +10 +10 +10 +11 +10 +10 +00 +01 +01 +01 +00 +11 +01 +01 +10 +01 +00 +00 +11 +10 +00 +10 +10 +10 +11 +10 +00 +11 +10 +01 +10 +00 +11 +01 +10 +01 +10 +01 +00 +00 +11 +01 +10 +10 +11 +11 +01 +00 +11 +10 +01 +00 +11 +00 +00 +01 +10 +01 +00 +00 +01 +01 +01 +00 +01 +00 +01 +01 +01 +10 +01 +10 +01 +00 +00 +11 +00 +10 +11 +10 +11 +10 +10 +10 +11 +01 +01 +10 +10 +00 +00 +11 +11 +00 +11 +00 +00 +00 +01 +00 +00 +01 +11 +11 +11 +01 +10 +10 +11 +01 +01 +01 +10 +11 +00 +00 +10 +00 +01 +11 +00 +11 +00 +00 +00 +11 +11 +11 +01 +00 +00 +01 +00 +01 +00 +11 +00 +11 +11 +00 +10 +10 +10 +01 +11 +10 +01 +11 +00 +11 +11 +00 +10 +11 +01 +00 +00 +11 +01 +00 +10 +11 +01 +01 +01 +10 +01 +00 +10 +00 +00 +00 +00 +01 +00 +01 +10 +10 +10 +10 +10 +11 +10 +01 +00 +11 +00 +11 +10 +01 +00 +11 +00 +10 +01 +11 +10 +11 +00 +01 +01 +01 +00 +11 +00 +10 +10 +10 +01 +01 +11 +10 +10 +10 +00 +00 +00 +10 +01 +01 +01 +11 +10 +10 +11 +10 +01 +01 +00 +01 +00 +01 +11 +01 +10 +11 +01 +01 +00 +00 +00 +11 +11 +00 +01 +01 +00 +00 +10 +10 +11 +11 +11 +10 +00 +01 +11 +00 +11 +10 +01 +00 +01 +10 +10 +11 +00 +10 +11 +00 +01 +10 +00 +01 +10 +01 +11 +00 +11 +00 +11 +10 +10 +10 +11 +11 +00 +01 +10 +11 +01 +00 +11 +00 +00 +01 +01 +00 +11 +10 +00 +01 +01 +10 +11 +10 +10 +11 +00 +01 +00 +11 +10 +11 +01 +11 +11 +01 +00 +10 +01 +00 +01 +01 +00 +01 +10 +11 +00 +11 +01 +11 +11 +10 +01 +01 +10 +11 +01 +11 +01 +00 +00 +00 +00 +00 +10 +01 +10 +01 +11 +00 +11 +10 +00 +00 +00 +00 +00 +01 +00 +10 +11 +10 +00 +10 +00 +01 +10 +11 +11 +00 +10 +01 +10 +10 +00 +01 +00 +01 +00 +11 +00 +11 +01 +01 +10 +00 +01 +10 +11 +01 +00 +11 +10 +11 +10 +01 +00 +10 +10 +10 +11 +10 +01 +00 +00 +10 +10 +11 +00 +10 +11 +10 +11 +01 +10 +01 +00 +10 +10 +00 +01 +00 +01 +10 +11 +11 +10 +01 +01 +01 +11 +11 +01 +01 +01 +00 +11 +00 +10 +10 +11 +00 +11 +10 +01 +10 +00 +01 +11 +10 +00 +11 +00 +10 +00 +10 +01 +11 +11 +00 +10 +01 +11 +01 +11 +11 +10 +10 +00 +00 +11 +10 +10 +00 +10 +11 +10 +01 +01 +01 +10 +11 +11 +00 +11 +10 +11 +11 +11 +00 +00 +00 +11 +11 +10 +01 +11 +11 +10 +00 +00 +11 +01 +11 +11 +01 +11 +10 +01 +11 +10 +00 +10 +00 +11 +01 +10 +01 +11 +01 +11 +10 +11 +11 +01 +10 +01 +10 +10 +00 +00 +10 +10 +11 +00 +01 +00 +11 +10 +00 +01 +01 +10 +00 +10 +11 +10 +01 +01 +00 +01 +10 +10 +00 +00 +10 +10 +01 +10 +01 +00 +00 +11 +00 +11 +00 +00 +01 +00 +01 +11 +10 +11 +00 +00 +11 +00 +00 +10 +01 +01 +00 +01 +01 +10 +10 +11 +00 +01 +10 +00 +10 +10 +01 +01 +01 +11 +10 +00 +01 +11 +10 +10 +11 +01 +10 +10 +11 +01 +01 +10 +01 +01 +10 +10 +10 +11 +11 +10 +11 +10 +01 +10 +00 +01 +11 +01 +01 +10 +00 +01 +00 +10 +01 +00 +00 +11 +00 +01 +00 +00 +00 +11 +11 +11 +11 +00 +00 +00 +01 +01 +01 +11 +10 +10 +00 +11 +11 +00 +01 +10 +01 +11 +10 +11 +01 +11 +10 +10 +01 +10 +01 +11 +10 +00 +00 +10 +11 +01 +10 +11 +00 +10 +11 +01 +01 +10 +11 +11 +11 +10 +00 +00 +00 +01 +00 +11 +00 +11 +00 +00 +01 +10 +00 +01 +01 +10 +11 +10 +00 +00 +01 +11 +10 +10 +00 +00 +00 +11 +10 +01 +01 +10 +11 +01 +11 +01 +00 +10 +00 +00 +10 +10 +10 +11 +00 +11 +11 +00 +10 +01 +01 +10 +11 +00 +00 +01 +00 +01 +01 +11 +01 +10 +11 +10 +10 +00 +10 +10 +01 +11 +11 +01 +00 +11 +01 +11 +01 +01 +01 +01 +10 +11 +11 +01 +00 +11 +01 +10 +01 +10 +00 +10 +11 +11 +10 +10 +10 +00 +01 +10 +00 +00 +01 +01 +01 +01 +00 +10 +10 +10 +10 +10 +11 +01 +10 +00 +01 +10 +01 +10 +11 +01 +01 +01 +01 +11 +10 +00 +11 +10 +11 +11 +11 +10 +10 +10 +00 +00 +01 +01 +00 +11 +11 +01 +00 +00 +11 +01 +01 +11 +01 +10 +00 +11 +01 +00 +10 +00 +01 +01 +11 +01 +00 +10 +01 +11 +11 +11 +00 +01 +01 +11 +10 +01 +10 +01 +01 +01 +11 +11 +11 +10 +11 +11 +00 +01 +10 +11 +01 +01 +10 +01 +01 +01 +11 +01 +00 +10 +10 +00 +11 +01 +01 +00 +00 +10 +11 +11 +10 +10 +00 +00 +10 +11 +00 +00 +10 +10 +10 +01 +10 +00 +01 +10 +10 +00 +11 +11 +01 +00 +10 +00 +10 +01 +01 +00 +10 +11 +01 +01 +11 +00 +01 +11 +01 +00 +01 +01 +00 +11 +01 +00 +11 +11 +11 +11 +00 +00 +11 +00 +11 +11 +01 +10 +00 +11 +10 +01 +00 +10 +01 +01 +11 +00 +10 +10 +01 +01 +01 +00 +11 +01 +01 +11 +10 +01 +11 +11 +11 +01 +01 +01 +01 +11 +10 +11 +00 +11 +00 +11 +01 +10 +11 +10 +00 +01 +01 +01 +10 +10 +01 +11 +10 +00 +00 +10 +01 +01 +00 +11 +00 +00 +01 +10 +00 +11 +11 +01 +00 +00 +00 +10 +00 +00 +10 +00 +10 +11 +10 +00 +10 +01 +00 +11 +00 +00 +10 +11 +01 +11 +01 +00 +01 +01 +10 +10 +01 +10 +01 +00 +10 +01 +10 +01 +10 +10 +11 +11 +10 +11 +10 +00 +11 +00 +10 +01 +11 +00 +01 +11 +11 +00 +01 +00 +11 +11 +00 +01 +11 +00 +01 +11 +11 +01 +11 +01 +00 +11 +10 +11 +10 +10 +10 +00 +11 +10 +00 +01 +00 +01 +11 +10 +10 +01 +10 +10 +11 +00 +10 +00 +11 +11 +11 +11 +01 +00 +11 +00 +11 +01 +01 +00 +00 +01 +10 +11 +10 +00 +10 +00 +01 +10 +01 +10 +11 +00 +10 +10 +11 +10 +01 +10 +01 +01 +01 +00 +10 +01 +11 +00 +11 +11 +00 +11 +10 +01 +11 +01 +01 +01 +00 +10 +00 +10 +00 +11 +11 +10 +01 +11 +11 +00 +11 +11 +00 +10 +00 +11 +01 +00 +11 +10 +10 +01 +10 +00 +00 +10 +11 +01 +11 +11 +01 +01 +11 +00 +11 +11 +00 +10 +11 +00 +00 +01 +10 +00 +01 +00 +00 +10 +01 +10 +01 +00 +10 +01 +11 +11 +10 +10 +10 +00 +11 +01 +10 +11 +01 +00 +10 +01 +01 +00 +01 +11 +10 +01 +11 +00 +01 +11 +00 +10 +00 +10 +10 +11 +00 +01 +10 +00 +00 +11 +11 +00 +00 +01 +01 +01 +01 +00 +11 +00 +01 +00 +01 +10 +10 +01 +00 +00 +10 +11 +11 +00 +11 +00 +11 +10 +00 +10 +10 +11 +00 +01 +10 +00 +01 +10 +10 +00 +10 +11 +10 +10 +11 +10 +10 +01 +11 +00 +01 +11 +00 +00 +11 +10 +00 +00 +10 +01 +00 +00 +11 +01 +11 +00 +01 +00 +00 +00 +10 +10 +00 +11 +11 +01 +01 +11 +11 +10 +00 +00 +01 +10 +10 +01 +00 +01 +01 +11 +10 +01 +10 +10 +10 +11 +11 +10 +11 +11 +11 +01 +11 +10 +11 +01 +10 +11 +10 +11 +00 +01 +00 +11 +11 +01 +10 +01 +11 +01 +10 +10 +10 +01 +00 +00 +11 +01 +01 +00 +10 +00 +10 +01 +11 +10 +01 +00 +11 +00 +10 +10 +00 +10 +00 +11 +00 +10 +00 +10 +11 +11 +10 +10 +01 +10 +00 +10 +11 +01 +00 +10 +01 +00 +00 +10 +01 +11 +11 +11 +11 +00 +11 +00 +10 +00 +10 +01 +11 +01 +11 +10 +10 +11 +10 +01 +11 +00 +11 +01 +00 +00 +10 +01 +01 +01 +00 +10 +01 +00 +00 +10 +10 +10 +10 +01 +11 +11 +10 +10 +00 +00 +01 +01 +00 +01 +00 +01 +11 +00 +00 +11 +01 +00 +00 +00 +00 +00 +11 +01 +11 +10 +10 +10 +10 +01 +11 +11 +01 +11 +10 +00 +10 +11 +01 +00 +01 +11 +10 +10 +10 +10 +00 +10 +11 +11 +10 +00 +11 +11 +10 +00 +10 +01 +11 +10 +01 +10 +10 +11 +00 +10 +00 +11 +01 +00 +10 +00 +10 +11 +11 +11 +10 +10 +10 +00 +00 +11 +11 +11 +10 +10 +11 +11 +11 +10 +11 +01 +00 +10 +00 +01 +11 +11 +11 +00 +11 +11 +01 +11 +00 +11 +10 +00 +11 +10 +10 +10 +10 +11 +01 +00 +10 +10 +00 +00 +11 +10 +10 +11 +01 +00 +00 +01 +11 +10 +01 +00 +10 +01 +00 +11 +11 +11 +10 +01 +00 +11 +01 +01 +10 +00 +00 +00 +10 +01 +10 +01 +10 +00 +11 +01 +00 +10 +10 +00 +11 +11 +00 +11 +01 +11 +00 +01 +10 +11 +00 +01 +11 +01 +10 +01 +00 +01 +00 +00 +10 +00 +10 +11 +01 +10 +11 +11 +10 +00 +10 +00 +11 +01 +01 +11 +00 +00 +11 +11 +10 +01 +01 +10 +10 +01 +10 +01 +10 +01 +10 +01 +01 +11 +10 +11 +01 +11 +01 +10 +10 +10 +10 +11 +10 +11 +11 +11 +10 +00 +00 +11 +10 +11 +10 +10 +00 +10 +11 +01 +01 +00 +01 +00 +01 +11 +10 +00 +11 +01 +11 +01 +10 +00 +11 +11 +01 +11 +11 +10 +00 +10 +10 +11 +11 +01 +00 +11 +00 +01 +11 +10 +11 +11 +01 +11 +10 +10 +11 +10 +00 +11 +10 +11 +01 +11 +00 +00 +11 +00 +01 +01 +10 +11 +01 +00 +00 +11 +10 +01 +10 +10 +10 +11 +01 +01 +10 +11 +01 +11 +01 +00 +10 +00 +01 +10 +00 +11 +10 +11 +10 +10 +00 +11 +01 +00 +11 +00 +11 +00 +10 +11 +00 +01 +00 +00 +11 +00 +10 +01 +00 +01 +01 +01 +00 +10 +10 +01 +00 +00 +10 +01 +00 +01 +10 +11 +01 +10 +10 +00 +00 +01 +00 +11 +01 +00 +01 +01 +00 +01 +10 +11 +01 +01 +01 +11 +00 +11 +01 +11 +00 +11 +11 +11 +10 +11 +11 +10 +00 +11 +01 +01 +00 +11 +01 +10 +01 +00 +11 +10 +11 +00 +11 +01 +11 +10 +10 +10 +11 +11 +01 +01 +11 +11 +00 +11 +10 +11 +11 +01 +10 +11 +01 +10 +11 +00 +01 +11 +11 +00 +11 +10 +00 +11 +00 +11 +01 +00 +11 +01 +10 +01 +11 +01 +00 +01 +00 +11 +01 +10 +11 +01 +01 +01 +00 +00 +01 +01 +00 +00 +10 +00 +01 +00 +11 +00 +00 +00 +01 +10 +11 +01 +11 +01 +11 +00 +11 +11 +00 +10 +00 +10 +10 +01 +11 +11 +10 +10 +10 +11 +11 +10 +11 +01 +11 +01 +10 +10 +10 +00 +00 +01 +00 +11 +11 +11 +10 +11 +01 +01 +00 +10 +00 +10 +00 +10 +10 +10 +11 +10 +11 +01 +11 +01 +10 +00 +11 +11 +00 +00 +11 +11 +00 +10 +01 +10 +01 +10 +10 +00 +00 +11 +10 +01 +00 +11 +01 +00 +00 +00 +00 +00 +00 +01 +10 +10 +01 +10 +11 +10 +11 +11 +01 +11 +00 +01 +10 +10 +01 +11 +11 +11 +01 +00 +01 +11 +01 +00 +10 +00 +11 +11 +11 +11 +10 +00 +00 +10 +10 +01 +10 +01 +10 +11 +01 +00 +11 +11 +00 +00 +00 +10 +00 +10 +00 +01 +00 +10 +01 +01 +11 +00 +00 +10 +11 +01 +10 +00 +00 +11 +10 +00 +00 +11 +00 +00 +01 +00 +00 +10 +00 +11 +00 +10 +01 +10 +11 +01 +11 +11 +10 +01 +11 +00 +10 +01 +10 +10 +01 +11 +10 +00 +00 +01 +10 +00 +01 +00 +10 +10 +01 +00 +00 +01 +10 +10 +00 +10 +01 +10 +01 +11 +00 +01 +10 +00 +11 +01 +10 +10 +10 +10 +01 +11 +01 +00 +00 +00 +00 +10 +11 +10 +00 +11 +11 +01 +11 +11 +00 +01 +01 +00 +01 +00 +11 +01 +01 +00 +01 +11 +01 +01 +10 +11 +11 +11 +11 +11 +10 +00 +10 +01 +11 +10 +00 +11 +11 +11 +10 +01 +10 +11 +01 +11 +01 +10 +00 +11 +01 +10 +11 +01 +00 +10 +01 +00 +01 +00 +11 +01 +01 +10 +01 +01 +00 +01 +00 +00 +01 +01 +00 +01 +00 +10 +11 +10 +00 +10 +11 +10 +10 +01 +10 +10 +01 +10 +00 +00 +00 +01 +01 +00 +10 +10 +10 +00 +11 +10 +00 +11 +11 +10 +11 +00 +01 +00 +11 +10 +11 +11 +11 +11 +00 +00 +00 +01 +11 +01 +00 +00 +10 +00 +01 +01 +10 +01 +10 +11 +10 +10 +00 +10 +10 +10 +01 +10 +10 +11 +01 +10 +00 +01 +01 +00 +01 +11 +10 +00 +00 +01 +01 +00 +11 +10 +01 +00 +11 +11 +11 +00 +11 +10 +00 +00 +00 +00 +11 +01 +00 +10 +01 +00 +10 +01 +00 +11 +00 +10 +00 +11 +01 +11 +01 +00 +11 +11 +01 +11 +00 +00 +10 +01 +01 +10 +10 +01 +00 +10 +00 +11 +00 +00 +01 +10 +11 +10 +11 +01 +10 +01 +10 +00 +10 +10 +10 +00 +01 +01 +11 +01 +01 +01 +11 +01 +01 +01 +01 +01 +00 +10 +10 +11 +11 +10 +01 +11 +11 +01 +10 +11 +10 +11 +10 +01 +01 +11 +01 +00 +11 +01 +11 +10 +00 +01 +11 +11 +01 +11 +01 +00 +10 +00 +01 +10 +10 +01 +01 +00 +11 +01 +00 +11 +10 +10 +10 +01 +00 +10 +11 +11 +01 +00 +01 +00 +01 +10 +01 +10 +10 +00 +10 +00 +01 +11 +01 +11 +10 +11 +10 +01 +11 +10 +11 +10 +01 +11 +10 +11 +10 +01 +01 +10 +11 +01 +01 +01 +10 +01 +00 +11 +10 +11 +11 +10 +10 +11 +00 +00 +01 +01 +00 +10 +00 +01 +11 +10 +01 +00 +11 +11 +01 +11 +10 +10 +11 +01 +11 +01 +11 +00 +11 +11 +00 +10 +01 +10 +11 +01 +10 +11 +10 +11 +00 +00 +10 +10 +01 +10 +11 +00 +11 +00 +00 +00 +10 +00 +10 +10 +10 +10 +01 +11 +00 +00 +10 +00 +01 +11 +01 +01 +01 +10 +01 +10 +10 +00 +00 +01 +00 +01 +11 +10 +11 +01 +11 +01 +01 +01 +00 +01 +00 +10 +10 +11 +11 +00 +00 +01 +00 +10 +11 +01 +00 +01 +10 +10 +10 +10 +00 +10 +11 +11 +10 +11 +01 +10 +10 +01 +11 +00 +00 +01 +00 +10 +00 +01 +01 +10 +11 +10 +10 +01 +10 +00 +00 +00 +11 +01 +11 +10 +01 +00 +00 +11 +01 +11 +10 +11 +01 +01 +00 +11 +01 +00 +01 +00 +01 +00 +10 +11 +00 +01 +10 +01 +11 +00 +11 +11 +00 +01 +11 +01 +01 +10 +01 +10 +10 +01 +01 +01 +11 +10 +10 +01 +10 +10 +00 +00 +00 +11 +11 +10 +10 +10 +01 +00 +11 +01 +01 +01 +01 +00 +11 +11 +11 +10 +10 +00 +11 +10 +01 +00 +00 +01 +10 +00 +11 +11 +00 +11 +11 +11 +00 +00 +11 +01 +11 +01 +11 +01 +10 +01 +11 +01 +00 +11 +10 +00 +01 +00 +11 +10 +00 +00 +11 +00 +01 +11 +10 +11 +11 +11 +11 +01 +00 +00 +01 +01 +00 +01 +00 +00 +11 +01 +10 +10 +01 +01 +00 +10 +10 +10 +01 +11 +00 +00 +11 +11 +10 +10 +10 +11 +00 +01 +00 +01 +11 +10 +10 +11 +00 +01 +00 +11 +00 +10 +00 +01 +11 +11 +00 +00 +00 +11 +01 +10 +11 +11 +01 +00 +01 +11 +10 +01 +11 +01 +10 +00 +10 +10 +10 +00 +01 +01 +11 +10 +00 +11 +10 +11 +01 +00 +00 +00 +10 +01 +00 +11 +10 +00 +01 +01 +11 +10 +10 +10 +00 +10 +11 +01 +00 +01 +10 +10 +11 +11 +10 +10 +11 +01 +00 +01 +01 +01 +10 +01 +10 +10 +00 +10 +10 +00 +00 +01 +10 +10 +00 +00 +11 +00 +11 +10 +01 +00 +00 +01 +00 +10 +11 +01 +10 +00 +10 +01 +00 +00 +10 +11 +11 +00 +10 +01 +01 +01 +00 +01 +10 +10 +01 +01 +01 +10 +00 +01 +01 +00 +10 +00 +00 +01 +00 +10 +11 +10 +01 +11 +01 +01 +11 +01 +10 +10 +10 +00 +00 +00 +01 +01 +01 +10 +00 +01 +10 +11 +00 +00 +11 +11 +01 +00 +10 +01 +01 +01 +01 +00 +01 +10 +10 +00 +01 +01 +01 +01 +00 +10 +00 +01 +11 +01 +01 +10 +10 +10 +00 +00 +11 +11 +11 +01 +01 +10 +11 +11 +00 +01 +00 +01 +00 +11 +01 +10 +10 +10 +11 +01 +00 +00 +01 +00 +00 +01 +01 +00 +00 +00 +01 +00 +10 +01 +01 +10 +00 +10 +00 +00 +01 +10 +10 +10 +11 +11 +01 +01 +10 +00 +10 +10 +00 +01 +10 +01 +10 +10 +01 +01 +01 +00 +01 +00 +11 +00 +01 +10 +01 +10 +01 +01 +00 +11 +01 +11 +01 +10 +10 +11 +11 +00 +11 +01 +01 +10 +01 +10 +11 +10 +11 +10 +11 +10 +10 +10 +11 +10 +11 +11 +00 +11 +00 +10 +00 +01 +00 +01 +10 +11 +11 +00 +01 +10 +11 +01 +10 +01 +01 +00 +00 +10 +11 +01 +10 +01 +00 +11 +10 +10 +11 +11 +10 +10 +10 +01 +00 +01 +10 +10 +01 +10 +01 +00 +10 +00 +10 +10 +10 +10 +10 +10 +01 +10 +01 +11 +01 +10 +10 +01 +00 +10 +01 +10 +10 +10 +11 +00 +01 +10 +11 +10 +10 +10 +01 +10 +10 +11 +01 +00 +11 +11 +00 +00 +11 +01 +00 +11 +00 +01 +10 +11 +00 +01 +01 +00 +11 +10 +11 +00 +11 +01 +11 +11 +01 +11 +10 +01 +11 +01 +10 +01 +11 +00 +11 +10 +00 +01 +00 +10 +01 +01 +01 +01 +01 +01 +11 +01 +00 +10 +11 +11 +01 +00 +01 +10 +00 +01 +10 +01 +10 +01 +10 +11 +01 +00 +01 +01 +01 +10 +11 +11 +01 +01 +01 +11 +10 +00 +10 +10 +00 +00 +01 +11 +10 +00 +00 +01 +10 +10 +11 +10 +00 +00 +01 +00 +00 +00 +00 +01 +01 +00 +10 +00 +10 +01 +11 +00 +00 +00 +10 +00 +10 +10 +11 +11 +11 +11 +01 +11 +11 +10 +11 +10 +10 +01 +01 +01 +00 +11 +01 +00 +01 +00 +10 +00 +00 +11 +01 +00 +00 +10 +01 +10 +11 +01 +01 +10 +11 +00 +11 +00 +01 +11 +10 +00 +10 +01 +00 +10 +00 +01 +10 +00 +01 +01 +10 +00 +01 +11 +10 +00 +00 +01 +00 +10 +10 +00 +00 +01 +11 +11 +00 +11 +00 +01 +10 +11 +00 +01 +00 +10 +10 +01 +10 +00 +01 +10 +01 +01 +01 +00 +11 +01 +11 +01 +10 +00 +10 +10 +01 +11 +11 +01 +10 +00 +11 +01 +10 +10 +01 +01 +11 +01 +00 +00 +11 +10 +11 +00 +01 +11 +00 +11 +01 +00 +11 +00 +11 +11 +00 +11 +01 +00 +11 +10 +11 +10 +11 +00 +10 +11 +01 +10 +01 +00 +00 +11 +00 +10 +11 +00 +11 +11 +00 +11 +01 +11 +10 +10 +00 +10 +10 +11 +00 +01 +10 +11 +01 +10 +11 +11 +00 +10 +10 +01 +00 +00 +11 +10 +11 +11 +11 +10 +00 +01 +11 +01 +10 +01 +00 +11 +10 +00 +00 +01 +00 +01 +11 +11 +11 +10 +11 +01 +11 +10 +00 +01 +00 +10 +11 +10 +00 +11 +01 +11 +00 +00 +11 +11 +00 +00 +10 +10 +11 +00 +10 +00 +10 +10 +00 +11 +10 +10 +00 +10 +00 +00 +01 +00 +11 +11 +00 +00 +10 +01 +10 +00 +11 +11 +00 +11 +10 +10 +00 +00 +01 +11 +10 +00 +11 +11 +10 +10 +01 +11 +00 +00 +10 +10 +01 +00 +11 +01 +01 +00 +01 +00 +01 +00 +11 +11 +01 +11 +00 +00 +01 +01 +11 +01 +10 +01 +01 +00 +00 +01 +01 +11 +01 +00 +10 +01 +10 +10 +11 +01 +11 +10 +01 +10 +10 +01 +00 +00 +00 +00 +01 +01 +10 +00 +11 +00 +11 +00 +10 +11 +01 +11 +11 +10 +11 +10 +10 +01 +01 +00 +11 +11 +00 +10 +11 +00 +10 +10 +10 +11 +00 +00 +00 +00 +11 +10 +10 +01 +01 +10 +10 +01 +01 +10 +11 +00 +10 +11 +01 +10 +11 +00 +11 +00 +00 +00 +11 +00 +01 +11 +10 +10 +10 +10 +00 +10 +01 +10 +10 +01 +10 +10 +10 +10 +00 +11 +11 +01 +11 +11 +10 +11 +01 +01 +10 +01 +00 +10 +00 +11 +00 +11 +11 +01 +10 +11 +10 +01 +11 +01 +01 +01 +01 +00 +01 +01 +11 +11 +01 +10 +11 +11 +11 +00 +00 +10 +11 +11 +00 +11 +00 +00 +01 +01 +00 +00 +00 +01 +01 +01 +11 +00 +01 +01 +11 +01 +11 +00 +01 +01 +00 +11 +10 +11 +11 +11 +11 +10 +10 +00 +10 +00 +01 +10 +10 +10 +11 +01 +00 +00 +10 +01 +01 +01 +01 +11 +10 +00 +11 +10 +00 +01 +01 +11 +00 +00 +11 +11 +00 +11 +11 +10 +10 +00 +00 +11 +11 +01 +11 +00 +01 +10 +11 +10 +01 +11 +01 +10 +11 +00 +11 +00 +11 +10 +00 +00 +10 +01 +01 +01 +00 +11 +00 +11 +10 +01 +01 +11 +01 +10 +10 +01 +01 +01 +00 +00 +01 +01 +01 +10 +01 +00 +00 +00 +10 +11 +11 +11 +00 +11 +11 +01 +10 +00 +01 +10 +01 +00 +00 +10 +01 +11 +01 +10 +01 +10 +10 +00 +10 +01 +00 +10 +11 +01 +00 +10 +01 +00 +01 +10 +01 +00 +01 +10 +11 +10 +11 +01 +00 +10 +01 +01 +01 +10 +10 +01 +11 +11 +11 +00 +00 +11 +01 +10 +11 +01 +00 +01 +01 +01 +11 +00 +00 +11 +00 +11 +11 +11 +00 +10 +11 +11 +11 +00 +00 +00 +01 +01 +10 +11 +10 +01 +11 +11 +00 +11 +00 +00 +00 +01 +10 +00 +10 +00 +01 +10 +10 +01 +01 +11 +01 +11 +00 +01 +11 +11 +00 +00 +00 +10 +10 +01 +00 +10 +11 +00 +10 +11 +10 +01 +11 +01 +10 +11 +00 +01 +01 +00 +10 +00 +10 +01 +00 +10 +01 +01 +00 +01 +01 +11 +11 +10 +10 +10 +01 +10 +10 +00 +01 +10 +01 +10 +01 +10 +01 +10 +11 +10 +11 +10 +10 +10 +11 +01 +00 +01 +01 +11 +01 +11 +00 +10 +01 +00 +00 +10 +11 +11 +10 +10 +01 +10 +01 +11 +00 +10 +10 +01 +10 +11 +11 +10 +10 +01 +01 +10 +11 +01 +11 +11 +11 +00 +00 +11 +11 +10 +11 +01 +10 +11 +10 +11 +01 +10 +10 +01 +00 +00 +10 +00 +00 +00 +11 +00 +00 +10 +11 +10 +11 +00 +11 +01 +11 +10 +11 +11 +01 +11 +00 +00 +01 +11 +00 +01 +01 +10 +01 +11 +00 +00 +01 +00 +11 +10 +01 +00 +01 +01 +01 +11 +11 +00 +10 +10 +01 +00 +11 +10 +00 +01 +00 +11 +00 +11 +01 +10 +10 +11 +01 +10 +11 +10 +10 +00 +10 +00 +10 +00 +10 +00 +01 +01 +10 +01 +10 +10 +10 +11 +10 +00 +00 +10 +00 +10 +00 +10 +11 +01 +01 +11 +11 +00 +01 +00 +10 +11 +10 +00 +11 +11 +10 +11 +00 +10 +10 +00 +01 +10 +01 +11 +10 +01 +01 +00 +01 +11 +00 +00 +00 +10 +00 +10 +10 +11 +01 +10 +01 +10 +00 +00 +10 +10 +00 +00 +10 +01 +11 +11 +00 +00 +11 +00 +01 +00 +11 +11 +00 +11 +11 +00 +11 +00 +01 +10 +00 +10 +01 +01 +10 +11 +01 +11 +11 +01 +11 +10 +01 +00 +10 +10 +00 +11 +01 +11 +10 +00 +11 +11 +10 +10 +11 +01 +01 +01 +11 +01 +11 +01 +10 +01 +11 +00 +00 +00 +01 +11 +10 +10 +01 +00 +00 +00 +00 +01 +01 +11 +01 +00 +00 +10 +10 +01 +10 +10 +01 +01 +10 +11 +01 +00 +01 +00 +11 +10 +11 +01 +10 +11 +01 +10 +01 +11 +10 +01 +01 +11 +10 +00 +00 +10 +01 +00 +01 +10 +00 +01 +01 +00 +10 +10 +01 +10 +00 +01 +01 +10 +01 +11 +00 +11 +11 +01 +11 +00 +10 +00 +11 +01 +00 +10 +00 +01 +11 +01 +11 +01 +01 +00 +00 +01 +00 +01 +10 +01 +10 +01 +10 +10 +01 +01 +01 +11 +01 +01 +00 +10 +11 +11 +00 +10 +01 +01 +10 +10 +10 +01 +00 +10 +00 +00 +01 +00 +00 +10 +01 +01 +11 +11 +10 +10 +00 +01 +01 +01 +00 +00 +11 +00 +10 +10 +00 +10 +11 +01 +01 +10 +01 +10 +11 +10 +00 +11 +00 +00 +00 +11 +11 +10 +11 +01 +10 +00 +10 +10 +00 +11 +10 +10 +01 +10 +10 +01 +11 +11 +10 +10 +10 +00 +10 +01 +00 +10 +10 +01 +00 +10 +11 +11 +00 +00 +11 +11 +10 +00 +00 +01 +01 +11 +11 +00 +01 +01 +00 +10 +11 +01 +11 +10 +00 +01 +00 +00 +11 +11 +11 +11 +00 +10 +11 +01 +10 +11 +00 +11 +11 +10 +01 +01 +00 +11 +11 +01 +00 +01 +10 +00 +00 +11 +00 +10 +11 +11 +11 +10 +00 +11 +11 +10 +01 +10 +01 +10 +00 +11 +11 +11 +01 +11 +00 +11 +11 +11 +01 +01 +00 +00 +01 +11 +01 +01 +11 +11 +10 +10 +01 +00 +01 +01 +10 +10 +01 +10 +01 +00 +11 +10 +00 +00 +00 +11 +10 +00 +01 +10 +00 +01 +00 +01 +00 +10 +10 +11 +00 +01 +01 +10 +00 +10 +11 +00 +01 +01 +01 +01 +11 +01 +00 +01 +11 +11 +00 +10 +11 +10 +10 +11 +11 +00 +11 +11 +11 +10 +00 +01 +10 +00 +11 +10 +01 +00 +11 +00 +01 +01 +11 +11 +01 +11 +11 +10 +00 +10 +10 +11 +11 +00 +11 +01 +01 +01 +00 +01 +01 +10 +00 +01 +10 +11 +11 +10 +10 +11 +10 +01 +11 +10 +00 +11 +01 +11 +00 +00 +11 +11 +00 +00 +00 +10 +11 +00 +11 +01 +11 +00 +11 +01 +00 +11 +10 +11 +01 +00 +11 +10 +01 +01 +01 +10 +01 +11 +01 +11 +11 +00 +10 +11 +00 +01 +10 +01 +11 +00 +11 +01 +01 +10 +00 +10 +01 +11 +00 +11 +10 +01 +01 +00 +01 +01 +11 +10 +01 +00 +00 +11 +11 +10 +01 +10 +00 +00 +10 +11 +01 +01 +11 +01 +01 +01 +00 +10 +11 +00 +00 +11 +00 +11 +10 +11 +01 +00 +10 +01 +11 +00 +11 +01 +00 +01 +01 +00 +01 +00 +10 +11 +11 +01 +01 +11 +11 +11 +01 +00 +11 +11 +11 +10 +01 +00 +10 +10 +01 +10 +01 +00 +00 +01 +10 +10 +11 +01 +01 +11 +10 +10 +10 +01 +10 +01 +01 +11 +00 +11 +01 +01 +00 +11 +11 +11 +00 +11 +00 +10 +11 +10 +11 +10 +01 +10 +10 +00 +01 +11 +10 +01 +00 +00 +00 +11 +00 +00 +00 +01 +11 +01 +00 +10 +00 +11 +11 +01 +11 +01 +10 +01 +01 +01 +01 +01 +11 +00 +11 +01 +01 +00 +11 +10 +11 +00 +00 +01 +01 +11 +00 +00 +00 +10 +00 +00 +10 +00 +10 +01 +11 +01 +01 +01 +10 +11 +01 +11 +01 +10 +01 +00 +11 +01 +00 +01 +00 +10 +10 +01 +00 +11 +10 +10 +01 +00 +00 +00 +01 +01 +10 +11 +00 +10 +10 +10 +00 +10 +10 +11 +01 +01 +10 +11 +11 +10 +01 +11 +01 +10 +01 +01 +01 +01 +00 +01 +11 +11 +11 +01 +01 +11 +10 +01 +00 +10 +01 +00 +01 +11 +10 +00 +10 +10 +10 +11 +00 +11 +11 +11 +00 +10 +00 +10 +01 +10 +11 +11 +11 +11 +10 +01 +01 +01 +10 +00 +01 +10 +01 +10 +10 +00 +10 +11 +01 +00 +10 +11 +00 +00 +10 +00 +10 +00 +10 +11 +11 +10 +10 +00 +01 +00 +11 +10 +01 +10 +10 +00 +01 +01 +01 +10 +00 +11 +11 +01 +10 +01 +11 +11 +00 +00 +01 +01 +01 +00 +01 +10 +01 +11 +11 +00 +00 +11 +01 +10 +11 +11 +11 +11 +00 +00 +11 +11 +00 +00 +01 +10 +00 +11 +10 +00 +01 +01 +10 +11 +01 +01 +01 +11 +00 +01 +00 +00 +10 +01 +00 +01 +01 +00 +10 +11 +01 +11 +01 +10 +00 +00 +01 +01 +10 +01 +00 +01 +10 +01 +01 +00 +00 +01 +10 +00 +01 +11 +01 +11 +10 +10 +11 +10 +11 +01 +01 +10 +10 +10 +01 +11 +00 +00 +01 +01 +00 +11 +10 +01 +10 +10 +10 +01 +01 +01 +11 +11 +01 +01 +00 +10 +10 +00 +00 +00 +00 +10 +00 +11 +11 +00 +00 +11 +11 +10 +00 +00 +01 +01 +10 +11 +00 +00 +10 +01 +11 +11 +00 +10 +00 +01 +11 +01 +10 +00 +11 +10 +11 +01 +01 +01 +01 +11 +11 +11 +01 +11 +01 +11 +11 +00 +10 +00 +00 +00 +11 +01 +01 +01 +01 +11 +01 +11 +10 +01 +11 +01 +10 +11 +01 +01 +01 +00 +10 +11 +10 +00 +01 +10 +01 +01 +11 +11 +00 +01 +00 +01 +00 +01 +00 +10 +11 +11 +01 +10 +00 +10 +10 +01 +01 +10 +11 +01 +00 +10 +00 +10 +11 +01 +11 +01 +11 +10 +11 +11 +00 +01 +10 +10 +01 +10 +11 +01 +10 +10 +11 +11 +10 +10 +00 +11 +10 +01 +00 +10 +11 +11 +10 +11 +00 +11 +01 +01 +00 +11 +00 +01 +00 +11 +00 +10 +11 +01 +10 +10 +01 +10 +01 +01 +00 +00 +00 +10 +10 +01 +00 +10 +00 +01 +01 +00 +11 +10 +11 +11 +01 +10 +00 +00 +11 +01 +11 +01 +00 +00 +01 +10 +10 +01 +01 +11 +01 +00 +11 +10 +11 +00 +01 +11 +01 +00 +00 +11 +11 +10 +00 +10 +10 +00 +11 +10 +11 +11 +00 +10 +00 +11 +00 +01 +01 +11 +10 +10 +00 +01 +01 +01 +00 +11 +11 +01 +11 +10 +11 +10 +10 +10 +11 +11 +11 +01 +10 +01 +10 +11 +10 +01 +10 +01 +00 +10 +00 +00 +11 +01 +01 +00 +01 +01 +10 +00 +11 +00 +01 +01 +10 +00 +10 +00 +10 +10 +10 +10 +11 +01 +10 +11 +01 +00 +00 +10 +11 +00 +11 +10 +01 +10 +01 +11 +01 +01 +10 +11 +00 +11 +01 +11 +11 +01 +00 +00 +11 +00 +11 +10 +01 +00 +01 +11 +10 +00 +01 +10 +00 +11 +10 +11 +10 +01 +10 +00 +01 +10 +11 +10 +11 +00 +10 +10 +01 +11 +01 +01 +11 +10 +01 +10 +00 +10 +11 +00 +10 +10 +11 +01 +00 +00 +01 +10 +01 +01 +01 +00 +10 +00 +01 +01 +01 +01 +10 +01 +11 +11 +01 +11 +11 +10 +01 +00 +10 +01 +01 +11 +10 +01 +01 +10 +11 +00 +01 +10 +01 +01 +01 +11 +11 +00 +01 +01 +01 +10 +01 +01 +11 +10 +11 +10 +00 +11 +11 +10 +11 +00 +00 +10 +11 +01 +00 +01 +01 +11 +00 +10 +10 +00 +00 +10 +11 +10 +00 +11 +10 +10 +00 +10 +00 +01 +11 +01 +00 +00 +11 +11 +11 +10 +00 +01 +10 +11 +10 +10 +01 +10 +11 +10 +00 +11 +00 +11 +10 +10 +10 +11 +11 +01 +10 +11 +11 +00 +10 +10 +10 +10 +10 +10 +01 +10 +01 +00 +11 +00 +10 +01 +00 +01 +11 +00 +11 +11 +11 +01 +10 +01 +11 +01 +00 +01 +11 +00 +10 +00 +10 +11 +01 +11 +00 +10 +10 +10 +00 +00 +00 +10 +11 +01 +10 +10 +01 +00 +11 +10 +00 +00 +00 +10 +11 +01 +10 +00 +10 +11 +00 +11 +01 +00 +11 +11 +10 +01 +01 +00 +10 +11 +01 +10 +11 +00 +00 +00 +00 +00 +01 +10 +10 +00 +10 +10 +11 +11 +00 +00 +10 +00 +11 +10 +10 +01 +00 +10 +10 +01 +11 +00 +01 +01 +01 +11 +11 +11 +11 +11 +11 +00 +01 +00 +01 +00 +01 +01 +11 +10 +01 +11 +11 +11 +10 +10 +11 +11 +01 +00 +10 +00 +01 +11 +01 +00 +01 +00 +01 +11 +11 +10 +11 +00 +00 +01 +11 +10 +01 +10 +10 +00 +11 +01 +11 +10 +00 +00 +00 +00 +11 +01 +11 +00 +00 +11 +10 +00 +00 +01 +00 +01 +00 +00 +01 +00 +01 +00 +00 +11 +01 +11 +11 +11 +00 +10 +00 +00 +11 +01 +10 +01 +01 +11 +01 +01 +10 +00 +01 +00 +11 +11 +11 +00 +00 +00 +11 +11 +01 +10 +10 +00 +10 +01 +00 +10 +01 +01 +01 +01 +11 +01 +11 +00 +10 +10 +10 +11 +01 +01 +01 +00 +01 +00 +01 +10 +11 +01 +00 +01 +11 +10 +10 +10 +01 +01 +10 +01 +01 +01 +00 +01 +10 +01 +10 +10 +00 +00 +10 +01 +01 +11 +11 +10 +00 +01 +11 +11 +00 +01 +11 +10 +11 +01 +00 +00 +00 +10 +11 +01 +10 +11 +00 +00 +01 +10 +00 +11 +00 +01 +00 +10 +01 +11 +00 +01 +00 +10 +00 +10 +01 +01 +10 +11 +10 +01 +10 +11 +10 +11 +11 +01 +10 +01 +11 +10 +00 +10 +10 +00 +00 +11 +00 +10 +00 +00 +01 +11 +00 +00 +01 +10 +11 +11 +00 +00 +10 +00 +01 +00 +11 +10 +01 +01 +00 +00 +01 +00 +01 +11 +11 +00 +00 +11 +11 +10 +01 +00 +11 +01 +00 +10 +01 +00 +01 +01 +10 +11 +11 +01 +10 +01 +10 +00 +11 +11 +10 +11 +01 +01 +00 +10 +01 +00 +00 +10 +11 +10 +01 +00 +11 +01 +11 +11 +10 +11 +11 +11 +11 +00 +01 +10 +00 +01 +01 +00 +11 +01 +01 +11 +01 +01 +00 +11 +00 +11 +00 +11 +11 +00 +11 +10 +01 +01 +00 +10 +10 +10 +00 +01 +00 +11 +11 +10 +00 +00 +01 +10 +00 +11 +11 +01 +11 +10 +01 +11 +00 +01 +10 +00 +10 +01 +10 +10 +00 +01 +10 +11 +11 +00 +11 +00 +00 +00 +10 +00 +01 +10 +01 +01 +01 +00 +10 +10 +00 +01 +00 +00 +00 +01 +01 +10 +01 +10 +10 +10 +10 +11 +11 +11 +10 +00 +00 +11 +10 +01 +11 +11 +10 +11 +01 +01 +00 +00 +00 +11 +00 +01 +10 +10 +11 +10 +11 +11 +00 +10 +11 +11 +10 +01 +11 +10 +10 +00 +10 +11 +00 +00 +11 +10 +10 +11 +00 +01 +01 +00 +01 +11 +10 +01 +11 +01 +11 +11 +10 +01 +11 +00 +00 +10 +10 +01 +10 +11 +10 +11 +11 +10 +00 +01 +11 +11 +10 +00 +00 +10 +01 +10 +00 +10 +11 +01 +10 +00 +00 +00 +01 +01 +10 +00 +10 +11 +01 +11 +01 +10 +01 +00 +01 +10 +10 +00 +11 +01 +10 +11 +01 +01 +00 +01 +01 +10 +00 +01 +10 +11 +11 +10 +00 +00 +01 +11 +00 +10 +01 +10 +00 +10 +11 +00 +00 +11 +01 +10 +01 +00 +01 +00 +10 +11 +00 +01 +10 +01 +11 +11 +11 +01 +10 +01 +00 +10 +10 +10 +10 +00 +11 +00 +10 +10 +10 +00 +01 +01 +00 +01 +10 +10 +11 +11 +10 +10 +10 +01 +01 +00 +01 +10 +10 +01 +01 +11 +00 +00 +10 +10 +10 +01 +10 +11 +00 +01 +10 +00 +00 +01 +01 +00 +01 +11 +00 +10 +11 +10 +00 +11 +10 +11 +11 +00 +01 +11 +00 +00 +11 +10 +10 +00 +01 +10 +00 +11 +11 +01 +00 +01 +11 +00 +00 +00 +10 +11 +11 +01 +11 +01 +01 +10 +00 +00 +10 +00 +00 +11 +10 +00 +10 +11 +00 +10 +00 +00 +10 +01 +01 +10 +00 +00 +11 +00 +10 +01 +01 +10 +11 +11 +10 +10 +10 +10 +01 +00 +10 +00 +10 +00 +00 +01 +10 +11 +01 +01 +10 +00 +10 +10 +00 +11 +01 +10 +11 +10 +10 +00 +01 +10 +01 +11 +11 +10 +01 +10 +00 +00 +00 +11 +00 +01 +01 +11 +11 +01 +01 +10 +01 +10 +11 +10 +11 +11 +01 +10 +01 +00 +10 +11 +00 +00 +00 +10 +01 +10 +11 +01 +10 +01 +10 +00 +11 +11 +00 +11 +10 +10 +00 +10 +00 +10 +01 +00 +10 +01 +00 +11 +10 +01 +01 +00 +10 +11 +11 +10 +00 +01 +01 +00 +10 +11 +00 +01 +00 +11 +01 +11 +01 +01 +01 +00 +10 +00 +11 +11 +01 +10 +10 +11 +11 +01 +11 +01 +10 +10 +10 +11 +10 +11 +10 +00 +01 +00 +01 +01 +01 +11 +11 +01 +10 +01 +01 +11 +00 +10 +00 +11 +10 +11 +11 +11 +10 +00 +01 +11 +11 +11 +10 +11 +10 +10 +10 +11 +00 +01 +00 +01 +11 +01 +00 +11 +11 +10 +01 +10 +00 +00 +00 +10 +10 +10 +01 +01 +01 +00 +00 +11 +10 +00 +00 +11 +11 +10 +00 +10 +11 +10 +01 +10 +11 +10 +00 +00 +11 +11 +00 +11 +11 +00 +00 +00 +10 +00 +11 +01 +11 +00 +01 +10 +01 +01 +01 +01 +00 +00 +00 +11 +10 +11 +01 +01 +01 +01 +10 +01 +11 +00 +01 +11 +10 +00 +11 +00 +00 +11 +10 +10 +10 +00 +11 +11 +11 +00 +10 +01 +00 +10 +10 +01 +10 +00 +11 +11 +11 +10 +11 +01 +11 +11 +10 +00 +00 +10 +00 +11 +00 +10 +11 +10 +01 +10 +10 +00 +01 +11 +00 +11 +01 +00 +10 +10 +11 +10 +10 +10 +00 +01 +10 +01 +00 +01 +00 +01 +00 +01 +00 +10 +10 +10 +00 +01 +00 +00 +11 +10 +11 +00 +11 +01 +00 +10 +10 +11 +11 +01 +01 +11 +10 +00 +10 +00 +11 +01 +01 +11 +11 +00 +00 +01 +01 +01 +01 +00 +11 +01 +11 +10 +01 +10 +10 +11 +00 +11 +00 +00 +01 +00 +10 +11 +01 +10 +01 +11 +01 +10 +10 +11 +11 +00 +01 +11 +11 +10 +10 +00 +11 +01 +01 +01 +01 +00 +00 +00 +11 +11 +11 +00 +01 +10 +01 +00 +00 +00 +01 +11 +10 +11 +01 +10 +11 +11 +00 +01 +10 +00 +00 +11 +00 +11 +00 +01 +10 +01 +00 +00 +01 +01 +11 +10 +01 +01 +10 +11 +10 +01 +10 +10 +01 +01 +00 +00 +01 +11 +11 +10 +11 +11 +11 +10 +00 +11 +10 +00 +01 +00 +01 +10 +00 +01 +01 +01 +01 +01 +00 +10 +11 +00 +00 +10 +11 +10 +00 +00 +01 +00 +01 +01 +01 +00 +01 +10 +10 +01 +11 +01 +11 +11 +10 +00 +11 +01 +10 +10 +11 +11 +00 +00 +10 +01 +00 +01 +11 +01 +11 +10 +10 +10 +11 +00 +01 +11 +11 +11 +00 +00 +01 +00 +01 +11 +11 +00 +01 +00 +00 +01 +10 +01 +01 +11 +00 +01 +01 +11 +11 +11 +11 +00 +11 +10 +01 +11 +00 +10 +10 +11 +11 +10 +11 +00 +11 +00 +11 +11 +10 +11 +00 +01 +11 +10 +01 +01 +11 +01 +11 +01 +10 +11 +00 +11 +11 +11 +11 +; \ No newline at end of file diff --git a/coe/chu256.coe b/coe/chu256.coe new file mode 100644 index 0000000..95a3c50 --- /dev/null +++ b/coe/chu256.coe @@ -0,0 +1,2 @@ +memory_initialization_radix=16; +memory_initialization_vector=00007FFF 01927FFD 06487FD8 0E1C7F37 18F97D89 26A87A05 36BA73B5 4869698B 5A825A82 6B4A45CD 78842B1F 7F860AFB 7D89E707 7022C248 55F5A129 2F878928 00008001 CD928A5B A129AA0B 8512DC5A 827718F9 9E105268 D4E17884 1A827D39 5A825A82 7DD5176E 73B5C946 3AF28E63 E7078277 9C12B005 80280648 A69C5B9C 00007FFF 5B9C5964 7FD8F9B8 4FFB9C12 E7078277 8E63C50E 8C4B36BA E8927DD5 5A825A82 7D39E57E 2B1F877C AD989E10 827718F9 DC5A7AEE 5ED755F5 75A5CD92 00008001 8928D079 AA0B5ED7 3DB87022 7D89E707 0AFB807A 877CD4E1 BA336B4A 5A825A82 698BB797 C9468C4B 85FB26A8 18F97D89 7F37F1E4 F9B88028 80030192 00007FFF 7FFDFE6E F9B88028 80C90E1C 18F97D89 7A05D958 C9468C4B 96754869 5A825A82 45CD94B6 877CD4E1 F5057F86 7D89E707 C2488FDE AA0B5ED7 76D82F87 00008001 8A5B326E 5ED755F5 23A68512 827718F9 526861F0 2B1F877C 82C71A82 5A825A82 176E822B 8C4B36BA 719D3AF2 E7078277 B00563EE 7FD8F9B8 A464A69C 00007FFF 5964A464 80280648 63EE4FFB E7078277 C50E719D 73B5C946 822BE892 5A825A82 E57E82C7 D4E17884 61F0AD98 827718F9 7AEE23A6 A129AA0B 326E75A5 00008001 D07976D8 55F5A129 8FDE3DB8 7D89E707 807AF505 78842B1F 94B6BA33 5A825A82 B7979675 36BA73B5 D95885FB 18F97D89 F1E480C9 06487FD8 FE6E8003 00007FFF FE6E8003 06487FD8 F1E480C9 18F97D89 D95885FB 36BA73B5 B7979675 5A825A82 94B6BA33 78842B1F 807AF505 7D89E707 8FDE3DB8 55F5A129 D07976D8 00008001 326E75A5 A129AA0B 7AEE23A6 827718F9 61F0AD98 D4E17884 E57E82C7 5A825A82 822BE892 73B5C946 C50E719D E7078277 63EE4FFB 80280648 5964A464 00007FFF A464A69C 7FD8F9B8 B00563EE E7078277 719D3AF2 8C4B36BA 176E822B 5A825A82 82C71A82 2B1F877C 526861F0 827718F9 23A68512 5ED755F5 8A5B326E 00008001 76D82F87 AA0B5ED7 C2488FDE 7D89E707 F5057F86 877CD4E1 45CD94B6 5A825A82 96754869 C9468C4B 7A05D958 18F97D89 80C90E1C F9B88028 7FFDFE6E 00007FFF 80030192 F9B88028 7F37F1E4 18F97D89 85FB26A8 C9468C4B 698BB797 5A825A82 BA336B4A 877CD4E1 0AFB807A 7D89E707 3DB87022 AA0B5ED7 8928D079 00008001 75A5CD92 5ED755F5 DC5A7AEE 827718F9 AD989E10 2B1F877C 7D39E57E 5A825A82 E8927DD5 8C4B36BA 8E63C50E E7078277 4FFB9C12 7FD8F9B8 5B9C5964 00007FFF A69C5B9C 80280648 9C12B005 E7078277 3AF28E63 73B5C946 7DD5176E 5A825A82 1A827D39 D4E17884 9E105268 827718F9 8512DC5A A129AA0B CD928A5B 00008001 2F878928 55F5A129 7022C248 7D89E707 7F860AFB 78842B1F 6B4A45CD 5A825A82 4869698B 36BA73B5 26A87A05 18F97D89 0E1C7F37 06487FD8 01927FFD; diff --git a/coe/fir_interp4.coe b/coe/fir_interp4.coe index 7fd0060..ed408b7 100644 --- a/coe/fir_interp4.coe +++ b/coe/fir_interp4.coe @@ -1,28 +1,28 @@ radix=10; coefdata= --1053 -1199 -3216 -3453 -1180 --2791 --6185 --6256 --1263 -8366 -19870 -29190 +-761 +-441 +766 +1954 +1708 +-660 +-4042 +-5641 +-2532 +6186 +18176 +28624 32767 -29190 -19870 -8366 --1263 --6256 --6185 --2791 -1180 -3453 -3216 -1199 --1053 +28624 +18176 +6186 +-2532 +-5641 +-4042 +-660 +1708 +1954 +766 +-441 +-761 ; \ No newline at end of file diff --git a/coe/fir_interp4_0.15.coe b/coe/fir_interp4_0.15.coe new file mode 100644 index 0000000..7fd0060 --- /dev/null +++ b/coe/fir_interp4_0.15.coe @@ -0,0 +1,28 @@ +radix=10; +coefdata= +-1053 +1199 +3216 +3453 +1180 +-2791 +-6185 +-6256 +-1263 +8366 +19870 +29190 +32767 +29190 +19870 +8366 +-1263 +-6256 +-6185 +-2791 +1180 +3453 +3216 +1199 +-1053 +; \ No newline at end of file diff --git a/hdl/RecvTop.v b/hdl/RecvTop.v index 5c6c80e..3f8940c 100644 --- a/hdl/RecvTop.v +++ b/hdl/RecvTop.v @@ -255,7 +255,7 @@ module RecvTop ( .m_axis_data_tdata (dmf_tdata_interp4_q) ); - localparam CNT_CHU_SEQ_SYNC_MAX = 8;//! should not less than 3 due to the minimum rst of aresetn + localparam CNT_CHU_SEQ_SYNC_MAX = 40;//! should not less than 3 due to the minimum rst of aresetn wire [21:0] mag; wire mag_valid; diff --git a/hdl/Transmitter.v b/hdl/Transmitter.v index f8f76c3..b453aca 100644 --- a/hdl/Transmitter.v +++ b/hdl/Transmitter.v @@ -9,16 +9,16 @@ // * ╚══════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ * // * *************************************************** * // * Create Date: 2023/12/18 -// * Update Date: 2024/03/17 +// * Update Date: 2024/07/24 // NOTE: 接口中的hop_wait和参数GAP_LEN均是为了等待,hop是为了跳频切换,gap是为了满足帧同步延迟,!!!将hop_wait设置为0并不能去掉改状态 module Transmitter #( - parameter AGC_HEADER_LEN = 2130, + parameter AGC_HEADER_LEN = 10586, parameter FRAME_HEADER_LEN = 512, - parameter BLOCK_NUM = 28, - parameter PHASE1_LEN = 2112, // (8 cp + 256 sym)* 8 ( total 2048 valid sym) - parameter PREFIX_LEN = 8, - parameter CHU_SEQ_LEN = 128, + parameter BLOCK_NUM = 42, + parameter PHASE1_LEN = 2880, // (32 cp + 256 sym)* 10 ( total 2880 valid sym) + parameter PREFIX_LEN = 32, + parameter CHU_SEQ_LEN = 256, parameter GAP_LEN = 160 ) ( // general @@ -65,10 +65,12 @@ module Transmitter #( reg [ 3:0] interp; reg [ 3:0] cnt_interp; + reg [13:0] agc_addr; + wire [ 1:0] agc_data; reg [ 8:0] mseqs_addr; reg [ 8:0] mseqs_addr_d1; reg [ 8:0] mseqs_addr_d2; - reg [ 6:0] chu_seq_addr; + reg [ 7:0] chu_seq_addr = 0; wire [31:0] chu_seq; wire mseqs; reg [31:0] bb_wave_out_i; // shape filter result @@ -86,7 +88,7 @@ module Transmitter #( reg [ 3:0] rtz; // return to zero reg [12:0] addr_tx_test = 'd0; - wire [7:0] data_tx_test; + wire [ 7:0] data_tx_test; // ******** Assingment ******** @@ -328,7 +330,11 @@ module Transmitter #( // truncation always @(*) begin - if (cs == S_SEND_FRAME_HEADER) begin + if (cs == S_SEND_AGC) begin + m_fir_tdata_i = agc_data[0] ? 16'h8001 : 16'h7FFF; + m_fir_tdata_q = agc_data[1] ? 16'h8001 : 16'h7FFF; + end + else if (cs == S_SEND_FRAME_HEADER) begin m_fir_tdata_i = mseqs ? 16'h8001 : 16'h7FFF; m_fir_tdata_q = mseqs ? 16'h8001 : 16'h7FFF; end @@ -336,7 +342,7 @@ module Transmitter #( m_fir_tdata_i = tx_data_src_tdata[15-:16]; m_fir_tdata_q = tx_data_src_tdata[31-:16]; end - else if (cs == S_SEND_CHU_POS || cs == S_SEND_AGC) begin + else if (cs == S_SEND_CHU_POS) begin m_fir_tdata_i = chu_seq[15-:16]; m_fir_tdata_q = chu_seq[31-:16]; end @@ -417,11 +423,23 @@ module Transmitter #( end end + // chu seq addr control + always @(posedge clk) begin + if (cs == S_IDLE) begin + agc_addr <= 0; + end + else if (cs == S_SEND_AGC) begin + if (fir_tvalid_in == 1'b1) begin + agc_addr <= agc_addr + 1; + end + end + end + // chu seq addr control always @(posedge clk) begin if (ns != cs) begin // chu_seq_addr <= 7'h7F - 7'h7; // 8 cp - chu_seq_addr <= CHU_SEQ_LEN - PREFIX_LEN; // 8 cp + chu_seq_addr <= CHU_SEQ_LEN - PREFIX_LEN; // 32 cp end else if (cs == S_SEND_CHU_POS || cs == S_SEND_AGC || cs == S_SEND_CHU_NEG) begin if (fir_tvalid_in == 1'b1) begin @@ -456,6 +474,12 @@ module Transmitter #( // ******** Inst ******** + bram_agc_header u_bram_agc_header ( + .clka (clk), // input wire clka + .addra(agc_addr), // input wire [13 : 0] addra + .douta(agc_data) // output wire [1 : 0] douta + ); + bram_m_seqs_512 u_bram_m_seqs_512 ( .clka (clk), .addra(mseqs_addr), @@ -465,7 +489,7 @@ module Transmitter #( bram_chu_seq u_bram_chu_seq ( .clka (clk), // input wire clka - .addra(chu_seq_addr), // input wire [6 : 0] addra + .addra(chu_seq_addr), // input wire [7 : 0] addra .douta(chu_seq) // output wire [31 : 0] douta ); diff --git a/hdl/add_prefix.v b/hdl/add_prefix.v index 47f473f..265b8b4 100644 --- a/hdl/add_prefix.v +++ b/hdl/add_prefix.v @@ -4,7 +4,7 @@ module add_prefix #( //! if the WIDTH or DATA_LEN parameter is changed, make sure the shift IP inside is also changed parameter WIDTH = 2, parameter DATA_LEN = 256, - parameter PREFIX_LEN = 8 + parameter PREFIX_LEN = 32 ) ( input clk, input start, diff --git a/hdl/enc_control.v b/hdl/enc_control.v index 5a64103..28cf027 100644 --- a/hdl/enc_control.v +++ b/hdl/enc_control.v @@ -134,7 +134,7 @@ module enc_control #( // and the width convert fifo is empty // and the finally stage fifo is almost empty // TODO:check the conditions, done 2024年5月27日 - if (s_axis_fifo_tvalid && data_src_count != 0 && fifo_enc_out_prog_empty && ~data_add_prefix_in_ready && ~data_add_prefix_out_valid) begin + if (s_axis_fifo_tvalid && data_src_count >= 32 && fifo_enc_out_prog_empty && ~data_add_prefix_in_ready && ~data_add_prefix_out_valid) begin ns = S_START; end else begin @@ -297,13 +297,13 @@ module enc_control #( add_prefix #( .WIDTH (2), // ! if this parameter is changed, make sure the shift IP inside is also changed - .DATA_LEN (256), - .PREFIX_LEN(8) + .DATA_LEN (256), //! if the WIDTH or DATA_LEN parameter is changed, make sure the shift IP inside is also changed + .PREFIX_LEN(32) ) u_add_prefix ( .clk (clk), .start (add_prefix_start), .ready (add_prefix_in_ready), - .data_in (data_add_prefix_in), + .data_in ({data_add_prefix_in[0], data_add_prefix_in[1]}), // NOTE : reverse to adjust to IQmerge module .data_in_ready (data_add_prefix_in_ready), .data_out (data_add_prefix_out), .data_out_valid(data_add_prefix_out_valid) diff --git a/sim/tb_sys_tx_rx_e_d.v b/sim/tb_sys_tx_rx_e_d.v new file mode 100644 index 0000000..9b9c11d --- /dev/null +++ b/sim/tb_sys_tx_rx_e_d.v @@ -0,0 +1,215 @@ +`timescale 1ns / 100ps +module tb_sys_tx_rx_e_d (); + + reg ad9361_rx_clk = 0; // 50MHz 20ns + reg clk_crystal = 0; // 40MHz 25ns + + always #(10) ad9361_rx_clk = ~ad9361_rx_clk; + always #(12.5) clk_crystal = ~clk_crystal; + + // ******** Wire & Reg ******** + + // power on clock domain + wire clk_poweron; + (*max_fanout = 256 *) + wire rst_sys; + wire poweron_locked; + + // ad9361 clock domain + wire locked; + wire clk_1x; + wire clk_2x; + wire clk_4x; + + // enc signal + wire enc_fifo_rd_en; + wire [31:0] enc_fifo_dout_map; + wire enc_fifo_empty; + + // tx bus + wire clk_tx_data_src; + reg [31:0] tx_data_src_count; + reg [31:0] tx_data_src_tdata; + wire tx_data_src_tready; + reg tx_data_src_tvalid; + // tx signal + wire tx_test_flag; + + // baseband signal + wire [11:0] ad9361_rx_data_i; + wire [11:0] ad9361_rx_data_q; + wire ad9361_rx_frame_i; + wire ad9361_rx_frame_q; + wire [11:0] ad9361_tx_data_i; + wire [11:0] ad9361_tx_data_q; + wire [ 2:0] speed_mode; + + // phy control signal + wire phy_rst_vio; + wire phy_rst_ps; + wire phy_rst; + wire phy_tx_test_flag_vio; + wire phy_tx_test_flag; + + + // ***** simulation ***** + reg [ 3:0] cnt_delay = 0; + reg [31:0] idx = 0; + reg send_start = 0; + reg [31:0] mem [0:31]; // 1024 bit + initial begin + $readmemh("C:/Users/ZoroGH/dev/vivadoPrj/MM7020/source/sim/sim_data/enc_src.txt", mem); + end + always @(posedge clk_1x) send_start <= (cnt_delay >= 4'hA) && (cnt_delay <= 4'hE); + + // ******** Assingment ******** + assign ad9361_tx_clk = clk_1x; + assign rst_sys = ~poweron_locked; + // ******** Logic Block ******** + + // ************************ ************************ + // ************************ simulation ************************ + // ************************ ************************ + + + + + always @(posedge clk_poweron) begin + if (rst_sys) begin + cnt_delay <= 0; + end + else if (cnt_delay < 4'hF) begin + cnt_delay <= cnt_delay + 1; + end + end + + always @(posedge clk_poweron) begin + if (rst_sys) begin + idx <= 0; + tx_data_src_tvalid <= 0; + tx_data_src_tdata <= 0; + tx_data_src_count <= 32; + end + else if (cnt_delay == 4'hF) begin + tx_data_src_tvalid <= 1; + tx_data_src_tdata <= mem[idx]; + if (tx_data_src_tready) begin + if (idx < 31) begin + idx <= idx + 1; + tx_data_src_count <= tx_data_src_count - 1; + end + else begin + idx <= 0; + tx_data_src_count <= 32; + end + end + + end + end + + + // ************************************************************ + // ************************ simulation ************************ + // ************************************************************ + + + // ******** Inst ******** + + clk_wiz_poweron u_clk_wiz_poweron ( + // Clock out ports + .clk_poweron(clk_poweron), // output clk_poweron + // Status and control signals + .locked (poweron_locked), // output locked + // Clock in ports + .clk_crystal(clk_crystal) // input clk_crystal + ); + + // clock domain - ad9361 rx & tx + clk_wiz_baseband u_clk_wiz_baseband ( + // Clock out ports + .clk_1x (clk_1x), // output clk_1x + .clk_2x (clk_2x), // output clk_2x + .clk_4x (clk_4x), // output clk_4x + // Status and control signals + .locked (locked), // output locked + // Clock in ports + .clk_src(ad9361_rx_clk) // input clk_src + ); + + // ************************************************************ + // *************************** TX ***************************** + // ************************************************************ + + + enc_control u_enc_control ( + .clk (clk_poweron), + .rst (rst_sys), + .s_axis_fifo_tvalid (tx_data_src_tvalid), + .s_axis_fifo_tready (tx_data_src_tready), + .s_axis_fifo_tdata (tx_data_src_tdata), + .data_src_count (tx_data_src_count), + .fifo_enc_out_rd_clk (clk_1x), + .fifo_enc_out_rd_en (enc_fifo_rd_en), + .fifo_enc_out_dout_map(enc_fifo_dout_map), + .fifo_enc_out_empty (enc_fifo_empty) + ); + + Transmitter #( + .AGC_HEADER_LEN(2500) + ) u_Transmitter ( + .clk (clk_1x), + .rst (rst_sys), + .speed_mode (2), + .send_data_ready (send_data_ready), + .send_start (send_start), + .send_over (send_over), + .clk_data_src (clk_data_src), + .tx_data_src_tdata (enc_fifo_dout_map), + .tx_data_src_tready(enc_fifo_rd_en), + .tx_data_src_tvalid(~enc_fifo_empty), + .hopping_freq (), + .ad9361_tx_data_i (ad9361_tx_data_i), + .ad9361_tx_data_q (ad9361_tx_data_q), + .test (0), + .hop_wait (100) + ); + + + // ************************************************************ + // *************************** RX ***************************** + // ************************************************************ + + + RecvTop u_RecvTop ( + .clk (clk_1x), + .clk_2x (clk_2x), + .clk_4x (clk_4x), + .rst (rst_sys), + .rst2 (rst_sys), + .dini (ad9361_tx_data_i), + .dinq (ad9361_tx_data_q), + .ad9361_ctrl_in (), + .vio_tsync_inter16(1), + .EQUenable_vio (1), + .Zerozone_vio (8'd29), + .vio_stopbit (7'd60), + .flag_stop (flag_stop), + .addr_stop (addr_stop), + .recvNetData (recvNetData), + .recvNetDataNd (recvNetDataNd) + ); + + + + + + + + + + + + + + +endmodule