Livt packages
Livt.Signal
Version 0.1.1
Q1.15 sample streams, filters, windows, rate conversion, FFTs, oscillators, and mixers for Livt.
Published files (80)
src/transform/SequentialFftQ15Primitive.vhd
-- Generated by tools/generate_fft_primitive.py. Do not edit manually.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use work.livt_lang_icontext_package.all;
use work.livt_lang_package.all;
entity livt_signal_transform_sequentialfftq15primitive is
port (
ctor_lvt_context_in : in t_icontext_in;
ctor_sampleshape : in std_logic_vector;
ctor_stageshape : in std_logic_vector;
ctor_stageshiftmask : in signed(31 downto 0);
ctor_inverse : in boolean;
ctor_inputbitreversed : in boolean;
ctor_outputbitreversed : in boolean;
ctor_inputvalid : in boolean;
ctor_inputready : out boolean;
ctor_inputreal : in std_logic_vector(15 downto 0);
ctor_inputimag : in std_logic_vector(15 downto 0);
ctor_inputfirst : in boolean;
ctor_inputlast : in boolean;
ctor_outputvalid : out boolean;
ctor_outputready : in boolean;
ctor_outputreal : out std_logic_vector(15 downto 0);
ctor_outputimag : out std_logic_vector(15 downto 0);
ctor_outputfirst : out boolean;
ctor_outputlast : out boolean;
ctor_framelengtherror : out boolean
);
end;
architecture rtl of livt_signal_transform_sequentialfftq15primitive is
constant SAMPLES : positive := ctor_sampleshape'length;
constant STAGES : positive := ctor_stageshape'length;
constant MASTER_SAMPLES : positive := 4096;
subtype complex_word_t is std_logic_vector(31 downto 0);
subtype q15_t is signed(15 downto 0);
subtype product_t is signed(31 downto 0);
subtype complex_product_t is signed(32 downto 0);
subtype butterfly_t is signed(33 downto 0);
type sample_memory_t is array (0 to SAMPLES - 1) of complex_word_t;
type phase_t is (load_frame, compute_read, compute_write,
emit_read, emit_hold);
function supported_size(value : positive) return boolean is
begin
return value = 8 or value = 16 or value = 32 or value = 64 or
value = 128 or value = 256 or value = 512 or value = 1024 or
value = 2048 or value = 4096;
end;
function reverse_bits(value : natural; width : positive) return natural is
variable remaining : natural := value;
variable result : natural := 0;
begin
for bit_index in 0 to width - 1 loop
result := result * 2 + remaining mod 2;
remaining := remaining / 2;
end loop;
return result;
end;
function pack_complex(real_part, imag_part : q15_t)
return complex_word_t is
begin
return std_logic_vector(real_part) & std_logic_vector(imag_part);
end;
function quantize_q15(value : butterfly_t; stage_shift : natural)
return q15_t is
constant TOTAL_SHIFT : natural := 15 + stage_shift;
variable extended : signed(34 downto 0);
variable magnitude, rounded : unsigned(34 downto 0);
variable sticky : boolean := false;
variable raw : integer;
begin
extended := resize(value, extended'length);
if extended(extended'high) = '1' then
magnitude := unsigned(-extended);
else
magnitude := unsigned(extended);
end if;
rounded := shift_right(magnitude, TOTAL_SHIFT);
if magnitude(TOTAL_SHIFT - 1) = '1' then
for bit_index in 0 to TOTAL_SHIFT - 2 loop
if magnitude(bit_index) = '1' then sticky := true; end if;
end loop;
if sticky or rounded(0) = '1' then rounded := rounded + 1; end if;
end if;
if extended(extended'high) = '1' then
if rounded >= resize(to_unsigned(32768, 16), rounded'length) then
return to_signed(-32768, 16);
end if;
raw := to_integer(rounded(15 downto 0));
return to_signed(-raw, 16);
end if;
if rounded > resize(to_unsigned(32767, 15), rounded'length) then
return to_signed(32767, 16);
end if;
return signed(rounded(15 downto 0));
end;
function twiddle(master_index : natural; inverse : boolean)
return complex_word_t is
variable real_part, imag_part : integer;
begin
case master_index is
when 0 => real_part := 32767; imag_part := 0;
when 1 => real_part := 32767; imag_part := -50;
when 2 => real_part := 32767; imag_part := -101;
when 3 => real_part := 32767; imag_part := -151;
when 4 => real_part := 32767; imag_part := -201;
when 5 => real_part := 32767; imag_part := -251;
when 6 => real_part := 32767; imag_part := -302;
when 7 => real_part := 32766; imag_part := -352;
when 8 => real_part := 32766; imag_part := -402;
when 9 => real_part := 32765; imag_part := -452;
when 10 => real_part := 32764; imag_part := -503;
when 11 => real_part := 32763; imag_part := -553;
when 12 => real_part := 32762; imag_part := -603;
when 13 => real_part := 32761; imag_part := -653;
when 14 => real_part := 32760; imag_part := -704;
when 15 => real_part := 32759; imag_part := -754;
when 16 => real_part := 32758; imag_part := -804;
when 17 => real_part := 32757; imag_part := -854;
when 18 => real_part := 32756; imag_part := -905;
when 19 => real_part := 32754; imag_part := -955;
when 20 => real_part := 32753; imag_part := -1005;
when 21 => real_part := 32751; imag_part := -1055;
when 22 => real_part := 32749; imag_part := -1106;
when 23 => real_part := 32748; imag_part := -1156;
when 24 => real_part := 32746; imag_part := -1206;
when 25 => real_part := 32744; imag_part := -1256;
when 26 => real_part := 32742; imag_part := -1307;
when 27 => real_part := 32740; imag_part := -1357;
when 28 => real_part := 32738; imag_part := -1407;
when 29 => real_part := 32736; imag_part := -1457;
when 30 => real_part := 32733; imag_part := -1507;
when 31 => real_part := 32731; imag_part := -1558;
when 32 => real_part := 32729; imag_part := -1608;
when 33 => real_part := 32726; imag_part := -1658;
when 34 => real_part := 32723; imag_part := -1708;
when 35 => real_part := 32721; imag_part := -1758;
when 36 => real_part := 32718; imag_part := -1809;
when 37 => real_part := 32715; imag_part := -1859;
when 38 => real_part := 32712; imag_part := -1909;
when 39 => real_part := 32709; imag_part := -1959;
when 40 => real_part := 32706; imag_part := -2009;
when 41 => real_part := 32703; imag_part := -2060;
when 42 => real_part := 32700; imag_part := -2110;
when 43 => real_part := 32697; imag_part := -2160;
when 44 => real_part := 32693; imag_part := -2210;
when 45 => real_part := 32690; imag_part := -2260;
when 46 => real_part := 32686; imag_part := -2310;
when 47 => real_part := 32683; imag_part := -2360;
when 48 => real_part := 32679; imag_part := -2411;
when 49 => real_part := 32675; imag_part := -2461;
when 50 => real_part := 32672; imag_part := -2511;
when 51 => real_part := 32668; imag_part := -2561;
when 52 => real_part := 32664; imag_part := -2611;
when 53 => real_part := 32660; imag_part := -2661;
when 54 => real_part := 32656; imag_part := -2711;
when 55 => real_part := 32651; imag_part := -2761;
when 56 => real_part := 32647; imag_part := -2811;
when 57 => real_part := 32643; imag_part := -2861;
when 58 => real_part := 32638; imag_part := -2912;
when 59 => real_part := 32634; imag_part := -2962;
when 60 => real_part := 32629; imag_part := -3012;
when 61 => real_part := 32625; imag_part := -3062;
when 62 => real_part := 32620; imag_part := -3112;
when 63 => real_part := 32615; imag_part := -3162;
when 64 => real_part := 32610; imag_part := -3212;
when 65 => real_part := 32605; imag_part := -3262;
when 66 => real_part := 32600; imag_part := -3312;
when 67 => real_part := 32595; imag_part := -3362;
when 68 => real_part := 32590; imag_part := -3412;
when 69 => real_part := 32585; imag_part := -3462;
when 70 => real_part := 32579; imag_part := -3512;
when 71 => real_part := 32574; imag_part := -3562;
when 72 => real_part := 32568; imag_part := -3612;
when 73 => real_part := 32563; imag_part := -3662;
when 74 => real_part := 32557; imag_part := -3712;
when 75 => real_part := 32551; imag_part := -3762;
when 76 => real_part := 32546; imag_part := -3812;
when 77 => real_part := 32540; imag_part := -3861;
when 78 => real_part := 32534; imag_part := -3911;
when 79 => real_part := 32528; imag_part := -3961;
when 80 => real_part := 32522; imag_part := -4011;
when 81 => real_part := 32515; imag_part := -4061;
when 82 => real_part := 32509; imag_part := -4111;
when 83 => real_part := 32503; imag_part := -4161;
when 84 => real_part := 32496; imag_part := -4211;
when 85 => real_part := 32490; imag_part := -4260;
when 86 => real_part := 32483; imag_part := -4310;
when 87 => real_part := 32477; imag_part := -4360;
when 88 => real_part := 32470; imag_part := -4410;
when 89 => real_part := 32463; imag_part := -4460;
when 90 => real_part := 32456; imag_part := -4510;
when 91 => real_part := 32449; imag_part := -4559;
when 92 => real_part := 32442; imag_part := -4609;
when 93 => real_part := 32435; imag_part := -4659;
when 94 => real_part := 32428; imag_part := -4709;
when 95 => real_part := 32421; imag_part := -4758;
when 96 => real_part := 32413; imag_part := -4808;
when 97 => real_part := 32406; imag_part := -4858;
when 98 => real_part := 32398; imag_part := -4907;
when 99 => real_part := 32391; imag_part := -4957;
when 100 => real_part := 32383; imag_part := -5007;
when 101 => real_part := 32376; imag_part := -5057;
when 102 => real_part := 32368; imag_part := -5106;
when 103 => real_part := 32360; imag_part := -5156;
when 104 => real_part := 32352; imag_part := -5205;
when 105 => real_part := 32344; imag_part := -5255;
when 106 => real_part := 32336; imag_part := -5305;
when 107 => real_part := 32328; imag_part := -5354;
when 108 => real_part := 32319; imag_part := -5404;
when 109 => real_part := 32311; imag_part := -5453;
when 110 => real_part := 32303; imag_part := -5503;
when 111 => real_part := 32294; imag_part := -5553;
when 112 => real_part := 32286; imag_part := -5602;
when 113 => real_part := 32277; imag_part := -5652;
when 114 => real_part := 32268; imag_part := -5701;
when 115 => real_part := 32259; imag_part := -5751;
when 116 => real_part := 32251; imag_part := -5800;
when 117 => real_part := 32242; imag_part := -5850;
when 118 => real_part := 32233; imag_part := -5899;
when 119 => real_part := 32224; imag_part := -5948;
when 120 => real_part := 32214; imag_part := -5998;
when 121 => real_part := 32205; imag_part := -6047;
when 122 => real_part := 32196; imag_part := -6097;
when 123 => real_part := 32186; imag_part := -6146;
when 124 => real_part := 32177; imag_part := -6195;
when 125 => real_part := 32167; imag_part := -6245;
when 126 => real_part := 32158; imag_part := -6294;
when 127 => real_part := 32148; imag_part := -6343;
when 128 => real_part := 32138; imag_part := -6393;
when 129 => real_part := 32129; imag_part := -6442;
when 130 => real_part := 32119; imag_part := -6491;
when 131 => real_part := 32109; imag_part := -6541;
when 132 => real_part := 32099; imag_part := -6590;
when 133 => real_part := 32088; imag_part := -6639;
when 134 => real_part := 32078; imag_part := -6688;
when 135 => real_part := 32068; imag_part := -6737;
when 136 => real_part := 32058; imag_part := -6787;
when 137 => real_part := 32047; imag_part := -6836;
when 138 => real_part := 32037; imag_part := -6885;
when 139 => real_part := 32026; imag_part := -6934;
when 140 => real_part := 32015; imag_part := -6983;
when 141 => real_part := 32005; imag_part := -7032;
when 142 => real_part := 31994; imag_part := -7081;
when 143 => real_part := 31983; imag_part := -7130;
when 144 => real_part := 31972; imag_part := -7180;
when 145 => real_part := 31961; imag_part := -7229;
when 146 => real_part := 31950; imag_part := -7278;
when 147 => real_part := 31938; imag_part := -7327;
when 148 => real_part := 31927; imag_part := -7376;
when 149 => real_part := 31916; imag_part := -7425;
when 150 => real_part := 31904; imag_part := -7473;
when 151 => real_part := 31893; imag_part := -7522;
when 152 => real_part := 31881; imag_part := -7571;
when 153 => real_part := 31870; imag_part := -7620;
when 154 => real_part := 31858; imag_part := -7669;
when 155 => real_part := 31846; imag_part := -7718;
when 156 => real_part := 31834; imag_part := -7767;
when 157 => real_part := 31822; imag_part := -7816;
when 158 => real_part := 31810; imag_part := -7864;
when 159 => real_part := 31798; imag_part := -7913;
when 160 => real_part := 31786; imag_part := -7962;
when 161 => real_part := 31774; imag_part := -8011;
when 162 => real_part := 31761; imag_part := -8059;
when 163 => real_part := 31749; imag_part := -8108;
when 164 => real_part := 31737; imag_part := -8157;
when 165 => real_part := 31724; imag_part := -8206;
when 166 => real_part := 31711; imag_part := -8254;
when 167 => real_part := 31699; imag_part := -8303;
when 168 => real_part := 31686; imag_part := -8351;
when 169 => real_part := 31673; imag_part := -8400;
when 170 => real_part := 31660; imag_part := -8449;
when 171 => real_part := 31647; imag_part := -8497;
when 172 => real_part := 31634; imag_part := -8546;
when 173 => real_part := 31621; imag_part := -8594;
when 174 => real_part := 31608; imag_part := -8643;
when 175 => real_part := 31594; imag_part := -8691;
when 176 => real_part := 31581; imag_part := -8740;
when 177 => real_part := 31568; imag_part := -8788;
when 178 => real_part := 31554; imag_part := -8836;
when 179 => real_part := 31540; imag_part := -8885;
when 180 => real_part := 31527; imag_part := -8933;
when 181 => real_part := 31513; imag_part := -8982;
when 182 => real_part := 31499; imag_part := -9030;
when 183 => real_part := 31485; imag_part := -9078;
when 184 => real_part := 31471; imag_part := -9127;
when 185 => real_part := 31457; imag_part := -9175;
when 186 => real_part := 31443; imag_part := -9223;
when 187 => real_part := 31429; imag_part := -9271;
when 188 => real_part := 31415; imag_part := -9319;
when 189 => real_part := 31400; imag_part := -9368;
when 190 => real_part := 31386; imag_part := -9416;
when 191 => real_part := 31372; imag_part := -9464;
when 192 => real_part := 31357; imag_part := -9512;
when 193 => real_part := 31342; imag_part := -9560;
when 194 => real_part := 31328; imag_part := -9608;
when 195 => real_part := 31313; imag_part := -9656;
when 196 => real_part := 31298; imag_part := -9704;
when 197 => real_part := 31283; imag_part := -9752;
when 198 => real_part := 31268; imag_part := -9800;
when 199 => real_part := 31253; imag_part := -9848;
when 200 => real_part := 31238; imag_part := -9896;
when 201 => real_part := 31223; imag_part := -9944;
when 202 => real_part := 31207; imag_part := -9992;
when 203 => real_part := 31192; imag_part := -10040;
when 204 => real_part := 31177; imag_part := -10088;
when 205 => real_part := 31161; imag_part := -10135;
when 206 => real_part := 31146; imag_part := -10183;
when 207 => real_part := 31130; imag_part := -10231;
when 208 => real_part := 31114; imag_part := -10279;
when 209 => real_part := 31098; imag_part := -10326;
when 210 => real_part := 31082; imag_part := -10374;
when 211 => real_part := 31067; imag_part := -10422;
when 212 => real_part := 31050; imag_part := -10469;
when 213 => real_part := 31034; imag_part := -10517;
when 214 => real_part := 31018; imag_part := -10565;
when 215 => real_part := 31002; imag_part := -10612;
when 216 => real_part := 30986; imag_part := -10660;
when 217 => real_part := 30969; imag_part := -10707;
when 218 => real_part := 30953; imag_part := -10755;
when 219 => real_part := 30936; imag_part := -10802;
when 220 => real_part := 30920; imag_part := -10850;
when 221 => real_part := 30903; imag_part := -10897;
when 222 => real_part := 30886; imag_part := -10945;
when 223 => real_part := 30869; imag_part := -10992;
when 224 => real_part := 30853; imag_part := -11039;
when 225 => real_part := 30836; imag_part := -11087;
when 226 => real_part := 30819; imag_part := -11134;
when 227 => real_part := 30801; imag_part := -11181;
when 228 => real_part := 30784; imag_part := -11228;
when 229 => real_part := 30767; imag_part := -11276;
when 230 => real_part := 30750; imag_part := -11323;
when 231 => real_part := 30732; imag_part := -11370;
when 232 => real_part := 30715; imag_part := -11417;
when 233 => real_part := 30697; imag_part := -11464;
when 234 => real_part := 30680; imag_part := -11511;
when 235 => real_part := 30662; imag_part := -11558;
when 236 => real_part := 30644; imag_part := -11605;
when 237 => real_part := 30626; imag_part := -11652;
when 238 => real_part := 30608; imag_part := -11699;
when 239 => real_part := 30590; imag_part := -11746;
when 240 => real_part := 30572; imag_part := -11793;
when 241 => real_part := 30554; imag_part := -11840;
when 242 => real_part := 30536; imag_part := -11887;
when 243 => real_part := 30518; imag_part := -11934;
when 244 => real_part := 30499; imag_part := -11980;
when 245 => real_part := 30481; imag_part := -12027;
when 246 => real_part := 30462; imag_part := -12074;
when 247 => real_part := 30444; imag_part := -12121;
when 248 => real_part := 30425; imag_part := -12167;
when 249 => real_part := 30407; imag_part := -12214;
when 250 => real_part := 30388; imag_part := -12261;
when 251 => real_part := 30369; imag_part := -12307;
when 252 => real_part := 30350; imag_part := -12354;
when 253 => real_part := 30331; imag_part := -12400;
when 254 => real_part := 30312; imag_part := -12447;
when 255 => real_part := 30293; imag_part := -12493;
when 256 => real_part := 30274; imag_part := -12540;
when 257 => real_part := 30254; imag_part := -12586;
when 258 => real_part := 30235; imag_part := -12633;
when 259 => real_part := 30216; imag_part := -12679;
when 260 => real_part := 30196; imag_part := -12725;
when 261 => real_part := 30177; imag_part := -12772;
when 262 => real_part := 30157; imag_part := -12818;
when 263 => real_part := 30137; imag_part := -12864;
when 264 => real_part := 30118; imag_part := -12910;
when 265 => real_part := 30098; imag_part := -12957;
when 266 => real_part := 30078; imag_part := -13003;
when 267 => real_part := 30058; imag_part := -13049;
when 268 => real_part := 30038; imag_part := -13095;
when 269 => real_part := 30018; imag_part := -13141;
when 270 => real_part := 29997; imag_part := -13187;
when 271 => real_part := 29977; imag_part := -13233;
when 272 => real_part := 29957; imag_part := -13279;
when 273 => real_part := 29936; imag_part := -13325;
when 274 => real_part := 29916; imag_part := -13371;
when 275 => real_part := 29895; imag_part := -13417;
when 276 => real_part := 29875; imag_part := -13463;
when 277 => real_part := 29854; imag_part := -13508;
when 278 => real_part := 29833; imag_part := -13554;
when 279 => real_part := 29813; imag_part := -13600;
when 280 => real_part := 29792; imag_part := -13646;
when 281 => real_part := 29771; imag_part := -13691;
when 282 => real_part := 29750; imag_part := -13737;
when 283 => real_part := 29729; imag_part := -13783;
when 284 => real_part := 29707; imag_part := -13828;
when 285 => real_part := 29686; imag_part := -13874;
when 286 => real_part := 29665; imag_part := -13919;
when 287 => real_part := 29643; imag_part := -13965;
when 288 => real_part := 29622; imag_part := -14010;
when 289 => real_part := 29600; imag_part := -14056;
when 290 => real_part := 29579; imag_part := -14101;
when 291 => real_part := 29557; imag_part := -14146;
when 292 => real_part := 29535; imag_part := -14192;
when 293 => real_part := 29514; imag_part := -14237;
when 294 => real_part := 29492; imag_part := -14282;
when 295 => real_part := 29470; imag_part := -14327;
when 296 => real_part := 29448; imag_part := -14373;
when 297 => real_part := 29426; imag_part := -14418;
when 298 => real_part := 29404; imag_part := -14463;
when 299 => real_part := 29381; imag_part := -14508;
when 300 => real_part := 29359; imag_part := -14553;
when 301 => real_part := 29337; imag_part := -14598;
when 302 => real_part := 29314; imag_part := -14643;
when 303 => real_part := 29292; imag_part := -14688;
when 304 => real_part := 29269; imag_part := -14733;
when 305 => real_part := 29247; imag_part := -14778;
when 306 => real_part := 29224; imag_part := -14823;
when 307 => real_part := 29201; imag_part := -14867;
when 308 => real_part := 29178; imag_part := -14912;
when 309 => real_part := 29155; imag_part := -14957;
when 310 => real_part := 29132; imag_part := -15002;
when 311 => real_part := 29109; imag_part := -15046;
when 312 => real_part := 29086; imag_part := -15091;
when 313 => real_part := 29063; imag_part := -15136;
when 314 => real_part := 29040; imag_part := -15180;
when 315 => real_part := 29016; imag_part := -15225;
when 316 => real_part := 28993; imag_part := -15269;
when 317 => real_part := 28970; imag_part := -15314;
when 318 => real_part := 28946; imag_part := -15358;
when 319 => real_part := 28922; imag_part := -15402;
when 320 => real_part := 28899; imag_part := -15447;
when 321 => real_part := 28875; imag_part := -15491;
when 322 => real_part := 28851; imag_part := -15535;
when 323 => real_part := 28827; imag_part := -15580;
when 324 => real_part := 28803; imag_part := -15624;
when 325 => real_part := 28779; imag_part := -15668;
when 326 => real_part := 28755; imag_part := -15712;
when 327 => real_part := 28731; imag_part := -15756;
when 328 => real_part := 28707; imag_part := -15800;
when 329 => real_part := 28683; imag_part := -15844;
when 330 => real_part := 28658; imag_part := -15888;
when 331 => real_part := 28634; imag_part := -15932;
when 332 => real_part := 28610; imag_part := -15976;
when 333 => real_part := 28585; imag_part := -16020;
when 334 => real_part := 28560; imag_part := -16064;
when 335 => real_part := 28536; imag_part := -16108;
when 336 => real_part := 28511; imag_part := -16151;
when 337 => real_part := 28486; imag_part := -16195;
when 338 => real_part := 28461; imag_part := -16239;
when 339 => real_part := 28436; imag_part := -16282;
when 340 => real_part := 28411; imag_part := -16326;
when 341 => real_part := 28386; imag_part := -16369;
when 342 => real_part := 28361; imag_part := -16413;
when 343 => real_part := 28336; imag_part := -16456;
when 344 => real_part := 28311; imag_part := -16500;
when 345 => real_part := 28285; imag_part := -16543;
when 346 => real_part := 28260; imag_part := -16587;
when 347 => real_part := 28234; imag_part := -16630;
when 348 => real_part := 28209; imag_part := -16673;
when 349 => real_part := 28183; imag_part := -16717;
when 350 => real_part := 28158; imag_part := -16760;
when 351 => real_part := 28132; imag_part := -16803;
when 352 => real_part := 28106; imag_part := -16846;
when 353 => real_part := 28080; imag_part := -16889;
when 354 => real_part := 28054; imag_part := -16932;
when 355 => real_part := 28028; imag_part := -16975;
when 356 => real_part := 28002; imag_part := -17018;
when 357 => real_part := 27976; imag_part := -17061;
when 358 => real_part := 27950; imag_part := -17104;
when 359 => real_part := 27924; imag_part := -17147;
when 360 => real_part := 27897; imag_part := -17190;
when 361 => real_part := 27871; imag_part := -17233;
when 362 => real_part := 27844; imag_part := -17275;
when 363 => real_part := 27818; imag_part := -17318;
when 364 => real_part := 27791; imag_part := -17361;
when 365 => real_part := 27765; imag_part := -17403;
when 366 => real_part := 27738; imag_part := -17446;
when 367 => real_part := 27711; imag_part := -17488;
when 368 => real_part := 27684; imag_part := -17531;
when 369 => real_part := 27657; imag_part := -17573;
when 370 => real_part := 27630; imag_part := -17616;
when 371 => real_part := 27603; imag_part := -17658;
when 372 => real_part := 27576; imag_part := -17700;
when 373 => real_part := 27549; imag_part := -17743;
when 374 => real_part := 27522; imag_part := -17785;
when 375 => real_part := 27494; imag_part := -17827;
when 376 => real_part := 27467; imag_part := -17869;
when 377 => real_part := 27440; imag_part := -17911;
when 378 => real_part := 27412; imag_part := -17953;
when 379 => real_part := 27384; imag_part := -17995;
when 380 => real_part := 27357; imag_part := -18037;
when 381 => real_part := 27329; imag_part := -18079;
when 382 => real_part := 27301; imag_part := -18121;
when 383 => real_part := 27273; imag_part := -18163;
when 384 => real_part := 27246; imag_part := -18205;
when 385 => real_part := 27218; imag_part := -18247;
when 386 => real_part := 27190; imag_part := -18288;
when 387 => real_part := 27162; imag_part := -18330;
when 388 => real_part := 27133; imag_part := -18372;
when 389 => real_part := 27105; imag_part := -18413;
when 390 => real_part := 27077; imag_part := -18455;
when 391 => real_part := 27049; imag_part := -18496;
when 392 => real_part := 27020; imag_part := -18538;
when 393 => real_part := 26992; imag_part := -18579;
when 394 => real_part := 26963; imag_part := -18621;
when 395 => real_part := 26935; imag_part := -18662;
when 396 => real_part := 26906; imag_part := -18703;
when 397 => real_part := 26877; imag_part := -18745;
when 398 => real_part := 26848; imag_part := -18786;
when 399 => real_part := 26820; imag_part := -18827;
when 400 => real_part := 26791; imag_part := -18868;
when 401 => real_part := 26762; imag_part := -18909;
when 402 => real_part := 26733; imag_part := -18950;
when 403 => real_part := 26704; imag_part := -18991;
when 404 => real_part := 26674; imag_part := -19032;
when 405 => real_part := 26645; imag_part := -19073;
when 406 => real_part := 26616; imag_part := -19114;
when 407 => real_part := 26586; imag_part := -19155;
when 408 => real_part := 26557; imag_part := -19195;
when 409 => real_part := 26528; imag_part := -19236;
when 410 => real_part := 26498; imag_part := -19277;
when 411 => real_part := 26468; imag_part := -19317;
when 412 => real_part := 26439; imag_part := -19358;
when 413 => real_part := 26409; imag_part := -19399;
when 414 => real_part := 26379; imag_part := -19439;
when 415 => real_part := 26349; imag_part := -19479;
when 416 => real_part := 26320; imag_part := -19520;
when 417 => real_part := 26290; imag_part := -19560;
when 418 => real_part := 26259; imag_part := -19601;
when 419 => real_part := 26229; imag_part := -19641;
when 420 => real_part := 26199; imag_part := -19681;
when 421 => real_part := 26169; imag_part := -19721;
when 422 => real_part := 26139; imag_part := -19761;
when 423 => real_part := 26108; imag_part := -19801;
when 424 => real_part := 26078; imag_part := -19841;
when 425 => real_part := 26048; imag_part := -19881;
when 426 => real_part := 26017; imag_part := -19921;
when 427 => real_part := 25986; imag_part := -19961;
when 428 => real_part := 25956; imag_part := -20001;
when 429 => real_part := 25925; imag_part := -20041;
when 430 => real_part := 25894; imag_part := -20081;
when 431 => real_part := 25863; imag_part := -20120;
when 432 => real_part := 25833; imag_part := -20160;
when 433 => real_part := 25802; imag_part := -20200;
when 434 => real_part := 25771; imag_part := -20239;
when 435 => real_part := 25739; imag_part := -20279;
when 436 => real_part := 25708; imag_part := -20318;
when 437 => real_part := 25677; imag_part := -20357;
when 438 => real_part := 25646; imag_part := -20397;
when 439 => real_part := 25615; imag_part := -20436;
when 440 => real_part := 25583; imag_part := -20475;
when 441 => real_part := 25552; imag_part := -20515;
when 442 => real_part := 25520; imag_part := -20554;
when 443 => real_part := 25489; imag_part := -20593;
when 444 => real_part := 25457; imag_part := -20632;
when 445 => real_part := 25425; imag_part := -20671;
when 446 => real_part := 25394; imag_part := -20710;
when 447 => real_part := 25362; imag_part := -20749;
when 448 => real_part := 25330; imag_part := -20788;
when 449 => real_part := 25298; imag_part := -20827;
when 450 => real_part := 25266; imag_part := -20865;
when 451 => real_part := 25234; imag_part := -20904;
when 452 => real_part := 25202; imag_part := -20943;
when 453 => real_part := 25170; imag_part := -20981;
when 454 => real_part := 25138; imag_part := -21020;
when 455 => real_part := 25105; imag_part := -21059;
when 456 => real_part := 25073; imag_part := -21097;
when 457 => real_part := 25041; imag_part := -21136;
when 458 => real_part := 25008; imag_part := -21174;
when 459 => real_part := 24976; imag_part := -21212;
when 460 => real_part := 24943; imag_part := -21251;
when 461 => real_part := 24910; imag_part := -21289;
when 462 => real_part := 24878; imag_part := -21327;
when 463 => real_part := 24845; imag_part := -21365;
when 464 => real_part := 24812; imag_part := -21403;
when 465 => real_part := 24779; imag_part := -21441;
when 466 => real_part := 24746; imag_part := -21479;
when 467 => real_part := 24713; imag_part := -21517;
when 468 => real_part := 24680; imag_part := -21555;
when 469 => real_part := 24647; imag_part := -21593;
when 470 => real_part := 24614; imag_part := -21631;
when 471 => real_part := 24581; imag_part := -21668;
when 472 => real_part := 24548; imag_part := -21706;
when 473 => real_part := 24514; imag_part := -21744;
when 474 => real_part := 24481; imag_part := -21781;
when 475 => real_part := 24448; imag_part := -21819;
when 476 => real_part := 24414; imag_part := -21856;
when 477 => real_part := 24380; imag_part := -21894;
when 478 => real_part := 24347; imag_part := -21931;
when 479 => real_part := 24313; imag_part := -21968;
when 480 => real_part := 24279; imag_part := -22006;
when 481 => real_part := 24246; imag_part := -22043;
when 482 => real_part := 24212; imag_part := -22080;
when 483 => real_part := 24178; imag_part := -22117;
when 484 => real_part := 24144; imag_part := -22154;
when 485 => real_part := 24110; imag_part := -22191;
when 486 => real_part := 24076; imag_part := -22228;
when 487 => real_part := 24042; imag_part := -22265;
when 488 => real_part := 24008; imag_part := -22302;
when 489 => real_part := 23973; imag_part := -22339;
when 490 => real_part := 23939; imag_part := -22375;
when 491 => real_part := 23905; imag_part := -22412;
when 492 => real_part := 23870; imag_part := -22449;
when 493 => real_part := 23836; imag_part := -22485;
when 494 => real_part := 23801; imag_part := -22522;
when 495 => real_part := 23767; imag_part := -22558;
when 496 => real_part := 23732; imag_part := -22595;
when 497 => real_part := 23697; imag_part := -22631;
when 498 => real_part := 23663; imag_part := -22668;
when 499 => real_part := 23628; imag_part := -22704;
when 500 => real_part := 23593; imag_part := -22740;
when 501 => real_part := 23558; imag_part := -22776;
when 502 => real_part := 23523; imag_part := -22812;
when 503 => real_part := 23488; imag_part := -22848;
when 504 => real_part := 23453; imag_part := -22884;
when 505 => real_part := 23418; imag_part := -22920;
when 506 => real_part := 23383; imag_part := -22956;
when 507 => real_part := 23348; imag_part := -22992;
when 508 => real_part := 23312; imag_part := -23028;
when 509 => real_part := 23277; imag_part := -23064;
when 510 => real_part := 23241; imag_part := -23099;
when 511 => real_part := 23206; imag_part := -23135;
when 512 => real_part := 23170; imag_part := -23170;
when 513 => real_part := 23135; imag_part := -23206;
when 514 => real_part := 23099; imag_part := -23241;
when 515 => real_part := 23064; imag_part := -23277;
when 516 => real_part := 23028; imag_part := -23312;
when 517 => real_part := 22992; imag_part := -23348;
when 518 => real_part := 22956; imag_part := -23383;
when 519 => real_part := 22920; imag_part := -23418;
when 520 => real_part := 22884; imag_part := -23453;
when 521 => real_part := 22848; imag_part := -23488;
when 522 => real_part := 22812; imag_part := -23523;
when 523 => real_part := 22776; imag_part := -23558;
when 524 => real_part := 22740; imag_part := -23593;
when 525 => real_part := 22704; imag_part := -23628;
when 526 => real_part := 22668; imag_part := -23663;
when 527 => real_part := 22631; imag_part := -23697;
when 528 => real_part := 22595; imag_part := -23732;
when 529 => real_part := 22558; imag_part := -23767;
when 530 => real_part := 22522; imag_part := -23801;
when 531 => real_part := 22485; imag_part := -23836;
when 532 => real_part := 22449; imag_part := -23870;
when 533 => real_part := 22412; imag_part := -23905;
when 534 => real_part := 22375; imag_part := -23939;
when 535 => real_part := 22339; imag_part := -23973;
when 536 => real_part := 22302; imag_part := -24008;
when 537 => real_part := 22265; imag_part := -24042;
when 538 => real_part := 22228; imag_part := -24076;
when 539 => real_part := 22191; imag_part := -24110;
when 540 => real_part := 22154; imag_part := -24144;
when 541 => real_part := 22117; imag_part := -24178;
when 542 => real_part := 22080; imag_part := -24212;
when 543 => real_part := 22043; imag_part := -24246;
when 544 => real_part := 22006; imag_part := -24279;
when 545 => real_part := 21968; imag_part := -24313;
when 546 => real_part := 21931; imag_part := -24347;
when 547 => real_part := 21894; imag_part := -24380;
when 548 => real_part := 21856; imag_part := -24414;
when 549 => real_part := 21819; imag_part := -24448;
when 550 => real_part := 21781; imag_part := -24481;
when 551 => real_part := 21744; imag_part := -24514;
when 552 => real_part := 21706; imag_part := -24548;
when 553 => real_part := 21668; imag_part := -24581;
when 554 => real_part := 21631; imag_part := -24614;
when 555 => real_part := 21593; imag_part := -24647;
when 556 => real_part := 21555; imag_part := -24680;
when 557 => real_part := 21517; imag_part := -24713;
when 558 => real_part := 21479; imag_part := -24746;
when 559 => real_part := 21441; imag_part := -24779;
when 560 => real_part := 21403; imag_part := -24812;
when 561 => real_part := 21365; imag_part := -24845;
when 562 => real_part := 21327; imag_part := -24878;
when 563 => real_part := 21289; imag_part := -24910;
when 564 => real_part := 21251; imag_part := -24943;
when 565 => real_part := 21212; imag_part := -24976;
when 566 => real_part := 21174; imag_part := -25008;
when 567 => real_part := 21136; imag_part := -25041;
when 568 => real_part := 21097; imag_part := -25073;
when 569 => real_part := 21059; imag_part := -25105;
when 570 => real_part := 21020; imag_part := -25138;
when 571 => real_part := 20981; imag_part := -25170;
when 572 => real_part := 20943; imag_part := -25202;
when 573 => real_part := 20904; imag_part := -25234;
when 574 => real_part := 20865; imag_part := -25266;
when 575 => real_part := 20827; imag_part := -25298;
when 576 => real_part := 20788; imag_part := -25330;
when 577 => real_part := 20749; imag_part := -25362;
when 578 => real_part := 20710; imag_part := -25394;
when 579 => real_part := 20671; imag_part := -25425;
when 580 => real_part := 20632; imag_part := -25457;
when 581 => real_part := 20593; imag_part := -25489;
when 582 => real_part := 20554; imag_part := -25520;
when 583 => real_part := 20515; imag_part := -25552;
when 584 => real_part := 20475; imag_part := -25583;
when 585 => real_part := 20436; imag_part := -25615;
when 586 => real_part := 20397; imag_part := -25646;
when 587 => real_part := 20357; imag_part := -25677;
when 588 => real_part := 20318; imag_part := -25708;
when 589 => real_part := 20279; imag_part := -25739;
when 590 => real_part := 20239; imag_part := -25771;
when 591 => real_part := 20200; imag_part := -25802;
when 592 => real_part := 20160; imag_part := -25833;
when 593 => real_part := 20120; imag_part := -25863;
when 594 => real_part := 20081; imag_part := -25894;
when 595 => real_part := 20041; imag_part := -25925;
when 596 => real_part := 20001; imag_part := -25956;
when 597 => real_part := 19961; imag_part := -25986;
when 598 => real_part := 19921; imag_part := -26017;
when 599 => real_part := 19881; imag_part := -26048;
when 600 => real_part := 19841; imag_part := -26078;
when 601 => real_part := 19801; imag_part := -26108;
when 602 => real_part := 19761; imag_part := -26139;
when 603 => real_part := 19721; imag_part := -26169;
when 604 => real_part := 19681; imag_part := -26199;
when 605 => real_part := 19641; imag_part := -26229;
when 606 => real_part := 19601; imag_part := -26259;
when 607 => real_part := 19560; imag_part := -26290;
when 608 => real_part := 19520; imag_part := -26320;
when 609 => real_part := 19479; imag_part := -26349;
when 610 => real_part := 19439; imag_part := -26379;
when 611 => real_part := 19399; imag_part := -26409;
when 612 => real_part := 19358; imag_part := -26439;
when 613 => real_part := 19317; imag_part := -26468;
when 614 => real_part := 19277; imag_part := -26498;
when 615 => real_part := 19236; imag_part := -26528;
when 616 => real_part := 19195; imag_part := -26557;
when 617 => real_part := 19155; imag_part := -26586;
when 618 => real_part := 19114; imag_part := -26616;
when 619 => real_part := 19073; imag_part := -26645;
when 620 => real_part := 19032; imag_part := -26674;
when 621 => real_part := 18991; imag_part := -26704;
when 622 => real_part := 18950; imag_part := -26733;
when 623 => real_part := 18909; imag_part := -26762;
when 624 => real_part := 18868; imag_part := -26791;
when 625 => real_part := 18827; imag_part := -26820;
when 626 => real_part := 18786; imag_part := -26848;
when 627 => real_part := 18745; imag_part := -26877;
when 628 => real_part := 18703; imag_part := -26906;
when 629 => real_part := 18662; imag_part := -26935;
when 630 => real_part := 18621; imag_part := -26963;
when 631 => real_part := 18579; imag_part := -26992;
when 632 => real_part := 18538; imag_part := -27020;
when 633 => real_part := 18496; imag_part := -27049;
when 634 => real_part := 18455; imag_part := -27077;
when 635 => real_part := 18413; imag_part := -27105;
when 636 => real_part := 18372; imag_part := -27133;
when 637 => real_part := 18330; imag_part := -27162;
when 638 => real_part := 18288; imag_part := -27190;
when 639 => real_part := 18247; imag_part := -27218;
when 640 => real_part := 18205; imag_part := -27246;
when 641 => real_part := 18163; imag_part := -27273;
when 642 => real_part := 18121; imag_part := -27301;
when 643 => real_part := 18079; imag_part := -27329;
when 644 => real_part := 18037; imag_part := -27357;
when 645 => real_part := 17995; imag_part := -27384;
when 646 => real_part := 17953; imag_part := -27412;
when 647 => real_part := 17911; imag_part := -27440;
when 648 => real_part := 17869; imag_part := -27467;
when 649 => real_part := 17827; imag_part := -27494;
when 650 => real_part := 17785; imag_part := -27522;
when 651 => real_part := 17743; imag_part := -27549;
when 652 => real_part := 17700; imag_part := -27576;
when 653 => real_part := 17658; imag_part := -27603;
when 654 => real_part := 17616; imag_part := -27630;
when 655 => real_part := 17573; imag_part := -27657;
when 656 => real_part := 17531; imag_part := -27684;
when 657 => real_part := 17488; imag_part := -27711;
when 658 => real_part := 17446; imag_part := -27738;
when 659 => real_part := 17403; imag_part := -27765;
when 660 => real_part := 17361; imag_part := -27791;
when 661 => real_part := 17318; imag_part := -27818;
when 662 => real_part := 17275; imag_part := -27844;
when 663 => real_part := 17233; imag_part := -27871;
when 664 => real_part := 17190; imag_part := -27897;
when 665 => real_part := 17147; imag_part := -27924;
when 666 => real_part := 17104; imag_part := -27950;
when 667 => real_part := 17061; imag_part := -27976;
when 668 => real_part := 17018; imag_part := -28002;
when 669 => real_part := 16975; imag_part := -28028;
when 670 => real_part := 16932; imag_part := -28054;
when 671 => real_part := 16889; imag_part := -28080;
when 672 => real_part := 16846; imag_part := -28106;
when 673 => real_part := 16803; imag_part := -28132;
when 674 => real_part := 16760; imag_part := -28158;
when 675 => real_part := 16717; imag_part := -28183;
when 676 => real_part := 16673; imag_part := -28209;
when 677 => real_part := 16630; imag_part := -28234;
when 678 => real_part := 16587; imag_part := -28260;
when 679 => real_part := 16543; imag_part := -28285;
when 680 => real_part := 16500; imag_part := -28311;
when 681 => real_part := 16456; imag_part := -28336;
when 682 => real_part := 16413; imag_part := -28361;
when 683 => real_part := 16369; imag_part := -28386;
when 684 => real_part := 16326; imag_part := -28411;
when 685 => real_part := 16282; imag_part := -28436;
when 686 => real_part := 16239; imag_part := -28461;
when 687 => real_part := 16195; imag_part := -28486;
when 688 => real_part := 16151; imag_part := -28511;
when 689 => real_part := 16108; imag_part := -28536;
when 690 => real_part := 16064; imag_part := -28560;
when 691 => real_part := 16020; imag_part := -28585;
when 692 => real_part := 15976; imag_part := -28610;
when 693 => real_part := 15932; imag_part := -28634;
when 694 => real_part := 15888; imag_part := -28658;
when 695 => real_part := 15844; imag_part := -28683;
when 696 => real_part := 15800; imag_part := -28707;
when 697 => real_part := 15756; imag_part := -28731;
when 698 => real_part := 15712; imag_part := -28755;
when 699 => real_part := 15668; imag_part := -28779;
when 700 => real_part := 15624; imag_part := -28803;
when 701 => real_part := 15580; imag_part := -28827;
when 702 => real_part := 15535; imag_part := -28851;
when 703 => real_part := 15491; imag_part := -28875;
when 704 => real_part := 15447; imag_part := -28899;
when 705 => real_part := 15402; imag_part := -28922;
when 706 => real_part := 15358; imag_part := -28946;
when 707 => real_part := 15314; imag_part := -28970;
when 708 => real_part := 15269; imag_part := -28993;
when 709 => real_part := 15225; imag_part := -29016;
when 710 => real_part := 15180; imag_part := -29040;
when 711 => real_part := 15136; imag_part := -29063;
when 712 => real_part := 15091; imag_part := -29086;
when 713 => real_part := 15046; imag_part := -29109;
when 714 => real_part := 15002; imag_part := -29132;
when 715 => real_part := 14957; imag_part := -29155;
when 716 => real_part := 14912; imag_part := -29178;
when 717 => real_part := 14867; imag_part := -29201;
when 718 => real_part := 14823; imag_part := -29224;
when 719 => real_part := 14778; imag_part := -29247;
when 720 => real_part := 14733; imag_part := -29269;
when 721 => real_part := 14688; imag_part := -29292;
when 722 => real_part := 14643; imag_part := -29314;
when 723 => real_part := 14598; imag_part := -29337;
when 724 => real_part := 14553; imag_part := -29359;
when 725 => real_part := 14508; imag_part := -29381;
when 726 => real_part := 14463; imag_part := -29404;
when 727 => real_part := 14418; imag_part := -29426;
when 728 => real_part := 14373; imag_part := -29448;
when 729 => real_part := 14327; imag_part := -29470;
when 730 => real_part := 14282; imag_part := -29492;
when 731 => real_part := 14237; imag_part := -29514;
when 732 => real_part := 14192; imag_part := -29535;
when 733 => real_part := 14146; imag_part := -29557;
when 734 => real_part := 14101; imag_part := -29579;
when 735 => real_part := 14056; imag_part := -29600;
when 736 => real_part := 14010; imag_part := -29622;
when 737 => real_part := 13965; imag_part := -29643;
when 738 => real_part := 13919; imag_part := -29665;
when 739 => real_part := 13874; imag_part := -29686;
when 740 => real_part := 13828; imag_part := -29707;
when 741 => real_part := 13783; imag_part := -29729;
when 742 => real_part := 13737; imag_part := -29750;
when 743 => real_part := 13691; imag_part := -29771;
when 744 => real_part := 13646; imag_part := -29792;
when 745 => real_part := 13600; imag_part := -29813;
when 746 => real_part := 13554; imag_part := -29833;
when 747 => real_part := 13508; imag_part := -29854;
when 748 => real_part := 13463; imag_part := -29875;
when 749 => real_part := 13417; imag_part := -29895;
when 750 => real_part := 13371; imag_part := -29916;
when 751 => real_part := 13325; imag_part := -29936;
when 752 => real_part := 13279; imag_part := -29957;
when 753 => real_part := 13233; imag_part := -29977;
when 754 => real_part := 13187; imag_part := -29997;
when 755 => real_part := 13141; imag_part := -30018;
when 756 => real_part := 13095; imag_part := -30038;
when 757 => real_part := 13049; imag_part := -30058;
when 758 => real_part := 13003; imag_part := -30078;
when 759 => real_part := 12957; imag_part := -30098;
when 760 => real_part := 12910; imag_part := -30118;
when 761 => real_part := 12864; imag_part := -30137;
when 762 => real_part := 12818; imag_part := -30157;
when 763 => real_part := 12772; imag_part := -30177;
when 764 => real_part := 12725; imag_part := -30196;
when 765 => real_part := 12679; imag_part := -30216;
when 766 => real_part := 12633; imag_part := -30235;
when 767 => real_part := 12586; imag_part := -30254;
when 768 => real_part := 12540; imag_part := -30274;
when 769 => real_part := 12493; imag_part := -30293;
when 770 => real_part := 12447; imag_part := -30312;
when 771 => real_part := 12400; imag_part := -30331;
when 772 => real_part := 12354; imag_part := -30350;
when 773 => real_part := 12307; imag_part := -30369;
when 774 => real_part := 12261; imag_part := -30388;
when 775 => real_part := 12214; imag_part := -30407;
when 776 => real_part := 12167; imag_part := -30425;
when 777 => real_part := 12121; imag_part := -30444;
when 778 => real_part := 12074; imag_part := -30462;
when 779 => real_part := 12027; imag_part := -30481;
when 780 => real_part := 11980; imag_part := -30499;
when 781 => real_part := 11934; imag_part := -30518;
when 782 => real_part := 11887; imag_part := -30536;
when 783 => real_part := 11840; imag_part := -30554;
when 784 => real_part := 11793; imag_part := -30572;
when 785 => real_part := 11746; imag_part := -30590;
when 786 => real_part := 11699; imag_part := -30608;
when 787 => real_part := 11652; imag_part := -30626;
when 788 => real_part := 11605; imag_part := -30644;
when 789 => real_part := 11558; imag_part := -30662;
when 790 => real_part := 11511; imag_part := -30680;
when 791 => real_part := 11464; imag_part := -30697;
when 792 => real_part := 11417; imag_part := -30715;
when 793 => real_part := 11370; imag_part := -30732;
when 794 => real_part := 11323; imag_part := -30750;
when 795 => real_part := 11276; imag_part := -30767;
when 796 => real_part := 11228; imag_part := -30784;
when 797 => real_part := 11181; imag_part := -30801;
when 798 => real_part := 11134; imag_part := -30819;
when 799 => real_part := 11087; imag_part := -30836;
when 800 => real_part := 11039; imag_part := -30853;
when 801 => real_part := 10992; imag_part := -30869;
when 802 => real_part := 10945; imag_part := -30886;
when 803 => real_part := 10897; imag_part := -30903;
when 804 => real_part := 10850; imag_part := -30920;
when 805 => real_part := 10802; imag_part := -30936;
when 806 => real_part := 10755; imag_part := -30953;
when 807 => real_part := 10707; imag_part := -30969;
when 808 => real_part := 10660; imag_part := -30986;
when 809 => real_part := 10612; imag_part := -31002;
when 810 => real_part := 10565; imag_part := -31018;
when 811 => real_part := 10517; imag_part := -31034;
when 812 => real_part := 10469; imag_part := -31050;
when 813 => real_part := 10422; imag_part := -31067;
when 814 => real_part := 10374; imag_part := -31082;
when 815 => real_part := 10326; imag_part := -31098;
when 816 => real_part := 10279; imag_part := -31114;
when 817 => real_part := 10231; imag_part := -31130;
when 818 => real_part := 10183; imag_part := -31146;
when 819 => real_part := 10135; imag_part := -31161;
when 820 => real_part := 10088; imag_part := -31177;
when 821 => real_part := 10040; imag_part := -31192;
when 822 => real_part := 9992; imag_part := -31207;
when 823 => real_part := 9944; imag_part := -31223;
when 824 => real_part := 9896; imag_part := -31238;
when 825 => real_part := 9848; imag_part := -31253;
when 826 => real_part := 9800; imag_part := -31268;
when 827 => real_part := 9752; imag_part := -31283;
when 828 => real_part := 9704; imag_part := -31298;
when 829 => real_part := 9656; imag_part := -31313;
when 830 => real_part := 9608; imag_part := -31328;
when 831 => real_part := 9560; imag_part := -31342;
when 832 => real_part := 9512; imag_part := -31357;
when 833 => real_part := 9464; imag_part := -31372;
when 834 => real_part := 9416; imag_part := -31386;
when 835 => real_part := 9368; imag_part := -31400;
when 836 => real_part := 9319; imag_part := -31415;
when 837 => real_part := 9271; imag_part := -31429;
when 838 => real_part := 9223; imag_part := -31443;
when 839 => real_part := 9175; imag_part := -31457;
when 840 => real_part := 9127; imag_part := -31471;
when 841 => real_part := 9078; imag_part := -31485;
when 842 => real_part := 9030; imag_part := -31499;
when 843 => real_part := 8982; imag_part := -31513;
when 844 => real_part := 8933; imag_part := -31527;
when 845 => real_part := 8885; imag_part := -31540;
when 846 => real_part := 8836; imag_part := -31554;
when 847 => real_part := 8788; imag_part := -31568;
when 848 => real_part := 8740; imag_part := -31581;
when 849 => real_part := 8691; imag_part := -31594;
when 850 => real_part := 8643; imag_part := -31608;
when 851 => real_part := 8594; imag_part := -31621;
when 852 => real_part := 8546; imag_part := -31634;
when 853 => real_part := 8497; imag_part := -31647;
when 854 => real_part := 8449; imag_part := -31660;
when 855 => real_part := 8400; imag_part := -31673;
when 856 => real_part := 8351; imag_part := -31686;
when 857 => real_part := 8303; imag_part := -31699;
when 858 => real_part := 8254; imag_part := -31711;
when 859 => real_part := 8206; imag_part := -31724;
when 860 => real_part := 8157; imag_part := -31737;
when 861 => real_part := 8108; imag_part := -31749;
when 862 => real_part := 8059; imag_part := -31761;
when 863 => real_part := 8011; imag_part := -31774;
when 864 => real_part := 7962; imag_part := -31786;
when 865 => real_part := 7913; imag_part := -31798;
when 866 => real_part := 7864; imag_part := -31810;
when 867 => real_part := 7816; imag_part := -31822;
when 868 => real_part := 7767; imag_part := -31834;
when 869 => real_part := 7718; imag_part := -31846;
when 870 => real_part := 7669; imag_part := -31858;
when 871 => real_part := 7620; imag_part := -31870;
when 872 => real_part := 7571; imag_part := -31881;
when 873 => real_part := 7522; imag_part := -31893;
when 874 => real_part := 7473; imag_part := -31904;
when 875 => real_part := 7425; imag_part := -31916;
when 876 => real_part := 7376; imag_part := -31927;
when 877 => real_part := 7327; imag_part := -31938;
when 878 => real_part := 7278; imag_part := -31950;
when 879 => real_part := 7229; imag_part := -31961;
when 880 => real_part := 7180; imag_part := -31972;
when 881 => real_part := 7130; imag_part := -31983;
when 882 => real_part := 7081; imag_part := -31994;
when 883 => real_part := 7032; imag_part := -32005;
when 884 => real_part := 6983; imag_part := -32015;
when 885 => real_part := 6934; imag_part := -32026;
when 886 => real_part := 6885; imag_part := -32037;
when 887 => real_part := 6836; imag_part := -32047;
when 888 => real_part := 6787; imag_part := -32058;
when 889 => real_part := 6737; imag_part := -32068;
when 890 => real_part := 6688; imag_part := -32078;
when 891 => real_part := 6639; imag_part := -32088;
when 892 => real_part := 6590; imag_part := -32099;
when 893 => real_part := 6541; imag_part := -32109;
when 894 => real_part := 6491; imag_part := -32119;
when 895 => real_part := 6442; imag_part := -32129;
when 896 => real_part := 6393; imag_part := -32138;
when 897 => real_part := 6343; imag_part := -32148;
when 898 => real_part := 6294; imag_part := -32158;
when 899 => real_part := 6245; imag_part := -32167;
when 900 => real_part := 6195; imag_part := -32177;
when 901 => real_part := 6146; imag_part := -32186;
when 902 => real_part := 6097; imag_part := -32196;
when 903 => real_part := 6047; imag_part := -32205;
when 904 => real_part := 5998; imag_part := -32214;
when 905 => real_part := 5948; imag_part := -32224;
when 906 => real_part := 5899; imag_part := -32233;
when 907 => real_part := 5850; imag_part := -32242;
when 908 => real_part := 5800; imag_part := -32251;
when 909 => real_part := 5751; imag_part := -32259;
when 910 => real_part := 5701; imag_part := -32268;
when 911 => real_part := 5652; imag_part := -32277;
when 912 => real_part := 5602; imag_part := -32286;
when 913 => real_part := 5553; imag_part := -32294;
when 914 => real_part := 5503; imag_part := -32303;
when 915 => real_part := 5453; imag_part := -32311;
when 916 => real_part := 5404; imag_part := -32319;
when 917 => real_part := 5354; imag_part := -32328;
when 918 => real_part := 5305; imag_part := -32336;
when 919 => real_part := 5255; imag_part := -32344;
when 920 => real_part := 5205; imag_part := -32352;
when 921 => real_part := 5156; imag_part := -32360;
when 922 => real_part := 5106; imag_part := -32368;
when 923 => real_part := 5057; imag_part := -32376;
when 924 => real_part := 5007; imag_part := -32383;
when 925 => real_part := 4957; imag_part := -32391;
when 926 => real_part := 4907; imag_part := -32398;
when 927 => real_part := 4858; imag_part := -32406;
when 928 => real_part := 4808; imag_part := -32413;
when 929 => real_part := 4758; imag_part := -32421;
when 930 => real_part := 4709; imag_part := -32428;
when 931 => real_part := 4659; imag_part := -32435;
when 932 => real_part := 4609; imag_part := -32442;
when 933 => real_part := 4559; imag_part := -32449;
when 934 => real_part := 4510; imag_part := -32456;
when 935 => real_part := 4460; imag_part := -32463;
when 936 => real_part := 4410; imag_part := -32470;
when 937 => real_part := 4360; imag_part := -32477;
when 938 => real_part := 4310; imag_part := -32483;
when 939 => real_part := 4260; imag_part := -32490;
when 940 => real_part := 4211; imag_part := -32496;
when 941 => real_part := 4161; imag_part := -32503;
when 942 => real_part := 4111; imag_part := -32509;
when 943 => real_part := 4061; imag_part := -32515;
when 944 => real_part := 4011; imag_part := -32522;
when 945 => real_part := 3961; imag_part := -32528;
when 946 => real_part := 3911; imag_part := -32534;
when 947 => real_part := 3861; imag_part := -32540;
when 948 => real_part := 3812; imag_part := -32546;
when 949 => real_part := 3762; imag_part := -32551;
when 950 => real_part := 3712; imag_part := -32557;
when 951 => real_part := 3662; imag_part := -32563;
when 952 => real_part := 3612; imag_part := -32568;
when 953 => real_part := 3562; imag_part := -32574;
when 954 => real_part := 3512; imag_part := -32579;
when 955 => real_part := 3462; imag_part := -32585;
when 956 => real_part := 3412; imag_part := -32590;
when 957 => real_part := 3362; imag_part := -32595;
when 958 => real_part := 3312; imag_part := -32600;
when 959 => real_part := 3262; imag_part := -32605;
when 960 => real_part := 3212; imag_part := -32610;
when 961 => real_part := 3162; imag_part := -32615;
when 962 => real_part := 3112; imag_part := -32620;
when 963 => real_part := 3062; imag_part := -32625;
when 964 => real_part := 3012; imag_part := -32629;
when 965 => real_part := 2962; imag_part := -32634;
when 966 => real_part := 2912; imag_part := -32638;
when 967 => real_part := 2861; imag_part := -32643;
when 968 => real_part := 2811; imag_part := -32647;
when 969 => real_part := 2761; imag_part := -32651;
when 970 => real_part := 2711; imag_part := -32656;
when 971 => real_part := 2661; imag_part := -32660;
when 972 => real_part := 2611; imag_part := -32664;
when 973 => real_part := 2561; imag_part := -32668;
when 974 => real_part := 2511; imag_part := -32672;
when 975 => real_part := 2461; imag_part := -32675;
when 976 => real_part := 2411; imag_part := -32679;
when 977 => real_part := 2360; imag_part := -32683;
when 978 => real_part := 2310; imag_part := -32686;
when 979 => real_part := 2260; imag_part := -32690;
when 980 => real_part := 2210; imag_part := -32693;
when 981 => real_part := 2160; imag_part := -32697;
when 982 => real_part := 2110; imag_part := -32700;
when 983 => real_part := 2060; imag_part := -32703;
when 984 => real_part := 2009; imag_part := -32706;
when 985 => real_part := 1959; imag_part := -32709;
when 986 => real_part := 1909; imag_part := -32712;
when 987 => real_part := 1859; imag_part := -32715;
when 988 => real_part := 1809; imag_part := -32718;
when 989 => real_part := 1758; imag_part := -32721;
when 990 => real_part := 1708; imag_part := -32723;
when 991 => real_part := 1658; imag_part := -32726;
when 992 => real_part := 1608; imag_part := -32729;
when 993 => real_part := 1558; imag_part := -32731;
when 994 => real_part := 1507; imag_part := -32733;
when 995 => real_part := 1457; imag_part := -32736;
when 996 => real_part := 1407; imag_part := -32738;
when 997 => real_part := 1357; imag_part := -32740;
when 998 => real_part := 1307; imag_part := -32742;
when 999 => real_part := 1256; imag_part := -32744;
when 1000 => real_part := 1206; imag_part := -32746;
when 1001 => real_part := 1156; imag_part := -32748;
when 1002 => real_part := 1106; imag_part := -32749;
when 1003 => real_part := 1055; imag_part := -32751;
when 1004 => real_part := 1005; imag_part := -32753;
when 1005 => real_part := 955; imag_part := -32754;
when 1006 => real_part := 905; imag_part := -32756;
when 1007 => real_part := 854; imag_part := -32757;
when 1008 => real_part := 804; imag_part := -32758;
when 1009 => real_part := 754; imag_part := -32759;
when 1010 => real_part := 704; imag_part := -32760;
when 1011 => real_part := 653; imag_part := -32761;
when 1012 => real_part := 603; imag_part := -32762;
when 1013 => real_part := 553; imag_part := -32763;
when 1014 => real_part := 503; imag_part := -32764;
when 1015 => real_part := 452; imag_part := -32765;
when 1016 => real_part := 402; imag_part := -32766;
when 1017 => real_part := 352; imag_part := -32766;
when 1018 => real_part := 302; imag_part := -32767;
when 1019 => real_part := 251; imag_part := -32767;
when 1020 => real_part := 201; imag_part := -32767;
when 1021 => real_part := 151; imag_part := -32768;
when 1022 => real_part := 101; imag_part := -32768;
when 1023 => real_part := 50; imag_part := -32768;
when 1024 => real_part := 0; imag_part := -32768;
when 1025 => real_part := -50; imag_part := -32768;
when 1026 => real_part := -101; imag_part := -32768;
when 1027 => real_part := -151; imag_part := -32768;
when 1028 => real_part := -201; imag_part := -32767;
when 1029 => real_part := -251; imag_part := -32767;
when 1030 => real_part := -302; imag_part := -32767;
when 1031 => real_part := -352; imag_part := -32766;
when 1032 => real_part := -402; imag_part := -32766;
when 1033 => real_part := -452; imag_part := -32765;
when 1034 => real_part := -503; imag_part := -32764;
when 1035 => real_part := -553; imag_part := -32763;
when 1036 => real_part := -603; imag_part := -32762;
when 1037 => real_part := -653; imag_part := -32761;
when 1038 => real_part := -704; imag_part := -32760;
when 1039 => real_part := -754; imag_part := -32759;
when 1040 => real_part := -804; imag_part := -32758;
when 1041 => real_part := -854; imag_part := -32757;
when 1042 => real_part := -905; imag_part := -32756;
when 1043 => real_part := -955; imag_part := -32754;
when 1044 => real_part := -1005; imag_part := -32753;
when 1045 => real_part := -1055; imag_part := -32751;
when 1046 => real_part := -1106; imag_part := -32749;
when 1047 => real_part := -1156; imag_part := -32748;
when 1048 => real_part := -1206; imag_part := -32746;
when 1049 => real_part := -1256; imag_part := -32744;
when 1050 => real_part := -1307; imag_part := -32742;
when 1051 => real_part := -1357; imag_part := -32740;
when 1052 => real_part := -1407; imag_part := -32738;
when 1053 => real_part := -1457; imag_part := -32736;
when 1054 => real_part := -1507; imag_part := -32733;
when 1055 => real_part := -1558; imag_part := -32731;
when 1056 => real_part := -1608; imag_part := -32729;
when 1057 => real_part := -1658; imag_part := -32726;
when 1058 => real_part := -1708; imag_part := -32723;
when 1059 => real_part := -1758; imag_part := -32721;
when 1060 => real_part := -1809; imag_part := -32718;
when 1061 => real_part := -1859; imag_part := -32715;
when 1062 => real_part := -1909; imag_part := -32712;
when 1063 => real_part := -1959; imag_part := -32709;
when 1064 => real_part := -2009; imag_part := -32706;
when 1065 => real_part := -2060; imag_part := -32703;
when 1066 => real_part := -2110; imag_part := -32700;
when 1067 => real_part := -2160; imag_part := -32697;
when 1068 => real_part := -2210; imag_part := -32693;
when 1069 => real_part := -2260; imag_part := -32690;
when 1070 => real_part := -2310; imag_part := -32686;
when 1071 => real_part := -2360; imag_part := -32683;
when 1072 => real_part := -2411; imag_part := -32679;
when 1073 => real_part := -2461; imag_part := -32675;
when 1074 => real_part := -2511; imag_part := -32672;
when 1075 => real_part := -2561; imag_part := -32668;
when 1076 => real_part := -2611; imag_part := -32664;
when 1077 => real_part := -2661; imag_part := -32660;
when 1078 => real_part := -2711; imag_part := -32656;
when 1079 => real_part := -2761; imag_part := -32651;
when 1080 => real_part := -2811; imag_part := -32647;
when 1081 => real_part := -2861; imag_part := -32643;
when 1082 => real_part := -2912; imag_part := -32638;
when 1083 => real_part := -2962; imag_part := -32634;
when 1084 => real_part := -3012; imag_part := -32629;
when 1085 => real_part := -3062; imag_part := -32625;
when 1086 => real_part := -3112; imag_part := -32620;
when 1087 => real_part := -3162; imag_part := -32615;
when 1088 => real_part := -3212; imag_part := -32610;
when 1089 => real_part := -3262; imag_part := -32605;
when 1090 => real_part := -3312; imag_part := -32600;
when 1091 => real_part := -3362; imag_part := -32595;
when 1092 => real_part := -3412; imag_part := -32590;
when 1093 => real_part := -3462; imag_part := -32585;
when 1094 => real_part := -3512; imag_part := -32579;
when 1095 => real_part := -3562; imag_part := -32574;
when 1096 => real_part := -3612; imag_part := -32568;
when 1097 => real_part := -3662; imag_part := -32563;
when 1098 => real_part := -3712; imag_part := -32557;
when 1099 => real_part := -3762; imag_part := -32551;
when 1100 => real_part := -3812; imag_part := -32546;
when 1101 => real_part := -3861; imag_part := -32540;
when 1102 => real_part := -3911; imag_part := -32534;
when 1103 => real_part := -3961; imag_part := -32528;
when 1104 => real_part := -4011; imag_part := -32522;
when 1105 => real_part := -4061; imag_part := -32515;
when 1106 => real_part := -4111; imag_part := -32509;
when 1107 => real_part := -4161; imag_part := -32503;
when 1108 => real_part := -4211; imag_part := -32496;
when 1109 => real_part := -4260; imag_part := -32490;
when 1110 => real_part := -4310; imag_part := -32483;
when 1111 => real_part := -4360; imag_part := -32477;
when 1112 => real_part := -4410; imag_part := -32470;
when 1113 => real_part := -4460; imag_part := -32463;
when 1114 => real_part := -4510; imag_part := -32456;
when 1115 => real_part := -4559; imag_part := -32449;
when 1116 => real_part := -4609; imag_part := -32442;
when 1117 => real_part := -4659; imag_part := -32435;
when 1118 => real_part := -4709; imag_part := -32428;
when 1119 => real_part := -4758; imag_part := -32421;
when 1120 => real_part := -4808; imag_part := -32413;
when 1121 => real_part := -4858; imag_part := -32406;
when 1122 => real_part := -4907; imag_part := -32398;
when 1123 => real_part := -4957; imag_part := -32391;
when 1124 => real_part := -5007; imag_part := -32383;
when 1125 => real_part := -5057; imag_part := -32376;
when 1126 => real_part := -5106; imag_part := -32368;
when 1127 => real_part := -5156; imag_part := -32360;
when 1128 => real_part := -5205; imag_part := -32352;
when 1129 => real_part := -5255; imag_part := -32344;
when 1130 => real_part := -5305; imag_part := -32336;
when 1131 => real_part := -5354; imag_part := -32328;
when 1132 => real_part := -5404; imag_part := -32319;
when 1133 => real_part := -5453; imag_part := -32311;
when 1134 => real_part := -5503; imag_part := -32303;
when 1135 => real_part := -5553; imag_part := -32294;
when 1136 => real_part := -5602; imag_part := -32286;
when 1137 => real_part := -5652; imag_part := -32277;
when 1138 => real_part := -5701; imag_part := -32268;
when 1139 => real_part := -5751; imag_part := -32259;
when 1140 => real_part := -5800; imag_part := -32251;
when 1141 => real_part := -5850; imag_part := -32242;
when 1142 => real_part := -5899; imag_part := -32233;
when 1143 => real_part := -5948; imag_part := -32224;
when 1144 => real_part := -5998; imag_part := -32214;
when 1145 => real_part := -6047; imag_part := -32205;
when 1146 => real_part := -6097; imag_part := -32196;
when 1147 => real_part := -6146; imag_part := -32186;
when 1148 => real_part := -6195; imag_part := -32177;
when 1149 => real_part := -6245; imag_part := -32167;
when 1150 => real_part := -6294; imag_part := -32158;
when 1151 => real_part := -6343; imag_part := -32148;
when 1152 => real_part := -6393; imag_part := -32138;
when 1153 => real_part := -6442; imag_part := -32129;
when 1154 => real_part := -6491; imag_part := -32119;
when 1155 => real_part := -6541; imag_part := -32109;
when 1156 => real_part := -6590; imag_part := -32099;
when 1157 => real_part := -6639; imag_part := -32088;
when 1158 => real_part := -6688; imag_part := -32078;
when 1159 => real_part := -6737; imag_part := -32068;
when 1160 => real_part := -6787; imag_part := -32058;
when 1161 => real_part := -6836; imag_part := -32047;
when 1162 => real_part := -6885; imag_part := -32037;
when 1163 => real_part := -6934; imag_part := -32026;
when 1164 => real_part := -6983; imag_part := -32015;
when 1165 => real_part := -7032; imag_part := -32005;
when 1166 => real_part := -7081; imag_part := -31994;
when 1167 => real_part := -7130; imag_part := -31983;
when 1168 => real_part := -7180; imag_part := -31972;
when 1169 => real_part := -7229; imag_part := -31961;
when 1170 => real_part := -7278; imag_part := -31950;
when 1171 => real_part := -7327; imag_part := -31938;
when 1172 => real_part := -7376; imag_part := -31927;
when 1173 => real_part := -7425; imag_part := -31916;
when 1174 => real_part := -7473; imag_part := -31904;
when 1175 => real_part := -7522; imag_part := -31893;
when 1176 => real_part := -7571; imag_part := -31881;
when 1177 => real_part := -7620; imag_part := -31870;
when 1178 => real_part := -7669; imag_part := -31858;
when 1179 => real_part := -7718; imag_part := -31846;
when 1180 => real_part := -7767; imag_part := -31834;
when 1181 => real_part := -7816; imag_part := -31822;
when 1182 => real_part := -7864; imag_part := -31810;
when 1183 => real_part := -7913; imag_part := -31798;
when 1184 => real_part := -7962; imag_part := -31786;
when 1185 => real_part := -8011; imag_part := -31774;
when 1186 => real_part := -8059; imag_part := -31761;
when 1187 => real_part := -8108; imag_part := -31749;
when 1188 => real_part := -8157; imag_part := -31737;
when 1189 => real_part := -8206; imag_part := -31724;
when 1190 => real_part := -8254; imag_part := -31711;
when 1191 => real_part := -8303; imag_part := -31699;
when 1192 => real_part := -8351; imag_part := -31686;
when 1193 => real_part := -8400; imag_part := -31673;
when 1194 => real_part := -8449; imag_part := -31660;
when 1195 => real_part := -8497; imag_part := -31647;
when 1196 => real_part := -8546; imag_part := -31634;
when 1197 => real_part := -8594; imag_part := -31621;
when 1198 => real_part := -8643; imag_part := -31608;
when 1199 => real_part := -8691; imag_part := -31594;
when 1200 => real_part := -8740; imag_part := -31581;
when 1201 => real_part := -8788; imag_part := -31568;
when 1202 => real_part := -8836; imag_part := -31554;
when 1203 => real_part := -8885; imag_part := -31540;
when 1204 => real_part := -8933; imag_part := -31527;
when 1205 => real_part := -8982; imag_part := -31513;
when 1206 => real_part := -9030; imag_part := -31499;
when 1207 => real_part := -9078; imag_part := -31485;
when 1208 => real_part := -9127; imag_part := -31471;
when 1209 => real_part := -9175; imag_part := -31457;
when 1210 => real_part := -9223; imag_part := -31443;
when 1211 => real_part := -9271; imag_part := -31429;
when 1212 => real_part := -9319; imag_part := -31415;
when 1213 => real_part := -9368; imag_part := -31400;
when 1214 => real_part := -9416; imag_part := -31386;
when 1215 => real_part := -9464; imag_part := -31372;
when 1216 => real_part := -9512; imag_part := -31357;
when 1217 => real_part := -9560; imag_part := -31342;
when 1218 => real_part := -9608; imag_part := -31328;
when 1219 => real_part := -9656; imag_part := -31313;
when 1220 => real_part := -9704; imag_part := -31298;
when 1221 => real_part := -9752; imag_part := -31283;
when 1222 => real_part := -9800; imag_part := -31268;
when 1223 => real_part := -9848; imag_part := -31253;
when 1224 => real_part := -9896; imag_part := -31238;
when 1225 => real_part := -9944; imag_part := -31223;
when 1226 => real_part := -9992; imag_part := -31207;
when 1227 => real_part := -10040; imag_part := -31192;
when 1228 => real_part := -10088; imag_part := -31177;
when 1229 => real_part := -10135; imag_part := -31161;
when 1230 => real_part := -10183; imag_part := -31146;
when 1231 => real_part := -10231; imag_part := -31130;
when 1232 => real_part := -10279; imag_part := -31114;
when 1233 => real_part := -10326; imag_part := -31098;
when 1234 => real_part := -10374; imag_part := -31082;
when 1235 => real_part := -10422; imag_part := -31067;
when 1236 => real_part := -10469; imag_part := -31050;
when 1237 => real_part := -10517; imag_part := -31034;
when 1238 => real_part := -10565; imag_part := -31018;
when 1239 => real_part := -10612; imag_part := -31002;
when 1240 => real_part := -10660; imag_part := -30986;
when 1241 => real_part := -10707; imag_part := -30969;
when 1242 => real_part := -10755; imag_part := -30953;
when 1243 => real_part := -10802; imag_part := -30936;
when 1244 => real_part := -10850; imag_part := -30920;
when 1245 => real_part := -10897; imag_part := -30903;
when 1246 => real_part := -10945; imag_part := -30886;
when 1247 => real_part := -10992; imag_part := -30869;
when 1248 => real_part := -11039; imag_part := -30853;
when 1249 => real_part := -11087; imag_part := -30836;
when 1250 => real_part := -11134; imag_part := -30819;
when 1251 => real_part := -11181; imag_part := -30801;
when 1252 => real_part := -11228; imag_part := -30784;
when 1253 => real_part := -11276; imag_part := -30767;
when 1254 => real_part := -11323; imag_part := -30750;
when 1255 => real_part := -11370; imag_part := -30732;
when 1256 => real_part := -11417; imag_part := -30715;
when 1257 => real_part := -11464; imag_part := -30697;
when 1258 => real_part := -11511; imag_part := -30680;
when 1259 => real_part := -11558; imag_part := -30662;
when 1260 => real_part := -11605; imag_part := -30644;
when 1261 => real_part := -11652; imag_part := -30626;
when 1262 => real_part := -11699; imag_part := -30608;
when 1263 => real_part := -11746; imag_part := -30590;
when 1264 => real_part := -11793; imag_part := -30572;
when 1265 => real_part := -11840; imag_part := -30554;
when 1266 => real_part := -11887; imag_part := -30536;
when 1267 => real_part := -11934; imag_part := -30518;
when 1268 => real_part := -11980; imag_part := -30499;
when 1269 => real_part := -12027; imag_part := -30481;
when 1270 => real_part := -12074; imag_part := -30462;
when 1271 => real_part := -12121; imag_part := -30444;
when 1272 => real_part := -12167; imag_part := -30425;
when 1273 => real_part := -12214; imag_part := -30407;
when 1274 => real_part := -12261; imag_part := -30388;
when 1275 => real_part := -12307; imag_part := -30369;
when 1276 => real_part := -12354; imag_part := -30350;
when 1277 => real_part := -12400; imag_part := -30331;
when 1278 => real_part := -12447; imag_part := -30312;
when 1279 => real_part := -12493; imag_part := -30293;
when 1280 => real_part := -12540; imag_part := -30274;
when 1281 => real_part := -12586; imag_part := -30254;
when 1282 => real_part := -12633; imag_part := -30235;
when 1283 => real_part := -12679; imag_part := -30216;
when 1284 => real_part := -12725; imag_part := -30196;
when 1285 => real_part := -12772; imag_part := -30177;
when 1286 => real_part := -12818; imag_part := -30157;
when 1287 => real_part := -12864; imag_part := -30137;
when 1288 => real_part := -12910; imag_part := -30118;
when 1289 => real_part := -12957; imag_part := -30098;
when 1290 => real_part := -13003; imag_part := -30078;
when 1291 => real_part := -13049; imag_part := -30058;
when 1292 => real_part := -13095; imag_part := -30038;
when 1293 => real_part := -13141; imag_part := -30018;
when 1294 => real_part := -13187; imag_part := -29997;
when 1295 => real_part := -13233; imag_part := -29977;
when 1296 => real_part := -13279; imag_part := -29957;
when 1297 => real_part := -13325; imag_part := -29936;
when 1298 => real_part := -13371; imag_part := -29916;
when 1299 => real_part := -13417; imag_part := -29895;
when 1300 => real_part := -13463; imag_part := -29875;
when 1301 => real_part := -13508; imag_part := -29854;
when 1302 => real_part := -13554; imag_part := -29833;
when 1303 => real_part := -13600; imag_part := -29813;
when 1304 => real_part := -13646; imag_part := -29792;
when 1305 => real_part := -13691; imag_part := -29771;
when 1306 => real_part := -13737; imag_part := -29750;
when 1307 => real_part := -13783; imag_part := -29729;
when 1308 => real_part := -13828; imag_part := -29707;
when 1309 => real_part := -13874; imag_part := -29686;
when 1310 => real_part := -13919; imag_part := -29665;
when 1311 => real_part := -13965; imag_part := -29643;
when 1312 => real_part := -14010; imag_part := -29622;
when 1313 => real_part := -14056; imag_part := -29600;
when 1314 => real_part := -14101; imag_part := -29579;
when 1315 => real_part := -14146; imag_part := -29557;
when 1316 => real_part := -14192; imag_part := -29535;
when 1317 => real_part := -14237; imag_part := -29514;
when 1318 => real_part := -14282; imag_part := -29492;
when 1319 => real_part := -14327; imag_part := -29470;
when 1320 => real_part := -14373; imag_part := -29448;
when 1321 => real_part := -14418; imag_part := -29426;
when 1322 => real_part := -14463; imag_part := -29404;
when 1323 => real_part := -14508; imag_part := -29381;
when 1324 => real_part := -14553; imag_part := -29359;
when 1325 => real_part := -14598; imag_part := -29337;
when 1326 => real_part := -14643; imag_part := -29314;
when 1327 => real_part := -14688; imag_part := -29292;
when 1328 => real_part := -14733; imag_part := -29269;
when 1329 => real_part := -14778; imag_part := -29247;
when 1330 => real_part := -14823; imag_part := -29224;
when 1331 => real_part := -14867; imag_part := -29201;
when 1332 => real_part := -14912; imag_part := -29178;
when 1333 => real_part := -14957; imag_part := -29155;
when 1334 => real_part := -15002; imag_part := -29132;
when 1335 => real_part := -15046; imag_part := -29109;
when 1336 => real_part := -15091; imag_part := -29086;
when 1337 => real_part := -15136; imag_part := -29063;
when 1338 => real_part := -15180; imag_part := -29040;
when 1339 => real_part := -15225; imag_part := -29016;
when 1340 => real_part := -15269; imag_part := -28993;
when 1341 => real_part := -15314; imag_part := -28970;
when 1342 => real_part := -15358; imag_part := -28946;
when 1343 => real_part := -15402; imag_part := -28922;
when 1344 => real_part := -15447; imag_part := -28899;
when 1345 => real_part := -15491; imag_part := -28875;
when 1346 => real_part := -15535; imag_part := -28851;
when 1347 => real_part := -15580; imag_part := -28827;
when 1348 => real_part := -15624; imag_part := -28803;
when 1349 => real_part := -15668; imag_part := -28779;
when 1350 => real_part := -15712; imag_part := -28755;
when 1351 => real_part := -15756; imag_part := -28731;
when 1352 => real_part := -15800; imag_part := -28707;
when 1353 => real_part := -15844; imag_part := -28683;
when 1354 => real_part := -15888; imag_part := -28658;
when 1355 => real_part := -15932; imag_part := -28634;
when 1356 => real_part := -15976; imag_part := -28610;
when 1357 => real_part := -16020; imag_part := -28585;
when 1358 => real_part := -16064; imag_part := -28560;
when 1359 => real_part := -16108; imag_part := -28536;
when 1360 => real_part := -16151; imag_part := -28511;
when 1361 => real_part := -16195; imag_part := -28486;
when 1362 => real_part := -16239; imag_part := -28461;
when 1363 => real_part := -16282; imag_part := -28436;
when 1364 => real_part := -16326; imag_part := -28411;
when 1365 => real_part := -16369; imag_part := -28386;
when 1366 => real_part := -16413; imag_part := -28361;
when 1367 => real_part := -16456; imag_part := -28336;
when 1368 => real_part := -16500; imag_part := -28311;
when 1369 => real_part := -16543; imag_part := -28285;
when 1370 => real_part := -16587; imag_part := -28260;
when 1371 => real_part := -16630; imag_part := -28234;
when 1372 => real_part := -16673; imag_part := -28209;
when 1373 => real_part := -16717; imag_part := -28183;
when 1374 => real_part := -16760; imag_part := -28158;
when 1375 => real_part := -16803; imag_part := -28132;
when 1376 => real_part := -16846; imag_part := -28106;
when 1377 => real_part := -16889; imag_part := -28080;
when 1378 => real_part := -16932; imag_part := -28054;
when 1379 => real_part := -16975; imag_part := -28028;
when 1380 => real_part := -17018; imag_part := -28002;
when 1381 => real_part := -17061; imag_part := -27976;
when 1382 => real_part := -17104; imag_part := -27950;
when 1383 => real_part := -17147; imag_part := -27924;
when 1384 => real_part := -17190; imag_part := -27897;
when 1385 => real_part := -17233; imag_part := -27871;
when 1386 => real_part := -17275; imag_part := -27844;
when 1387 => real_part := -17318; imag_part := -27818;
when 1388 => real_part := -17361; imag_part := -27791;
when 1389 => real_part := -17403; imag_part := -27765;
when 1390 => real_part := -17446; imag_part := -27738;
when 1391 => real_part := -17488; imag_part := -27711;
when 1392 => real_part := -17531; imag_part := -27684;
when 1393 => real_part := -17573; imag_part := -27657;
when 1394 => real_part := -17616; imag_part := -27630;
when 1395 => real_part := -17658; imag_part := -27603;
when 1396 => real_part := -17700; imag_part := -27576;
when 1397 => real_part := -17743; imag_part := -27549;
when 1398 => real_part := -17785; imag_part := -27522;
when 1399 => real_part := -17827; imag_part := -27494;
when 1400 => real_part := -17869; imag_part := -27467;
when 1401 => real_part := -17911; imag_part := -27440;
when 1402 => real_part := -17953; imag_part := -27412;
when 1403 => real_part := -17995; imag_part := -27384;
when 1404 => real_part := -18037; imag_part := -27357;
when 1405 => real_part := -18079; imag_part := -27329;
when 1406 => real_part := -18121; imag_part := -27301;
when 1407 => real_part := -18163; imag_part := -27273;
when 1408 => real_part := -18205; imag_part := -27246;
when 1409 => real_part := -18247; imag_part := -27218;
when 1410 => real_part := -18288; imag_part := -27190;
when 1411 => real_part := -18330; imag_part := -27162;
when 1412 => real_part := -18372; imag_part := -27133;
when 1413 => real_part := -18413; imag_part := -27105;
when 1414 => real_part := -18455; imag_part := -27077;
when 1415 => real_part := -18496; imag_part := -27049;
when 1416 => real_part := -18538; imag_part := -27020;
when 1417 => real_part := -18579; imag_part := -26992;
when 1418 => real_part := -18621; imag_part := -26963;
when 1419 => real_part := -18662; imag_part := -26935;
when 1420 => real_part := -18703; imag_part := -26906;
when 1421 => real_part := -18745; imag_part := -26877;
when 1422 => real_part := -18786; imag_part := -26848;
when 1423 => real_part := -18827; imag_part := -26820;
when 1424 => real_part := -18868; imag_part := -26791;
when 1425 => real_part := -18909; imag_part := -26762;
when 1426 => real_part := -18950; imag_part := -26733;
when 1427 => real_part := -18991; imag_part := -26704;
when 1428 => real_part := -19032; imag_part := -26674;
when 1429 => real_part := -19073; imag_part := -26645;
when 1430 => real_part := -19114; imag_part := -26616;
when 1431 => real_part := -19155; imag_part := -26586;
when 1432 => real_part := -19195; imag_part := -26557;
when 1433 => real_part := -19236; imag_part := -26528;
when 1434 => real_part := -19277; imag_part := -26498;
when 1435 => real_part := -19317; imag_part := -26468;
when 1436 => real_part := -19358; imag_part := -26439;
when 1437 => real_part := -19399; imag_part := -26409;
when 1438 => real_part := -19439; imag_part := -26379;
when 1439 => real_part := -19479; imag_part := -26349;
when 1440 => real_part := -19520; imag_part := -26320;
when 1441 => real_part := -19560; imag_part := -26290;
when 1442 => real_part := -19601; imag_part := -26259;
when 1443 => real_part := -19641; imag_part := -26229;
when 1444 => real_part := -19681; imag_part := -26199;
when 1445 => real_part := -19721; imag_part := -26169;
when 1446 => real_part := -19761; imag_part := -26139;
when 1447 => real_part := -19801; imag_part := -26108;
when 1448 => real_part := -19841; imag_part := -26078;
when 1449 => real_part := -19881; imag_part := -26048;
when 1450 => real_part := -19921; imag_part := -26017;
when 1451 => real_part := -19961; imag_part := -25986;
when 1452 => real_part := -20001; imag_part := -25956;
when 1453 => real_part := -20041; imag_part := -25925;
when 1454 => real_part := -20081; imag_part := -25894;
when 1455 => real_part := -20120; imag_part := -25863;
when 1456 => real_part := -20160; imag_part := -25833;
when 1457 => real_part := -20200; imag_part := -25802;
when 1458 => real_part := -20239; imag_part := -25771;
when 1459 => real_part := -20279; imag_part := -25739;
when 1460 => real_part := -20318; imag_part := -25708;
when 1461 => real_part := -20357; imag_part := -25677;
when 1462 => real_part := -20397; imag_part := -25646;
when 1463 => real_part := -20436; imag_part := -25615;
when 1464 => real_part := -20475; imag_part := -25583;
when 1465 => real_part := -20515; imag_part := -25552;
when 1466 => real_part := -20554; imag_part := -25520;
when 1467 => real_part := -20593; imag_part := -25489;
when 1468 => real_part := -20632; imag_part := -25457;
when 1469 => real_part := -20671; imag_part := -25425;
when 1470 => real_part := -20710; imag_part := -25394;
when 1471 => real_part := -20749; imag_part := -25362;
when 1472 => real_part := -20788; imag_part := -25330;
when 1473 => real_part := -20827; imag_part := -25298;
when 1474 => real_part := -20865; imag_part := -25266;
when 1475 => real_part := -20904; imag_part := -25234;
when 1476 => real_part := -20943; imag_part := -25202;
when 1477 => real_part := -20981; imag_part := -25170;
when 1478 => real_part := -21020; imag_part := -25138;
when 1479 => real_part := -21059; imag_part := -25105;
when 1480 => real_part := -21097; imag_part := -25073;
when 1481 => real_part := -21136; imag_part := -25041;
when 1482 => real_part := -21174; imag_part := -25008;
when 1483 => real_part := -21212; imag_part := -24976;
when 1484 => real_part := -21251; imag_part := -24943;
when 1485 => real_part := -21289; imag_part := -24910;
when 1486 => real_part := -21327; imag_part := -24878;
when 1487 => real_part := -21365; imag_part := -24845;
when 1488 => real_part := -21403; imag_part := -24812;
when 1489 => real_part := -21441; imag_part := -24779;
when 1490 => real_part := -21479; imag_part := -24746;
when 1491 => real_part := -21517; imag_part := -24713;
when 1492 => real_part := -21555; imag_part := -24680;
when 1493 => real_part := -21593; imag_part := -24647;
when 1494 => real_part := -21631; imag_part := -24614;
when 1495 => real_part := -21668; imag_part := -24581;
when 1496 => real_part := -21706; imag_part := -24548;
when 1497 => real_part := -21744; imag_part := -24514;
when 1498 => real_part := -21781; imag_part := -24481;
when 1499 => real_part := -21819; imag_part := -24448;
when 1500 => real_part := -21856; imag_part := -24414;
when 1501 => real_part := -21894; imag_part := -24380;
when 1502 => real_part := -21931; imag_part := -24347;
when 1503 => real_part := -21968; imag_part := -24313;
when 1504 => real_part := -22006; imag_part := -24279;
when 1505 => real_part := -22043; imag_part := -24246;
when 1506 => real_part := -22080; imag_part := -24212;
when 1507 => real_part := -22117; imag_part := -24178;
when 1508 => real_part := -22154; imag_part := -24144;
when 1509 => real_part := -22191; imag_part := -24110;
when 1510 => real_part := -22228; imag_part := -24076;
when 1511 => real_part := -22265; imag_part := -24042;
when 1512 => real_part := -22302; imag_part := -24008;
when 1513 => real_part := -22339; imag_part := -23973;
when 1514 => real_part := -22375; imag_part := -23939;
when 1515 => real_part := -22412; imag_part := -23905;
when 1516 => real_part := -22449; imag_part := -23870;
when 1517 => real_part := -22485; imag_part := -23836;
when 1518 => real_part := -22522; imag_part := -23801;
when 1519 => real_part := -22558; imag_part := -23767;
when 1520 => real_part := -22595; imag_part := -23732;
when 1521 => real_part := -22631; imag_part := -23697;
when 1522 => real_part := -22668; imag_part := -23663;
when 1523 => real_part := -22704; imag_part := -23628;
when 1524 => real_part := -22740; imag_part := -23593;
when 1525 => real_part := -22776; imag_part := -23558;
when 1526 => real_part := -22812; imag_part := -23523;
when 1527 => real_part := -22848; imag_part := -23488;
when 1528 => real_part := -22884; imag_part := -23453;
when 1529 => real_part := -22920; imag_part := -23418;
when 1530 => real_part := -22956; imag_part := -23383;
when 1531 => real_part := -22992; imag_part := -23348;
when 1532 => real_part := -23028; imag_part := -23312;
when 1533 => real_part := -23064; imag_part := -23277;
when 1534 => real_part := -23099; imag_part := -23241;
when 1535 => real_part := -23135; imag_part := -23206;
when 1536 => real_part := -23170; imag_part := -23170;
when 1537 => real_part := -23206; imag_part := -23135;
when 1538 => real_part := -23241; imag_part := -23099;
when 1539 => real_part := -23277; imag_part := -23064;
when 1540 => real_part := -23312; imag_part := -23028;
when 1541 => real_part := -23348; imag_part := -22992;
when 1542 => real_part := -23383; imag_part := -22956;
when 1543 => real_part := -23418; imag_part := -22920;
when 1544 => real_part := -23453; imag_part := -22884;
when 1545 => real_part := -23488; imag_part := -22848;
when 1546 => real_part := -23523; imag_part := -22812;
when 1547 => real_part := -23558; imag_part := -22776;
when 1548 => real_part := -23593; imag_part := -22740;
when 1549 => real_part := -23628; imag_part := -22704;
when 1550 => real_part := -23663; imag_part := -22668;
when 1551 => real_part := -23697; imag_part := -22631;
when 1552 => real_part := -23732; imag_part := -22595;
when 1553 => real_part := -23767; imag_part := -22558;
when 1554 => real_part := -23801; imag_part := -22522;
when 1555 => real_part := -23836; imag_part := -22485;
when 1556 => real_part := -23870; imag_part := -22449;
when 1557 => real_part := -23905; imag_part := -22412;
when 1558 => real_part := -23939; imag_part := -22375;
when 1559 => real_part := -23973; imag_part := -22339;
when 1560 => real_part := -24008; imag_part := -22302;
when 1561 => real_part := -24042; imag_part := -22265;
when 1562 => real_part := -24076; imag_part := -22228;
when 1563 => real_part := -24110; imag_part := -22191;
when 1564 => real_part := -24144; imag_part := -22154;
when 1565 => real_part := -24178; imag_part := -22117;
when 1566 => real_part := -24212; imag_part := -22080;
when 1567 => real_part := -24246; imag_part := -22043;
when 1568 => real_part := -24279; imag_part := -22006;
when 1569 => real_part := -24313; imag_part := -21968;
when 1570 => real_part := -24347; imag_part := -21931;
when 1571 => real_part := -24380; imag_part := -21894;
when 1572 => real_part := -24414; imag_part := -21856;
when 1573 => real_part := -24448; imag_part := -21819;
when 1574 => real_part := -24481; imag_part := -21781;
when 1575 => real_part := -24514; imag_part := -21744;
when 1576 => real_part := -24548; imag_part := -21706;
when 1577 => real_part := -24581; imag_part := -21668;
when 1578 => real_part := -24614; imag_part := -21631;
when 1579 => real_part := -24647; imag_part := -21593;
when 1580 => real_part := -24680; imag_part := -21555;
when 1581 => real_part := -24713; imag_part := -21517;
when 1582 => real_part := -24746; imag_part := -21479;
when 1583 => real_part := -24779; imag_part := -21441;
when 1584 => real_part := -24812; imag_part := -21403;
when 1585 => real_part := -24845; imag_part := -21365;
when 1586 => real_part := -24878; imag_part := -21327;
when 1587 => real_part := -24910; imag_part := -21289;
when 1588 => real_part := -24943; imag_part := -21251;
when 1589 => real_part := -24976; imag_part := -21212;
when 1590 => real_part := -25008; imag_part := -21174;
when 1591 => real_part := -25041; imag_part := -21136;
when 1592 => real_part := -25073; imag_part := -21097;
when 1593 => real_part := -25105; imag_part := -21059;
when 1594 => real_part := -25138; imag_part := -21020;
when 1595 => real_part := -25170; imag_part := -20981;
when 1596 => real_part := -25202; imag_part := -20943;
when 1597 => real_part := -25234; imag_part := -20904;
when 1598 => real_part := -25266; imag_part := -20865;
when 1599 => real_part := -25298; imag_part := -20827;
when 1600 => real_part := -25330; imag_part := -20788;
when 1601 => real_part := -25362; imag_part := -20749;
when 1602 => real_part := -25394; imag_part := -20710;
when 1603 => real_part := -25425; imag_part := -20671;
when 1604 => real_part := -25457; imag_part := -20632;
when 1605 => real_part := -25489; imag_part := -20593;
when 1606 => real_part := -25520; imag_part := -20554;
when 1607 => real_part := -25552; imag_part := -20515;
when 1608 => real_part := -25583; imag_part := -20475;
when 1609 => real_part := -25615; imag_part := -20436;
when 1610 => real_part := -25646; imag_part := -20397;
when 1611 => real_part := -25677; imag_part := -20357;
when 1612 => real_part := -25708; imag_part := -20318;
when 1613 => real_part := -25739; imag_part := -20279;
when 1614 => real_part := -25771; imag_part := -20239;
when 1615 => real_part := -25802; imag_part := -20200;
when 1616 => real_part := -25833; imag_part := -20160;
when 1617 => real_part := -25863; imag_part := -20120;
when 1618 => real_part := -25894; imag_part := -20081;
when 1619 => real_part := -25925; imag_part := -20041;
when 1620 => real_part := -25956; imag_part := -20001;
when 1621 => real_part := -25986; imag_part := -19961;
when 1622 => real_part := -26017; imag_part := -19921;
when 1623 => real_part := -26048; imag_part := -19881;
when 1624 => real_part := -26078; imag_part := -19841;
when 1625 => real_part := -26108; imag_part := -19801;
when 1626 => real_part := -26139; imag_part := -19761;
when 1627 => real_part := -26169; imag_part := -19721;
when 1628 => real_part := -26199; imag_part := -19681;
when 1629 => real_part := -26229; imag_part := -19641;
when 1630 => real_part := -26259; imag_part := -19601;
when 1631 => real_part := -26290; imag_part := -19560;
when 1632 => real_part := -26320; imag_part := -19520;
when 1633 => real_part := -26349; imag_part := -19479;
when 1634 => real_part := -26379; imag_part := -19439;
when 1635 => real_part := -26409; imag_part := -19399;
when 1636 => real_part := -26439; imag_part := -19358;
when 1637 => real_part := -26468; imag_part := -19317;
when 1638 => real_part := -26498; imag_part := -19277;
when 1639 => real_part := -26528; imag_part := -19236;
when 1640 => real_part := -26557; imag_part := -19195;
when 1641 => real_part := -26586; imag_part := -19155;
when 1642 => real_part := -26616; imag_part := -19114;
when 1643 => real_part := -26645; imag_part := -19073;
when 1644 => real_part := -26674; imag_part := -19032;
when 1645 => real_part := -26704; imag_part := -18991;
when 1646 => real_part := -26733; imag_part := -18950;
when 1647 => real_part := -26762; imag_part := -18909;
when 1648 => real_part := -26791; imag_part := -18868;
when 1649 => real_part := -26820; imag_part := -18827;
when 1650 => real_part := -26848; imag_part := -18786;
when 1651 => real_part := -26877; imag_part := -18745;
when 1652 => real_part := -26906; imag_part := -18703;
when 1653 => real_part := -26935; imag_part := -18662;
when 1654 => real_part := -26963; imag_part := -18621;
when 1655 => real_part := -26992; imag_part := -18579;
when 1656 => real_part := -27020; imag_part := -18538;
when 1657 => real_part := -27049; imag_part := -18496;
when 1658 => real_part := -27077; imag_part := -18455;
when 1659 => real_part := -27105; imag_part := -18413;
when 1660 => real_part := -27133; imag_part := -18372;
when 1661 => real_part := -27162; imag_part := -18330;
when 1662 => real_part := -27190; imag_part := -18288;
when 1663 => real_part := -27218; imag_part := -18247;
when 1664 => real_part := -27246; imag_part := -18205;
when 1665 => real_part := -27273; imag_part := -18163;
when 1666 => real_part := -27301; imag_part := -18121;
when 1667 => real_part := -27329; imag_part := -18079;
when 1668 => real_part := -27357; imag_part := -18037;
when 1669 => real_part := -27384; imag_part := -17995;
when 1670 => real_part := -27412; imag_part := -17953;
when 1671 => real_part := -27440; imag_part := -17911;
when 1672 => real_part := -27467; imag_part := -17869;
when 1673 => real_part := -27494; imag_part := -17827;
when 1674 => real_part := -27522; imag_part := -17785;
when 1675 => real_part := -27549; imag_part := -17743;
when 1676 => real_part := -27576; imag_part := -17700;
when 1677 => real_part := -27603; imag_part := -17658;
when 1678 => real_part := -27630; imag_part := -17616;
when 1679 => real_part := -27657; imag_part := -17573;
when 1680 => real_part := -27684; imag_part := -17531;
when 1681 => real_part := -27711; imag_part := -17488;
when 1682 => real_part := -27738; imag_part := -17446;
when 1683 => real_part := -27765; imag_part := -17403;
when 1684 => real_part := -27791; imag_part := -17361;
when 1685 => real_part := -27818; imag_part := -17318;
when 1686 => real_part := -27844; imag_part := -17275;
when 1687 => real_part := -27871; imag_part := -17233;
when 1688 => real_part := -27897; imag_part := -17190;
when 1689 => real_part := -27924; imag_part := -17147;
when 1690 => real_part := -27950; imag_part := -17104;
when 1691 => real_part := -27976; imag_part := -17061;
when 1692 => real_part := -28002; imag_part := -17018;
when 1693 => real_part := -28028; imag_part := -16975;
when 1694 => real_part := -28054; imag_part := -16932;
when 1695 => real_part := -28080; imag_part := -16889;
when 1696 => real_part := -28106; imag_part := -16846;
when 1697 => real_part := -28132; imag_part := -16803;
when 1698 => real_part := -28158; imag_part := -16760;
when 1699 => real_part := -28183; imag_part := -16717;
when 1700 => real_part := -28209; imag_part := -16673;
when 1701 => real_part := -28234; imag_part := -16630;
when 1702 => real_part := -28260; imag_part := -16587;
when 1703 => real_part := -28285; imag_part := -16543;
when 1704 => real_part := -28311; imag_part := -16500;
when 1705 => real_part := -28336; imag_part := -16456;
when 1706 => real_part := -28361; imag_part := -16413;
when 1707 => real_part := -28386; imag_part := -16369;
when 1708 => real_part := -28411; imag_part := -16326;
when 1709 => real_part := -28436; imag_part := -16282;
when 1710 => real_part := -28461; imag_part := -16239;
when 1711 => real_part := -28486; imag_part := -16195;
when 1712 => real_part := -28511; imag_part := -16151;
when 1713 => real_part := -28536; imag_part := -16108;
when 1714 => real_part := -28560; imag_part := -16064;
when 1715 => real_part := -28585; imag_part := -16020;
when 1716 => real_part := -28610; imag_part := -15976;
when 1717 => real_part := -28634; imag_part := -15932;
when 1718 => real_part := -28658; imag_part := -15888;
when 1719 => real_part := -28683; imag_part := -15844;
when 1720 => real_part := -28707; imag_part := -15800;
when 1721 => real_part := -28731; imag_part := -15756;
when 1722 => real_part := -28755; imag_part := -15712;
when 1723 => real_part := -28779; imag_part := -15668;
when 1724 => real_part := -28803; imag_part := -15624;
when 1725 => real_part := -28827; imag_part := -15580;
when 1726 => real_part := -28851; imag_part := -15535;
when 1727 => real_part := -28875; imag_part := -15491;
when 1728 => real_part := -28899; imag_part := -15447;
when 1729 => real_part := -28922; imag_part := -15402;
when 1730 => real_part := -28946; imag_part := -15358;
when 1731 => real_part := -28970; imag_part := -15314;
when 1732 => real_part := -28993; imag_part := -15269;
when 1733 => real_part := -29016; imag_part := -15225;
when 1734 => real_part := -29040; imag_part := -15180;
when 1735 => real_part := -29063; imag_part := -15136;
when 1736 => real_part := -29086; imag_part := -15091;
when 1737 => real_part := -29109; imag_part := -15046;
when 1738 => real_part := -29132; imag_part := -15002;
when 1739 => real_part := -29155; imag_part := -14957;
when 1740 => real_part := -29178; imag_part := -14912;
when 1741 => real_part := -29201; imag_part := -14867;
when 1742 => real_part := -29224; imag_part := -14823;
when 1743 => real_part := -29247; imag_part := -14778;
when 1744 => real_part := -29269; imag_part := -14733;
when 1745 => real_part := -29292; imag_part := -14688;
when 1746 => real_part := -29314; imag_part := -14643;
when 1747 => real_part := -29337; imag_part := -14598;
when 1748 => real_part := -29359; imag_part := -14553;
when 1749 => real_part := -29381; imag_part := -14508;
when 1750 => real_part := -29404; imag_part := -14463;
when 1751 => real_part := -29426; imag_part := -14418;
when 1752 => real_part := -29448; imag_part := -14373;
when 1753 => real_part := -29470; imag_part := -14327;
when 1754 => real_part := -29492; imag_part := -14282;
when 1755 => real_part := -29514; imag_part := -14237;
when 1756 => real_part := -29535; imag_part := -14192;
when 1757 => real_part := -29557; imag_part := -14146;
when 1758 => real_part := -29579; imag_part := -14101;
when 1759 => real_part := -29600; imag_part := -14056;
when 1760 => real_part := -29622; imag_part := -14010;
when 1761 => real_part := -29643; imag_part := -13965;
when 1762 => real_part := -29665; imag_part := -13919;
when 1763 => real_part := -29686; imag_part := -13874;
when 1764 => real_part := -29707; imag_part := -13828;
when 1765 => real_part := -29729; imag_part := -13783;
when 1766 => real_part := -29750; imag_part := -13737;
when 1767 => real_part := -29771; imag_part := -13691;
when 1768 => real_part := -29792; imag_part := -13646;
when 1769 => real_part := -29813; imag_part := -13600;
when 1770 => real_part := -29833; imag_part := -13554;
when 1771 => real_part := -29854; imag_part := -13508;
when 1772 => real_part := -29875; imag_part := -13463;
when 1773 => real_part := -29895; imag_part := -13417;
when 1774 => real_part := -29916; imag_part := -13371;
when 1775 => real_part := -29936; imag_part := -13325;
when 1776 => real_part := -29957; imag_part := -13279;
when 1777 => real_part := -29977; imag_part := -13233;
when 1778 => real_part := -29997; imag_part := -13187;
when 1779 => real_part := -30018; imag_part := -13141;
when 1780 => real_part := -30038; imag_part := -13095;
when 1781 => real_part := -30058; imag_part := -13049;
when 1782 => real_part := -30078; imag_part := -13003;
when 1783 => real_part := -30098; imag_part := -12957;
when 1784 => real_part := -30118; imag_part := -12910;
when 1785 => real_part := -30137; imag_part := -12864;
when 1786 => real_part := -30157; imag_part := -12818;
when 1787 => real_part := -30177; imag_part := -12772;
when 1788 => real_part := -30196; imag_part := -12725;
when 1789 => real_part := -30216; imag_part := -12679;
when 1790 => real_part := -30235; imag_part := -12633;
when 1791 => real_part := -30254; imag_part := -12586;
when 1792 => real_part := -30274; imag_part := -12540;
when 1793 => real_part := -30293; imag_part := -12493;
when 1794 => real_part := -30312; imag_part := -12447;
when 1795 => real_part := -30331; imag_part := -12400;
when 1796 => real_part := -30350; imag_part := -12354;
when 1797 => real_part := -30369; imag_part := -12307;
when 1798 => real_part := -30388; imag_part := -12261;
when 1799 => real_part := -30407; imag_part := -12214;
when 1800 => real_part := -30425; imag_part := -12167;
when 1801 => real_part := -30444; imag_part := -12121;
when 1802 => real_part := -30462; imag_part := -12074;
when 1803 => real_part := -30481; imag_part := -12027;
when 1804 => real_part := -30499; imag_part := -11980;
when 1805 => real_part := -30518; imag_part := -11934;
when 1806 => real_part := -30536; imag_part := -11887;
when 1807 => real_part := -30554; imag_part := -11840;
when 1808 => real_part := -30572; imag_part := -11793;
when 1809 => real_part := -30590; imag_part := -11746;
when 1810 => real_part := -30608; imag_part := -11699;
when 1811 => real_part := -30626; imag_part := -11652;
when 1812 => real_part := -30644; imag_part := -11605;
when 1813 => real_part := -30662; imag_part := -11558;
when 1814 => real_part := -30680; imag_part := -11511;
when 1815 => real_part := -30697; imag_part := -11464;
when 1816 => real_part := -30715; imag_part := -11417;
when 1817 => real_part := -30732; imag_part := -11370;
when 1818 => real_part := -30750; imag_part := -11323;
when 1819 => real_part := -30767; imag_part := -11276;
when 1820 => real_part := -30784; imag_part := -11228;
when 1821 => real_part := -30801; imag_part := -11181;
when 1822 => real_part := -30819; imag_part := -11134;
when 1823 => real_part := -30836; imag_part := -11087;
when 1824 => real_part := -30853; imag_part := -11039;
when 1825 => real_part := -30869; imag_part := -10992;
when 1826 => real_part := -30886; imag_part := -10945;
when 1827 => real_part := -30903; imag_part := -10897;
when 1828 => real_part := -30920; imag_part := -10850;
when 1829 => real_part := -30936; imag_part := -10802;
when 1830 => real_part := -30953; imag_part := -10755;
when 1831 => real_part := -30969; imag_part := -10707;
when 1832 => real_part := -30986; imag_part := -10660;
when 1833 => real_part := -31002; imag_part := -10612;
when 1834 => real_part := -31018; imag_part := -10565;
when 1835 => real_part := -31034; imag_part := -10517;
when 1836 => real_part := -31050; imag_part := -10469;
when 1837 => real_part := -31067; imag_part := -10422;
when 1838 => real_part := -31082; imag_part := -10374;
when 1839 => real_part := -31098; imag_part := -10326;
when 1840 => real_part := -31114; imag_part := -10279;
when 1841 => real_part := -31130; imag_part := -10231;
when 1842 => real_part := -31146; imag_part := -10183;
when 1843 => real_part := -31161; imag_part := -10135;
when 1844 => real_part := -31177; imag_part := -10088;
when 1845 => real_part := -31192; imag_part := -10040;
when 1846 => real_part := -31207; imag_part := -9992;
when 1847 => real_part := -31223; imag_part := -9944;
when 1848 => real_part := -31238; imag_part := -9896;
when 1849 => real_part := -31253; imag_part := -9848;
when 1850 => real_part := -31268; imag_part := -9800;
when 1851 => real_part := -31283; imag_part := -9752;
when 1852 => real_part := -31298; imag_part := -9704;
when 1853 => real_part := -31313; imag_part := -9656;
when 1854 => real_part := -31328; imag_part := -9608;
when 1855 => real_part := -31342; imag_part := -9560;
when 1856 => real_part := -31357; imag_part := -9512;
when 1857 => real_part := -31372; imag_part := -9464;
when 1858 => real_part := -31386; imag_part := -9416;
when 1859 => real_part := -31400; imag_part := -9368;
when 1860 => real_part := -31415; imag_part := -9319;
when 1861 => real_part := -31429; imag_part := -9271;
when 1862 => real_part := -31443; imag_part := -9223;
when 1863 => real_part := -31457; imag_part := -9175;
when 1864 => real_part := -31471; imag_part := -9127;
when 1865 => real_part := -31485; imag_part := -9078;
when 1866 => real_part := -31499; imag_part := -9030;
when 1867 => real_part := -31513; imag_part := -8982;
when 1868 => real_part := -31527; imag_part := -8933;
when 1869 => real_part := -31540; imag_part := -8885;
when 1870 => real_part := -31554; imag_part := -8836;
when 1871 => real_part := -31568; imag_part := -8788;
when 1872 => real_part := -31581; imag_part := -8740;
when 1873 => real_part := -31594; imag_part := -8691;
when 1874 => real_part := -31608; imag_part := -8643;
when 1875 => real_part := -31621; imag_part := -8594;
when 1876 => real_part := -31634; imag_part := -8546;
when 1877 => real_part := -31647; imag_part := -8497;
when 1878 => real_part := -31660; imag_part := -8449;
when 1879 => real_part := -31673; imag_part := -8400;
when 1880 => real_part := -31686; imag_part := -8351;
when 1881 => real_part := -31699; imag_part := -8303;
when 1882 => real_part := -31711; imag_part := -8254;
when 1883 => real_part := -31724; imag_part := -8206;
when 1884 => real_part := -31737; imag_part := -8157;
when 1885 => real_part := -31749; imag_part := -8108;
when 1886 => real_part := -31761; imag_part := -8059;
when 1887 => real_part := -31774; imag_part := -8011;
when 1888 => real_part := -31786; imag_part := -7962;
when 1889 => real_part := -31798; imag_part := -7913;
when 1890 => real_part := -31810; imag_part := -7864;
when 1891 => real_part := -31822; imag_part := -7816;
when 1892 => real_part := -31834; imag_part := -7767;
when 1893 => real_part := -31846; imag_part := -7718;
when 1894 => real_part := -31858; imag_part := -7669;
when 1895 => real_part := -31870; imag_part := -7620;
when 1896 => real_part := -31881; imag_part := -7571;
when 1897 => real_part := -31893; imag_part := -7522;
when 1898 => real_part := -31904; imag_part := -7473;
when 1899 => real_part := -31916; imag_part := -7425;
when 1900 => real_part := -31927; imag_part := -7376;
when 1901 => real_part := -31938; imag_part := -7327;
when 1902 => real_part := -31950; imag_part := -7278;
when 1903 => real_part := -31961; imag_part := -7229;
when 1904 => real_part := -31972; imag_part := -7180;
when 1905 => real_part := -31983; imag_part := -7130;
when 1906 => real_part := -31994; imag_part := -7081;
when 1907 => real_part := -32005; imag_part := -7032;
when 1908 => real_part := -32015; imag_part := -6983;
when 1909 => real_part := -32026; imag_part := -6934;
when 1910 => real_part := -32037; imag_part := -6885;
when 1911 => real_part := -32047; imag_part := -6836;
when 1912 => real_part := -32058; imag_part := -6787;
when 1913 => real_part := -32068; imag_part := -6737;
when 1914 => real_part := -32078; imag_part := -6688;
when 1915 => real_part := -32088; imag_part := -6639;
when 1916 => real_part := -32099; imag_part := -6590;
when 1917 => real_part := -32109; imag_part := -6541;
when 1918 => real_part := -32119; imag_part := -6491;
when 1919 => real_part := -32129; imag_part := -6442;
when 1920 => real_part := -32138; imag_part := -6393;
when 1921 => real_part := -32148; imag_part := -6343;
when 1922 => real_part := -32158; imag_part := -6294;
when 1923 => real_part := -32167; imag_part := -6245;
when 1924 => real_part := -32177; imag_part := -6195;
when 1925 => real_part := -32186; imag_part := -6146;
when 1926 => real_part := -32196; imag_part := -6097;
when 1927 => real_part := -32205; imag_part := -6047;
when 1928 => real_part := -32214; imag_part := -5998;
when 1929 => real_part := -32224; imag_part := -5948;
when 1930 => real_part := -32233; imag_part := -5899;
when 1931 => real_part := -32242; imag_part := -5850;
when 1932 => real_part := -32251; imag_part := -5800;
when 1933 => real_part := -32259; imag_part := -5751;
when 1934 => real_part := -32268; imag_part := -5701;
when 1935 => real_part := -32277; imag_part := -5652;
when 1936 => real_part := -32286; imag_part := -5602;
when 1937 => real_part := -32294; imag_part := -5553;
when 1938 => real_part := -32303; imag_part := -5503;
when 1939 => real_part := -32311; imag_part := -5453;
when 1940 => real_part := -32319; imag_part := -5404;
when 1941 => real_part := -32328; imag_part := -5354;
when 1942 => real_part := -32336; imag_part := -5305;
when 1943 => real_part := -32344; imag_part := -5255;
when 1944 => real_part := -32352; imag_part := -5205;
when 1945 => real_part := -32360; imag_part := -5156;
when 1946 => real_part := -32368; imag_part := -5106;
when 1947 => real_part := -32376; imag_part := -5057;
when 1948 => real_part := -32383; imag_part := -5007;
when 1949 => real_part := -32391; imag_part := -4957;
when 1950 => real_part := -32398; imag_part := -4907;
when 1951 => real_part := -32406; imag_part := -4858;
when 1952 => real_part := -32413; imag_part := -4808;
when 1953 => real_part := -32421; imag_part := -4758;
when 1954 => real_part := -32428; imag_part := -4709;
when 1955 => real_part := -32435; imag_part := -4659;
when 1956 => real_part := -32442; imag_part := -4609;
when 1957 => real_part := -32449; imag_part := -4559;
when 1958 => real_part := -32456; imag_part := -4510;
when 1959 => real_part := -32463; imag_part := -4460;
when 1960 => real_part := -32470; imag_part := -4410;
when 1961 => real_part := -32477; imag_part := -4360;
when 1962 => real_part := -32483; imag_part := -4310;
when 1963 => real_part := -32490; imag_part := -4260;
when 1964 => real_part := -32496; imag_part := -4211;
when 1965 => real_part := -32503; imag_part := -4161;
when 1966 => real_part := -32509; imag_part := -4111;
when 1967 => real_part := -32515; imag_part := -4061;
when 1968 => real_part := -32522; imag_part := -4011;
when 1969 => real_part := -32528; imag_part := -3961;
when 1970 => real_part := -32534; imag_part := -3911;
when 1971 => real_part := -32540; imag_part := -3861;
when 1972 => real_part := -32546; imag_part := -3812;
when 1973 => real_part := -32551; imag_part := -3762;
when 1974 => real_part := -32557; imag_part := -3712;
when 1975 => real_part := -32563; imag_part := -3662;
when 1976 => real_part := -32568; imag_part := -3612;
when 1977 => real_part := -32574; imag_part := -3562;
when 1978 => real_part := -32579; imag_part := -3512;
when 1979 => real_part := -32585; imag_part := -3462;
when 1980 => real_part := -32590; imag_part := -3412;
when 1981 => real_part := -32595; imag_part := -3362;
when 1982 => real_part := -32600; imag_part := -3312;
when 1983 => real_part := -32605; imag_part := -3262;
when 1984 => real_part := -32610; imag_part := -3212;
when 1985 => real_part := -32615; imag_part := -3162;
when 1986 => real_part := -32620; imag_part := -3112;
when 1987 => real_part := -32625; imag_part := -3062;
when 1988 => real_part := -32629; imag_part := -3012;
when 1989 => real_part := -32634; imag_part := -2962;
when 1990 => real_part := -32638; imag_part := -2912;
when 1991 => real_part := -32643; imag_part := -2861;
when 1992 => real_part := -32647; imag_part := -2811;
when 1993 => real_part := -32651; imag_part := -2761;
when 1994 => real_part := -32656; imag_part := -2711;
when 1995 => real_part := -32660; imag_part := -2661;
when 1996 => real_part := -32664; imag_part := -2611;
when 1997 => real_part := -32668; imag_part := -2561;
when 1998 => real_part := -32672; imag_part := -2511;
when 1999 => real_part := -32675; imag_part := -2461;
when 2000 => real_part := -32679; imag_part := -2411;
when 2001 => real_part := -32683; imag_part := -2360;
when 2002 => real_part := -32686; imag_part := -2310;
when 2003 => real_part := -32690; imag_part := -2260;
when 2004 => real_part := -32693; imag_part := -2210;
when 2005 => real_part := -32697; imag_part := -2160;
when 2006 => real_part := -32700; imag_part := -2110;
when 2007 => real_part := -32703; imag_part := -2060;
when 2008 => real_part := -32706; imag_part := -2009;
when 2009 => real_part := -32709; imag_part := -1959;
when 2010 => real_part := -32712; imag_part := -1909;
when 2011 => real_part := -32715; imag_part := -1859;
when 2012 => real_part := -32718; imag_part := -1809;
when 2013 => real_part := -32721; imag_part := -1758;
when 2014 => real_part := -32723; imag_part := -1708;
when 2015 => real_part := -32726; imag_part := -1658;
when 2016 => real_part := -32729; imag_part := -1608;
when 2017 => real_part := -32731; imag_part := -1558;
when 2018 => real_part := -32733; imag_part := -1507;
when 2019 => real_part := -32736; imag_part := -1457;
when 2020 => real_part := -32738; imag_part := -1407;
when 2021 => real_part := -32740; imag_part := -1357;
when 2022 => real_part := -32742; imag_part := -1307;
when 2023 => real_part := -32744; imag_part := -1256;
when 2024 => real_part := -32746; imag_part := -1206;
when 2025 => real_part := -32748; imag_part := -1156;
when 2026 => real_part := -32749; imag_part := -1106;
when 2027 => real_part := -32751; imag_part := -1055;
when 2028 => real_part := -32753; imag_part := -1005;
when 2029 => real_part := -32754; imag_part := -955;
when 2030 => real_part := -32756; imag_part := -905;
when 2031 => real_part := -32757; imag_part := -854;
when 2032 => real_part := -32758; imag_part := -804;
when 2033 => real_part := -32759; imag_part := -754;
when 2034 => real_part := -32760; imag_part := -704;
when 2035 => real_part := -32761; imag_part := -653;
when 2036 => real_part := -32762; imag_part := -603;
when 2037 => real_part := -32763; imag_part := -553;
when 2038 => real_part := -32764; imag_part := -503;
when 2039 => real_part := -32765; imag_part := -452;
when 2040 => real_part := -32766; imag_part := -402;
when 2041 => real_part := -32766; imag_part := -352;
when 2042 => real_part := -32767; imag_part := -302;
when 2043 => real_part := -32767; imag_part := -251;
when 2044 => real_part := -32767; imag_part := -201;
when 2045 => real_part := -32768; imag_part := -151;
when 2046 => real_part := -32768; imag_part := -101;
when 2047 => real_part := -32768; imag_part := -50;
when others => real_part := 0; imag_part := 0;
end case;
if inverse then
if imag_part = -32768 then imag_part := 32767;
else imag_part := -imag_part; end if;
end if;
return pack_complex(to_signed(real_part, 16), to_signed(imag_part, 16));
end;
signal sample_memory : sample_memory_t := (others => (others => '0'));
attribute ram_style : string;
attribute ram_style of sample_memory : signal is "block";
signal phase : phase_t := load_frame;
signal frame_active : boolean := false;
signal load_count : natural range 0 to SAMPLES - 1 := 0;
signal stage_index : natural range 0 to STAGES - 1 := 0;
signal group_base : natural range 0 to SAMPLES - 1 := 0;
signal group_size : natural range 2 to SAMPLES := 2;
signal half_size : natural range 1 to SAMPLES / 2 := 1;
signal position : natural range 0 to SAMPLES / 2 - 1 := 0;
signal twiddle_stride : natural range 1 to SAMPLES / 2 := SAMPLES / 2;
signal twiddle_index : natural range 0 to SAMPLES / 2 - 1 := 0;
signal address_a, address_b : natural range 0 to SAMPLES - 1 := 0;
signal operand_a, operand_b, operand_twiddle : complex_word_t :=
(others => '0');
signal emit_index : natural range 0 to SAMPLES - 1 := 0;
signal output_word : complex_word_t := (others => '0');
signal frame_length_error : boolean := false;
begin
ctor_inputready <= ctor_lvt_context_in.rst = '0' and phase = load_frame;
ctor_outputvalid <= ctor_lvt_context_in.rst = '0' and phase = emit_hold;
ctor_outputreal <= output_word(31 downto 16);
ctor_outputimag <= output_word(15 downto 0);
ctor_outputfirst <= emit_index = 0;
ctor_outputlast <= emit_index = SAMPLES - 1;
ctor_framelengtherror <= frame_length_error;
process (ctor_lvt_context_in.clk)
variable logical_index, memory_address : natural;
variable next_address_a, next_address_b : natural;
variable master_twiddle_index : natural;
variable ar, ai, br, bi, wr, wi : q15_t;
variable product_rr, product_ii, product_ri, product_ir : product_t;
variable twiddle_real, twiddle_imag : complex_product_t;
variable aligned_real, aligned_imag : complex_product_t;
variable sum_real, sum_imag, difference_real, difference_imag : butterfly_t;
variable result_a_real, result_a_imag : q15_t;
variable result_b_real, result_b_imag : q15_t;
variable selected_shift : natural range 0 to 1;
begin
if rising_edge(ctor_lvt_context_in.clk) then
if ctor_lvt_context_in.rst = '1' then
phase <= load_frame;
frame_active <= false;
load_count <= 0;
stage_index <= 0;
group_base <= 0;
group_size <= 2;
half_size <= 1;
position <= 0;
twiddle_stride <= SAMPLES / 2;
twiddle_index <= 0;
emit_index <= 0;
output_word <= (others => '0');
frame_length_error <= false;
else
assert supported_size(SAMPLES)
report "sequential FFT length must be in 8..4096" severity failure;
assert 2 ** STAGES = SAMPLES
report "sequential FFT length must be a power of two" severity failure;
assert to_integer(ctor_stageshiftmask) >= -1 and
to_integer(ctor_stageshiftmask) <= 4095
report "invalid FFT stage shift mask" severity failure;
frame_length_error <= false;
case phase is
when load_frame =>
if ctor_inputvalid then
if ctor_inputfirst then
if frame_active then frame_length_error <= true; end if;
logical_index := 0;
if ctor_inputbitreversed then
memory_address := logical_index;
else
memory_address := reverse_bits(logical_index, STAGES);
end if;
sample_memory(memory_address) <= pack_complex(
signed(ctor_inputreal), signed(ctor_inputimag));
load_count <= 1;
frame_active <= true;
if ctor_inputlast then
frame_length_error <= true;
frame_active <= false;
load_count <= 0;
end if;
elsif frame_active then
logical_index := load_count;
if ctor_inputbitreversed then
memory_address := logical_index;
else
memory_address := reverse_bits(logical_index, STAGES);
end if;
sample_memory(memory_address) <= pack_complex(
signed(ctor_inputreal), signed(ctor_inputimag));
if ctor_inputlast then
if load_count = SAMPLES - 1 then
frame_active <= false;
load_count <= 0;
stage_index <= 0;
group_base <= 0;
group_size <= 2;
half_size <= 1;
position <= 0;
twiddle_stride <= SAMPLES / 2;
twiddle_index <= 0;
phase <= compute_read;
else
frame_length_error <= true;
frame_active <= false;
load_count <= 0;
end if;
elsif load_count = SAMPLES - 1 then
frame_length_error <= true;
frame_active <= false;
load_count <= 0;
else
load_count <= load_count + 1;
end if;
else
frame_length_error <= true;
end if;
end if;
when compute_read =>
next_address_a := group_base + position;
next_address_b := next_address_a + half_size;
address_a <= next_address_a;
address_b <= next_address_b;
operand_a <= sample_memory(next_address_a);
operand_b <= sample_memory(next_address_b);
master_twiddle_index := twiddle_index
* (MASTER_SAMPLES / SAMPLES);
operand_twiddle <= twiddle(master_twiddle_index,
ctor_inverse);
phase <= compute_write;
when compute_write =>
ar := signed(operand_a(31 downto 16));
ai := signed(operand_a(15 downto 0));
br := signed(operand_b(31 downto 16));
bi := signed(operand_b(15 downto 0));
wr := signed(operand_twiddle(31 downto 16));
wi := signed(operand_twiddle(15 downto 0));
product_rr := br * wr;
product_ii := bi * wi;
product_ri := br * wi;
product_ir := bi * wr;
twiddle_real := resize(product_rr, 33)
- resize(product_ii, 33);
twiddle_imag := resize(product_ri, 33)
+ resize(product_ir, 33);
aligned_real := shift_left(resize(ar, 33), 15);
aligned_imag := shift_left(resize(ai, 33), 15);
sum_real := resize(aligned_real, 34)
+ resize(twiddle_real, 34);
sum_imag := resize(aligned_imag, 34)
+ resize(twiddle_imag, 34);
difference_real := resize(aligned_real, 34)
- resize(twiddle_real, 34);
difference_imag := resize(aligned_imag, 34)
- resize(twiddle_imag, 34);
if ctor_stageshiftmask(stage_index) = '1' then
selected_shift := 1;
else
selected_shift := 0;
end if;
result_a_real := quantize_q15(sum_real, selected_shift);
result_a_imag := quantize_q15(sum_imag, selected_shift);
result_b_real := quantize_q15(difference_real, selected_shift);
result_b_imag := quantize_q15(difference_imag, selected_shift);
sample_memory(address_a) <= pack_complex(
result_a_real, result_a_imag);
sample_memory(address_b) <= pack_complex(
result_b_real, result_b_imag);
if position + 1 < half_size then
position <= position + 1;
twiddle_index <= twiddle_index + twiddle_stride;
phase <= compute_read;
elsif group_base + group_size < SAMPLES then
group_base <= group_base + group_size;
position <= 0;
twiddle_index <= 0;
phase <= compute_read;
elsif stage_index + 1 < STAGES then
stage_index <= stage_index + 1;
group_base <= 0;
group_size <= group_size * 2;
half_size <= half_size * 2;
position <= 0;
twiddle_stride <= twiddle_stride / 2;
twiddle_index <= 0;
phase <= compute_read;
else
emit_index <= 0;
phase <= emit_read;
end if;
when emit_read =>
if ctor_outputbitreversed then
memory_address := reverse_bits(emit_index, STAGES);
else
memory_address := emit_index;
end if;
output_word <= sample_memory(memory_address);
phase <= emit_hold;
when emit_hold =>
if ctor_outputready then
if emit_index = SAMPLES - 1 then
emit_index <= 0;
phase <= load_frame;
else
emit_index <= emit_index + 1;
phase <= emit_read;
end if;
end if;
end case;
end if;
end if;
end process;
end;