23#include "resid-config.h"
498 enum { value = summer_offset<i - 1>::value + ((2 + i - 1) << 16) };
502struct summer_offset<0>
511 enum { value = mixer_offset<i - 1>::value + ((i - 1) << 16) };
515struct mixer_offset<1>
521struct mixer_offset<0>
532 void enable_filter(
bool enable);
533 void adjust_filter_bias(
double dac_bias);
534 void set_chip_model(chip_model model);
535 void set_voice_mask(reg4 mask);
537 void clock(
int voice1,
int voice2,
int voice3);
538 void clock(cycle_count delta_t,
int voice1,
int voice2,
int voice3);
542 void writeFC_LO(reg8);
543 void writeFC_HI(reg8);
544 void writeRES_FILT(reg8);
545 void writeMODE_VOL(reg8);
548 void input(
short sample);
596 chip_model sid_model;
615 unsigned short opamp_rev[1 << 16];
617 unsigned short summer[summer_offset<5>::value];
618 unsigned short gain[16][1 << 16];
619 unsigned short resonance[16][1 << 16];
620 unsigned short mixer[mixer_offset<8>::value];
622 unsigned short f0_dac[1 << 11];
627 int Vddt_Vw_2, Vw_bias;
640 int solve_gain_d(opamp_t* opamp,
double n,
int vi_t,
int& x, model_filter_t& mf);
641 int solve_integrate_6581(
int dt,
int vi_t,
int& x,
int& vc, model_filter_t& mf);
642 int solve_integrate_8580(
int dt,
int vi_t,
int& x,
int& vc, model_filter_t& mf);
645 static unsigned short vcr_kVg[1 << 16];
646 static unsigned short vcr_n_Ids_term[1 << 16];
648 static model_filter_t model_filter[2];
660#if RESID_INLINING || defined(RESID_FILTER_CC)
666void Filter::clock(
int voice1,
int voice2,
int voice3)
668 model_filter_t& f = model_filter[sid_model];
670 v1 = (voice1*f.voice_scale_s14 >> 18) + f.voice_DC;
671 v2 = (voice2*f.voice_scale_s14 >> 18) + f.voice_DC;
672 v3 = (voice3*f.voice_scale_s14 >> 18) + f.voice_DC;
681 offset = summer_offset<0>::value;
685 offset = summer_offset<1>::value;
689 offset = summer_offset<1>::value;
693 offset = summer_offset<2>::value;
697 offset = summer_offset<1>::value;
701 offset = summer_offset<2>::value;
705 offset = summer_offset<2>::value;
709 offset = summer_offset<3>::value;
713 offset = summer_offset<1>::value;
717 offset = summer_offset<2>::value;
721 offset = summer_offset<2>::value;
725 offset = summer_offset<3>::value;
729 offset = summer_offset<2>::value;
733 offset = summer_offset<3>::value;
737 offset = summer_offset<3>::value;
740 Vi = ve + v3 + v2 + v1;
741 offset = summer_offset<4>::value;
746 if (sid_model == 0) {
748 Vlp = solve_integrate_6581(1, Vbp, Vlp_x, Vlp_vc, f);
749 Vbp = solve_integrate_6581(1, Vhp, Vbp_x, Vbp_vc, f);
753 Vlp = solve_integrate_8580(1, Vbp, Vlp_x, Vlp_vc, f);
754 Vbp = solve_integrate_8580(1, Vhp, Vbp_x, Vbp_vc, f);
757 assert((Vbp >= 0) && (Vbp < (1 << 16)));
758 const int idx = offset + f.resonance[res][Vbp] + Vlp + Vi;
759 assert((idx >= 0) && (idx < summer_offset<5>::value));
767void Filter::clock(cycle_count delta_t,
int voice1,
int voice2,
int voice3)
769 model_filter_t& f = model_filter[sid_model];
771 v1 = (voice1*f.voice_scale_s14 >> 18) + f.voice_DC;
772 v2 = (voice2*f.voice_scale_s14 >> 18) + f.voice_DC;
773 v3 = (voice3*f.voice_scale_s14 >> 18) + f.voice_DC;
779 if (unlikely(!enabled)) {
790 offset = summer_offset<0>::value;
794 offset = summer_offset<1>::value;
798 offset = summer_offset<1>::value;
802 offset = summer_offset<2>::value;
806 offset = summer_offset<1>::value;
810 offset = summer_offset<2>::value;
814 offset = summer_offset<2>::value;
818 offset = summer_offset<3>::value;
822 offset = summer_offset<1>::value;
826 offset = summer_offset<2>::value;
830 offset = summer_offset<2>::value;
834 offset = summer_offset<3>::value;
838 offset = summer_offset<2>::value;
842 offset = summer_offset<3>::value;
846 offset = summer_offset<3>::value;
849 Vi = ve + v3 + v2 + v1;
850 offset = summer_offset<4>::value;
856 cycle_count delta_t_flt = 3;
858 if (sid_model == 0) {
861 if (unlikely(delta_t < delta_t_flt)) {
862 delta_t_flt = delta_t;
866 Vlp = solve_integrate_6581(delta_t_flt, Vbp, Vlp_x, Vlp_vc, f);
867 Vbp = solve_integrate_6581(delta_t_flt, Vhp, Vbp_x, Vbp_vc, f);
868 assert((Vbp >= 0) && (Vbp < (1 << 16)));
869 const int idx = offset + f.resonance[res][Vbp] + Vlp + Vi;
870 assert((idx >= 0) && (idx < summer_offset<5>::value));
873 delta_t -= delta_t_flt;
879 if (unlikely(delta_t < delta_t_flt)) {
880 delta_t_flt = delta_t;
884 Vlp = solve_integrate_8580(delta_t_flt, Vbp, Vlp_x, Vlp_vc, f);
885 Vbp = solve_integrate_8580(delta_t_flt, Vhp, Vbp_x, Vbp_vc, f);
886 assert((Vbp >= 0) && (Vbp < (1 << 16)));
887 const int idx = offset + f.resonance[res][Vbp] + Vlp + Vi;
888 assert((idx >= 0) && (idx < summer_offset<5>::value));
891 delta_t -= delta_t_flt;
901void Filter::input(
short sample)
912 model_filter_t& f = model_filter[sid_model];
913 ve = (sample*f.voice_scale_s14*3 >> 14) + f.mixer[0];
921short Filter::output()
923 model_filter_t& f = model_filter[sid_model];
960 switch (mix & 0x7f) {
963 offset = mixer_offset<0>::value;
967 offset = mixer_offset<1>::value;
971 offset = mixer_offset<1>::value;
975 offset = mixer_offset<2>::value;
979 offset = mixer_offset<1>::value;
983 offset = mixer_offset<2>::value;
987 offset = mixer_offset<2>::value;
991 offset = mixer_offset<3>::value;
995 offset = mixer_offset<1>::value;
999 offset = mixer_offset<2>::value;
1003 offset = mixer_offset<2>::value;
1007 offset = mixer_offset<3>::value;
1011 offset = mixer_offset<2>::value;
1015 offset = mixer_offset<3>::value;
1019 offset = mixer_offset<3>::value;
1022 Vi = ve + v3 + v2 + v1;
1023 offset = mixer_offset<4>::value;
1026 Vi = (((Vlp) * f.filterGain) >> 12);
1027 offset = mixer_offset<1>::value;
1030 Vi = (((Vlp) * f.filterGain) >> 12) + v1;
1031 offset = mixer_offset<2>::value;
1034 Vi = (((Vlp) * f.filterGain) >> 12) + v2;
1035 offset = mixer_offset<2>::value;
1038 Vi = (((Vlp) * f.filterGain) >> 12) + v2 + v1;
1039 offset = mixer_offset<3>::value;
1042 Vi = (((Vlp) * f.filterGain) >> 12) + v3;
1043 offset = mixer_offset<2>::value;
1046 Vi = (((Vlp) * f.filterGain) >> 12) + v3 + v1;
1047 offset = mixer_offset<3>::value;
1050 Vi = (((Vlp) * f.filterGain) >> 12) + v3 + v2;
1051 offset = mixer_offset<3>::value;
1054 Vi = (((Vlp) * f.filterGain) >> 12) + v3 + v2 + v1;
1055 offset = mixer_offset<4>::value;
1058 Vi = (((Vlp) * f.filterGain) >> 12) + ve;
1059 offset = mixer_offset<2>::value;
1062 Vi = (((Vlp) * f.filterGain) >> 12) + ve + v1;
1063 offset = mixer_offset<3>::value;
1066 Vi = (((Vlp) * f.filterGain) >> 12) + ve + v2;
1067 offset = mixer_offset<3>::value;
1070 Vi = (((Vlp) * f.filterGain) >> 12) + ve + v2 + v1;
1071 offset = mixer_offset<4>::value;
1074 Vi = (((Vlp) * f.filterGain) >> 12) + ve + v3;
1075 offset = mixer_offset<3>::value;
1078 Vi = (((Vlp) * f.filterGain) >> 12) + ve + v3 + v1;
1079 offset = mixer_offset<4>::value;
1082 Vi = (((Vlp) * f.filterGain) >> 12) + ve + v3 + v2;
1083 offset = mixer_offset<4>::value;
1086 Vi = (((Vlp) * f.filterGain) >> 12) + ve + v3 + v2 + v1;
1087 offset = mixer_offset<5>::value;
1090 Vi = (((Vbp) * f.filterGain) >> 12);
1091 offset = mixer_offset<1>::value;
1094 Vi = (((Vbp) * f.filterGain) >> 12) + v1;
1095 offset = mixer_offset<2>::value;
1098 Vi = (((Vbp) * f.filterGain) >> 12) + v2;
1099 offset = mixer_offset<2>::value;
1102 Vi = (((Vbp) * f.filterGain) >> 12) + v2 + v1;
1103 offset = mixer_offset<3>::value;
1106 Vi = (((Vbp) * f.filterGain) >> 12) + v3;
1107 offset = mixer_offset<2>::value;
1110 Vi = (((Vbp) * f.filterGain) >> 12) + v3 + v1;
1111 offset = mixer_offset<3>::value;
1114 Vi = (((Vbp) * f.filterGain) >> 12) + v3 + v2;
1115 offset = mixer_offset<3>::value;
1118 Vi = (((Vbp) * f.filterGain) >> 12) + v3 + v2 + v1;
1119 offset = mixer_offset<4>::value;
1122 Vi = (((Vbp) * f.filterGain) >> 12) + ve;
1123 offset = mixer_offset<2>::value;
1126 Vi = (((Vbp) * f.filterGain) >> 12) + ve + v1;
1127 offset = mixer_offset<3>::value;
1130 Vi = (((Vbp) * f.filterGain) >> 12) + ve + v2;
1131 offset = mixer_offset<3>::value;
1134 Vi = (((Vbp) * f.filterGain) >> 12) + ve + v2 + v1;
1135 offset = mixer_offset<4>::value;
1138 Vi = (((Vbp) * f.filterGain) >> 12) + ve + v3;
1139 offset = mixer_offset<3>::value;
1142 Vi = (((Vbp) * f.filterGain) >> 12) + ve + v3 + v1;
1143 offset = mixer_offset<4>::value;
1146 Vi = (((Vbp) * f.filterGain) >> 12) + ve + v3 + v2;
1147 offset = mixer_offset<4>::value;
1150 Vi = (((Vbp) * f.filterGain) >> 12) + ve + v3 + v2 + v1;
1151 offset = mixer_offset<5>::value;
1154 Vi = (((Vbp + Vlp) * f.filterGain) >> 12);
1155 offset = mixer_offset<2>::value;
1158 Vi = (((Vbp + Vlp) * f.filterGain) >> 12) + v1;
1159 offset = mixer_offset<3>::value;
1162 Vi = (((Vbp + Vlp) * f.filterGain) >> 12) + v2;
1163 offset = mixer_offset<3>::value;
1166 Vi = (((Vbp + Vlp) * f.filterGain) >> 12) + v2 + v1;
1167 offset = mixer_offset<4>::value;
1170 Vi = (((Vbp + Vlp) * f.filterGain) >> 12) + v3;
1171 offset = mixer_offset<3>::value;
1174 Vi = (((Vbp + Vlp) * f.filterGain) >> 12) + v3 + v1;
1175 offset = mixer_offset<4>::value;
1178 Vi = (((Vbp + Vlp) * f.filterGain) >> 12) + v3 + v2;
1179 offset = mixer_offset<4>::value;
1182 Vi = (((Vbp + Vlp) * f.filterGain) >> 12) + v3 + v2 + v1;
1183 offset = mixer_offset<5>::value;
1186 Vi = (((Vbp + Vlp) * f.filterGain) >> 12) + ve;
1187 offset = mixer_offset<3>::value;
1190 Vi = (((Vbp + Vlp) * f.filterGain) >> 12) + ve + v1;
1191 offset = mixer_offset<4>::value;
1194 Vi = (((Vbp + Vlp) * f.filterGain) >> 12) + ve + v2;
1195 offset = mixer_offset<4>::value;
1198 Vi = (((Vbp + Vlp) * f.filterGain) >> 12) + ve + v2 + v1;
1199 offset = mixer_offset<5>::value;
1202 Vi = (((Vbp + Vlp) * f.filterGain) >> 12) + ve + v3;
1203 offset = mixer_offset<4>::value;
1206 Vi = (((Vbp + Vlp) * f.filterGain) >> 12) + ve + v3 + v1;
1207 offset = mixer_offset<5>::value;
1210 Vi = (((Vbp + Vlp) * f.filterGain) >> 12) + ve + v3 + v2;
1211 offset = mixer_offset<5>::value;
1214 Vi = (((Vbp + Vlp) * f.filterGain) >> 12) + ve + v3 + v2 + v1;
1215 offset = mixer_offset<6>::value;
1218 Vi = (((Vhp) * f.filterGain) >> 12);
1219 offset = mixer_offset<1>::value;
1222 Vi = (((Vhp) * f.filterGain) >> 12) + v1;
1223 offset = mixer_offset<2>::value;
1226 Vi = (((Vhp) * f.filterGain) >> 12) + v2;
1227 offset = mixer_offset<2>::value;
1230 Vi = (((Vhp) * f.filterGain) >> 12) + v2 + v1;
1231 offset = mixer_offset<3>::value;
1234 Vi = (((Vhp) * f.filterGain) >> 12) + v3;
1235 offset = mixer_offset<2>::value;
1238 Vi = (((Vhp) * f.filterGain) >> 12) + v3 + v1;
1239 offset = mixer_offset<3>::value;
1242 Vi = (((Vhp) * f.filterGain) >> 12) + v3 + v2;
1243 offset = mixer_offset<3>::value;
1246 Vi = (((Vhp) * f.filterGain) >> 12) + v3 + v2 + v1;
1247 offset = mixer_offset<4>::value;
1250 Vi = (((Vhp) * f.filterGain) >> 12) + ve;
1251 offset = mixer_offset<2>::value;
1254 Vi = (((Vhp) * f.filterGain) >> 12) + ve + v1;
1255 offset = mixer_offset<3>::value;
1258 Vi = (((Vhp) * f.filterGain) >> 12) + ve + v2;
1259 offset = mixer_offset<3>::value;
1262 Vi = (((Vhp) * f.filterGain) >> 12) + ve + v2 + v1;
1263 offset = mixer_offset<4>::value;
1266 Vi = (((Vhp) * f.filterGain) >> 12) + ve + v3;
1267 offset = mixer_offset<3>::value;
1270 Vi = (((Vhp) * f.filterGain) >> 12) + ve + v3 + v1;
1271 offset = mixer_offset<4>::value;
1274 Vi = (((Vhp) * f.filterGain) >> 12) + ve + v3 + v2;
1275 offset = mixer_offset<4>::value;
1278 Vi = (((Vhp) * f.filterGain) >> 12) + ve + v3 + v2 + v1;
1279 offset = mixer_offset<5>::value;
1282 Vi = (((Vhp + Vlp) * f.filterGain) >> 12);
1283 offset = mixer_offset<2>::value;
1286 Vi = (((Vhp + Vlp) * f.filterGain) >> 12) + v1;
1287 offset = mixer_offset<3>::value;
1290 Vi = (((Vhp + Vlp) * f.filterGain) >> 12) + v2;
1291 offset = mixer_offset<3>::value;
1294 Vi = (((Vhp + Vlp) * f.filterGain) >> 12) + v2 + v1;
1295 offset = mixer_offset<4>::value;
1298 Vi = (((Vhp + Vlp) * f.filterGain) >> 12) + v3;
1299 offset = mixer_offset<3>::value;
1302 Vi = (((Vhp + Vlp) * f.filterGain) >> 12) + v3 + v1;
1303 offset = mixer_offset<4>::value;
1306 Vi = (((Vhp + Vlp) * f.filterGain) >> 12) + v3 + v2;
1307 offset = mixer_offset<4>::value;
1310 Vi = (((Vhp + Vlp) * f.filterGain) >> 12) + v3 + v2 + v1;
1311 offset = mixer_offset<5>::value;
1314 Vi = (((Vhp + Vlp) * f.filterGain) >> 12) + ve;
1315 offset = mixer_offset<3>::value;
1318 Vi = (((Vhp + Vlp) * f.filterGain) >> 12) + ve + v1;
1319 offset = mixer_offset<4>::value;
1322 Vi = (((Vhp + Vlp) * f.filterGain) >> 12) + ve + v2;
1323 offset = mixer_offset<4>::value;
1326 Vi = (((Vhp + Vlp) * f.filterGain) >> 12) + ve + v2 + v1;
1327 offset = mixer_offset<5>::value;
1330 Vi = (((Vhp + Vlp) * f.filterGain) >> 12) + ve + v3;
1331 offset = mixer_offset<4>::value;
1334 Vi = (((Vhp + Vlp) * f.filterGain) >> 12) + ve + v3 + v1;
1335 offset = mixer_offset<5>::value;
1338 Vi = (((Vhp + Vlp) * f.filterGain) >> 12) + ve + v3 + v2;
1339 offset = mixer_offset<5>::value;
1342 Vi = (((Vhp + Vlp) * f.filterGain) >> 12) + ve + v3 + v2 + v1;
1343 offset = mixer_offset<6>::value;
1346 Vi = (((Vhp + Vbp) * f.filterGain) >> 12);
1347 offset = mixer_offset<2>::value;
1350 Vi = (((Vhp + Vbp) * f.filterGain) >> 12) + v1;
1351 offset = mixer_offset<3>::value;
1354 Vi = (((Vhp + Vbp) * f.filterGain) >> 12) + v2;
1355 offset = mixer_offset<3>::value;
1358 Vi = (((Vhp + Vbp) * f.filterGain) >> 12) + v2 + v1;
1359 offset = mixer_offset<4>::value;
1362 Vi = (((Vhp + Vbp) * f.filterGain) >> 12) + v3;
1363 offset = mixer_offset<3>::value;
1366 Vi = (((Vhp + Vbp) * f.filterGain) >> 12) + v3 + v1;
1367 offset = mixer_offset<4>::value;
1370 Vi = (((Vhp + Vbp) * f.filterGain) >> 12) + v3 + v2;
1371 offset = mixer_offset<4>::value;
1374 Vi = (((Vhp + Vbp) * f.filterGain) >> 12) + v3 + v2 + v1;
1375 offset = mixer_offset<5>::value;
1378 Vi = (((Vhp + Vbp) * f.filterGain) >> 12) + ve;
1379 offset = mixer_offset<3>::value;
1382 Vi = (((Vhp + Vbp) * f.filterGain) >> 12) + ve + v1;
1383 offset = mixer_offset<4>::value;
1386 Vi = (((Vhp + Vbp) * f.filterGain) >> 12) + ve + v2;
1387 offset = mixer_offset<4>::value;
1390 Vi = (((Vhp + Vbp) * f.filterGain) >> 12) + ve + v2 + v1;
1391 offset = mixer_offset<5>::value;
1394 Vi = (((Vhp + Vbp) * f.filterGain) >> 12) + ve + v3;
1395 offset = mixer_offset<4>::value;
1398 Vi = (((Vhp + Vbp) * f.filterGain) >> 12) + ve + v3 + v1;
1399 offset = mixer_offset<5>::value;
1402 Vi = (((Vhp + Vbp) * f.filterGain) >> 12) + ve + v3 + v2;
1403 offset = mixer_offset<5>::value;
1406 Vi = (((Vhp + Vbp) * f.filterGain) >> 12) + ve + v3 + v2 + v1;
1407 offset = mixer_offset<6>::value;
1410 Vi = (((Vhp + Vbp + Vlp) * f.filterGain) >> 12);
1411 offset = mixer_offset<3>::value;
1414 Vi = (((Vhp + Vbp + Vlp) * f.filterGain) >> 12) + v1;
1415 offset = mixer_offset<4>::value;
1418 Vi = (((Vhp + Vbp + Vlp) * f.filterGain) >> 12) + v2;
1419 offset = mixer_offset<4>::value;
1422 Vi = (((Vhp + Vbp + Vlp) * f.filterGain) >> 12) + v2 + v1;
1423 offset = mixer_offset<5>::value;
1426 Vi = (((Vhp + Vbp + Vlp) * f.filterGain) >> 12) + v3;
1427 offset = mixer_offset<4>::value;
1430 Vi = (((Vhp + Vbp + Vlp) * f.filterGain) >> 12) + v3 + v1;
1431 offset = mixer_offset<5>::value;
1434 Vi = (((Vhp + Vbp + Vlp) * f.filterGain) >> 12) + v3 + v2;
1435 offset = mixer_offset<5>::value;
1438 Vi = (((Vhp + Vbp + Vlp) * f.filterGain) >> 12) + v3 + v2 + v1;
1439 offset = mixer_offset<6>::value;
1442 Vi = (((Vhp + Vbp + Vlp) * f.filterGain) >> 12) + ve;
1443 offset = mixer_offset<4>::value;
1446 Vi = (((Vhp + Vbp + Vlp) * f.filterGain) >> 12) + ve + v1;
1447 offset = mixer_offset<5>::value;
1450 Vi = (((Vhp + Vbp + Vlp) * f.filterGain) >> 12) + ve + v2;
1451 offset = mixer_offset<5>::value;
1454 Vi = (((Vhp + Vbp + Vlp) * f.filterGain) >> 12) + ve + v2 + v1;
1455 offset = mixer_offset<6>::value;
1458 Vi = (((Vhp + Vbp + Vlp) * f.filterGain) >> 12) + ve + v3;
1459 offset = mixer_offset<5>::value;
1462 Vi = (((Vhp + Vbp + Vlp) * f.filterGain) >> 12) + ve + v3 + v1;
1463 offset = mixer_offset<6>::value;
1466 Vi = (((Vhp + Vbp + Vlp) * f.filterGain) >> 12) + ve + v3 + v2;
1467 offset = mixer_offset<6>::value;
1470 Vi = (((Vhp + Vbp + Vlp) * f.filterGain) >> 12) + ve + v3 + v2 + v1;
1471 offset = mixer_offset<7>::value;
1476 const int idx1 = offset + Vi;
1477 assert((idx1 >= 0) && (idx1 < mixer_offset<8>::value));
1478 const int idx2 = f.mixer[idx1];
1479 assert((idx2 >= 0) && (idx2 < (1 << 16)));
1480 return (
short)(f.gain[vol][idx2] - (1 << 15));
1538int Filter::solve_gain(opamp_t* opamp,
int n,
int vi,
int& x, model_filter_t& mf)
1547 int ak = mf.ak, bk = mf.bk;
1549 int a = n + (1 << 7);
1552 if (b_vi < 0) b_vi = 0;
1553 int c = n*int(
unsigned(b_vi)*
unsigned(b_vi) >> 12);
1559 int vx = opamp[x].vx;
1560 int dvx = opamp[x].dvx;
1565 int vo = vx + (x << 1) - (1 << 16);
1566 if (vo >= (1 << 16)) {
1573 if (b_vx < 0) b_vx = 0;
1575 if (b_vo < 0) b_vo = 0;
1577 int f = a*int(
unsigned(b_vx)*
unsigned(b_vx) >> 12) - c - int(
unsigned(b_vo)*
unsigned(b_vo) >> 5);
1579 int df = ((b_vo*(dvx + (1 << 11)) >> 1) - (a*(b_vx*dvx >> 8))) >> 14;
1587 if (unlikely(x == xk)) {
1602 if (unlikely(x <= ak) || unlikely(x >= bk)) {
1605 if (unlikely(x == ak)) {
1614int Filter::solve_gain_d(opamp_t* opamp,
double n,
int vi,
int& x, model_filter_t& mf)
1623 int ak = mf.ak, bk = mf.bk;
1627 double b_vi = b > vi ? double(b - vi) : 0.;
1628 double c = n*(b_vi*b_vi);
1634 int vx = opamp[x].vx;
1635 int dvx = opamp[x].dvx;
1640 int vo = vx + (x << 1) - (1 << 16);
1641 if (vo > (1 << 16) - 1) {
1647 double b_vx = b > vx ? double(b - vx) : 0.;
1648 double b_vo = b > vo ? double(b - vo) : 0.;
1650 double f = a*(b_vx*b_vx) - c - (b_vo*b_vo);
1652 double df = 2.*(b_vo - a*b_vx)*
double(dvx);
1659 x -= int(
double(1<<11)*f/df);
1661 if (unlikely(x == xk)) {
1676 if (unlikely(x <= ak) || unlikely(x >= bk)) {
1679 if (unlikely(x == ak)) {
1808int Filter::solve_integrate_6581(
int dt,
int vi,
int& vx,
int& vc, model_filter_t& mf)
1815 int kVddt = mf.kVddt;
1818 unsigned int Vgst = kVddt - vx;
1819 unsigned int Vgdt = kVddt - vi;
1820 unsigned int Vgdt_2 = Vgdt*Vgdt;
1823 int n_I_snake = n_snake*(int(Vgst*Vgst - Vgdt_2) >> 15);
1827 int kVg = vcr_kVg[(Vddt_Vw_2 + (Vgdt_2 >> 1)) >> 16];
1830 int Vgs = kVg - vx + (1 << 15);
1831 int Vgd = kVg - vi + (1 << 15);
1834 int n_I_vcr = int(
unsigned(vcr_n_Ids_term[Vgs] - vcr_n_Ids_term[Vgd]) << 15);
1837 vc -= (n_I_snake + n_I_vcr)*dt;
1850 const int idx = (vc >> 15) + (1 << 15);
1851 assert((idx >= 0) && (idx < (1 << 16)));
1852 vx = mf.opamp_rev[idx];
1855 return vx + (vc >> 14);
1878int Filter::solve_integrate_8580(
int dt,
int vi,
int& vx,
int& vc, model_filter_t& mf)
1886 unsigned int Vgst = nVgt - vx;
1887 unsigned int Vgdt = (vi < nVgt) ? nVgt - vi : 0;
1890 int n_I_rfc = n_dac*(int(Vgst*Vgst - Vgdt*Vgdt) >> 15);
1896 const int idx = (vc >> 15) + (1 << 15);
1897 assert((idx >= 0) && (idx < (1 << 16)));
1898 vx = mf.opamp_rev[idx];
1901 return vx + (vc >> 14);