diff --git a/xc7/pack.cc b/xc7/pack.cc index ab76f4cb..5137757f 100644 --- a/xc7/pack.cc +++ b/xc7/pack.cc @@ -640,24 +640,221 @@ static void pack_special(Context *ctx) ci->params.emplace(ctx->id("S1INV"), "S1"); ci->params.emplace(ctx->id("IGNORE1INV"), "IGNORE1"); } else if (ci->type == id_MMCME2_ADV) { + ci->params.emplace(ctx->id("BANDWIDTH"), "OPTIMIZED"); + ci->params.emplace(ctx->id("CLKBURST_ENABLE"), "FALSE"); + ci->params.emplace(ctx->id("CLKBURST_REPEAT"), "FALSE"); + ci->params.emplace(ctx->id("CLKFBIN_EDGE"), "FALSE"); + ci->params.emplace(ctx->id("CLKFBIN_NOCOUNT"), "TRUE"); + ci->params.emplace(ctx->id("CLKFBOUT_EDGE"), "FALSE"); + ci->params.emplace(ctx->id("CLKFBOUT_EN"), "TRUE"); + ci->params.emplace(ctx->id("CLKFBOUT_FRAC_EN"), "FALSE"); + ci->params.emplace(ctx->id("CLKFBOUT_FRAC_WF_FALL"), "FALSE"); + ci->params.emplace(ctx->id("CLKFBOUT_FRAC_WF_RISE"), "FALSE"); + ci->params.emplace(ctx->id("CLKFBOUT_NOCOUNT"), "TRUE"); + ci->params.emplace(ctx->id("CLKFBOUT_USE_FINE_PS"), "FALSE"); ci->params.emplace(ctx->id("CLKINSELINV"), "CLKINSEL"); + ci->params.emplace(ctx->id("CLKOUT0_EDGE"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT0_EN"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT0_FRAC_EN"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT0_FRAC_WF_FALL"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT0_FRAC_WF_RISE"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT0_NOCOUNT"), "TRUE"); + ci->params.emplace(ctx->id("CLKOUT0_USE_FINE_PS"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT1_EDGE"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT1_EN"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT1_NOCOUNT"), "TRUE"); + ci->params.emplace(ctx->id("CLKOUT1_USE_FINE_PS"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT2_EDGE"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT2_EN"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT2_NOCOUNT"), "TRUE"); + ci->params.emplace(ctx->id("CLKOUT2_USE_FINE_PS"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT3_EDGE"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT3_EN"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT3_NOCOUNT"), "TRUE"); + ci->params.emplace(ctx->id("CLKOUT3_USE_FINE_PS"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT4_CASCADE"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT4_EDGE"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT4_EN"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT4_NOCOUNT"), "TRUE"); + ci->params.emplace(ctx->id("CLKOUT4_USE_FINE_PS"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT5_EDGE"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT5_EN"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT5_NOCOUNT"), "TRUE"); + ci->params.emplace(ctx->id("CLKOUT5_USE_FINE_PS"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT6_EDGE"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT6_EN"), "FALSE"); + ci->params.emplace(ctx->id("CLKOUT6_NOCOUNT"), "TRUE"); + ci->params.emplace(ctx->id("CLKOUT6_USE_FINE_PS"), "FALSE"); + ci->params.emplace(ctx->id("COMPENSATION"), "INTERNAL"); + ci->params.emplace(ctx->id("DIRECT_PATH_CNTRL"), "FALSE"); + ci->params.emplace(ctx->id("DIVCLK_EDGE"), "FALSE"); + ci->params.emplace(ctx->id("DIVCLK_NOCOUNT"), "TRUE"); + ci->params.emplace(ctx->id("EN_VCO_DIV1"), "FALSE"); + ci->params.emplace(ctx->id("EN_VCO_DIV6"), "FALSE"); + ci->params.emplace(ctx->id("GTS_WAIT"), "FALSE"); + ci->params.emplace(ctx->id("HVLF_CNT_TEST_EN"), "FALSE"); + ci->params.emplace(ctx->id("INTERP_TEST"), "FALSE"); + ci->params.emplace(ctx->id("IN_DLY_EN"), "TRUE"); + ci->params.emplace(ctx->id("LF_LOW_SEL"), "FALSE"); + ci->params.emplace(ctx->id("MMCM_EN"), "TRUE"); + ci->params.emplace(ctx->id("PERF0_USE_CLK"), "FALSE"); + ci->params.emplace(ctx->id("PERF1_USE_CLK"), "FALSE"); + ci->params.emplace(ctx->id("PERF2_USE_CLK"), "FALSE"); + ci->params.emplace(ctx->id("PERF3_USE_CLK"), "FALSE"); ci->params.emplace(ctx->id("PSENINV"), "PSEN"); ci->params.emplace(ctx->id("PSINCDECINV"), "PSINCDEC"); ci->params.emplace(ctx->id("PWRDWNINV"), "PWRDWN"); ci->params.emplace(ctx->id("RSTINV"), "RST"); + ci->params.emplace(ctx->id("SEL_HV_NMOS"), "FALSE"); + ci->params.emplace(ctx->id("SEL_LV_NMOS"), "FALSE"); + ci->params.emplace(ctx->id("SEL_SLIPD"), "FALSE"); + ci->params.emplace(ctx->id("SS_EN"), "FALSE"); + ci->params.emplace(ctx->id("SS_MODE"), "CENTER_HIGH"); + ci->params.emplace(ctx->id("STARTUP_WAIT"), "FALSE"); + ci->params.emplace(ctx->id("SUP_SEL_AREG"), "FALSE"); + ci->params.emplace(ctx->id("SUP_SEL_DREG"), "FALSE"); + ci->params.emplace(ctx->id("TMUX_MUX_SEL"), "00"); + ci->params.emplace(ctx->id("VLF_HIGH_DIS_B"), "TRUE"); + ci->params.emplace(ctx->id("VLF_HIGH_PWDN_B"), "TRUE"); + //ci->params.emplace(ctx->id("MMCME2_ADV:mmcm_adv_inst:"); + ci->params.emplace(ctx->id("ANALOG_MISC"), "0000"); + ci->params.emplace(ctx->id("AVDD_COMP_SET"), "011"); + ci->params.emplace(ctx->id("AVDD_VBG_PD"), "110"); + ci->params.emplace(ctx->id("AVDD_VBG_SEL"), "1001"); + ci->params.emplace(ctx->id("CLKBURST_CNT"), "1"); + ci->params.emplace(ctx->id("CLKFBIN_HT"), "1"); + ci->params.emplace(ctx->id("CLKFBIN_LT"), "1"); + ci->params.emplace(ctx->id("CLKFBIN_MULT"), "1"); + ci->params.emplace(ctx->id("CLKFBOUT_DT"), "0"); + ci->params.emplace(ctx->id("CLKFBOUT_FRAC"), "0"); + ci->params.emplace(ctx->id("CLKFBOUT_HT"), "1"); + ci->params.emplace(ctx->id("CLKFBOUT_LT"), "1"); + ci->params.emplace(ctx->id("CLKFBOUT_MULT_F"), "40.5"); + ci->params.emplace(ctx->id("CLKFBOUT_MX"), "00"); + ci->params.emplace(ctx->id("CLKFBOUT_PHASE"), "0.0"); + ci->params.emplace(ctx->id("CLKFBOUT_PM_FALL"), "000"); + ci->params.emplace(ctx->id("CLKFBOUT_PM_RISE"), "000"); + ci->params.emplace(ctx->id("CLKFB_MUX_SEL"), "000"); + ci->params.emplace(ctx->id("CLKIN1_MUX_SEL"), "000"); + ci->params.emplace(ctx->id("CLKIN1_PERIOD"), "8"); + ci->params.emplace(ctx->id("CLKIN2_MUX_SEL"), "000"); ci->params.emplace(ctx->id("CLKIN2_PERIOD"), "0"); - ci->params[ctx->id("COMPENSATION")] = "INTERNAL"; - for (const auto& i : { "CLKOUT1_DIVIDE", "CLKOUT2_DIVIDE", "CLKOUT3_DIVIDE", "CLKOUT4_DIVIDE", "CLKOUT5_DIVIDE", "CLKOUT6_DIVIDE" }) { - ci->params.emplace(ctx->id(i), "1"); - } - for (const auto& i : { "CLKOUT1_PHASE", "CLKOUT2_PHASE", "CLKOUT3_PHASE", "CLKOUT4_PHASE", "CLKOUT5_PHASE", "CLKOUT6_PHASE" }) { - ci->params.emplace(ctx->id(i), "0.0"); - } - for (const auto& i : { "CLKOUT1_DUTY_CYCLE", "CLKOUT2_DUTY_CYCLE", "CLKOUT3_DUTY_CYCLE", "CLKOUT4_DUTY_CYCLE", "CLKOUT5_DUTY_CYCLE", "CLKOUT6_DUTY_CYCLE" }) { - ci->params.emplace(ctx->id(i), "0.5"); - } - ci->params.emplace(ctx->id("REF_JITTER2"), "0.5"); + ci->params.emplace(ctx->id("CLKOUT0_DIVIDE_F"), "16.875"); + ci->params.emplace(ctx->id("CLKOUT0_DT"), "0"); + ci->params.emplace(ctx->id("CLKOUT0_DUTY_CYCLE"), "0.5"); + ci->params.emplace(ctx->id("CLKOUT0_FRAC"), "0"); + ci->params.emplace(ctx->id("CLKOUT0_HT"), "1"); + ci->params.emplace(ctx->id("CLKOUT0_LT"), "1"); + ci->params.emplace(ctx->id("CLKOUT0_MX"), "00"); + ci->params.emplace(ctx->id("CLKOUT0_PHASE"), "0.0"); + ci->params.emplace(ctx->id("CLKOUT0_PM_FALL"), "000"); + ci->params.emplace(ctx->id("CLKOUT0_PM_RISE"), "000"); + ci->params.emplace(ctx->id("CLKOUT1_DIVIDE"), "1"); + ci->params.emplace(ctx->id("CLKOUT1_DT"), "0"); + ci->params.emplace(ctx->id("CLKOUT1_DUTY_CYCLE"), "0.5"); + ci->params.emplace(ctx->id("CLKOUT1_HT"), "1"); + ci->params.emplace(ctx->id("CLKOUT1_LT"), "1"); + ci->params.emplace(ctx->id("CLKOUT1_MX"), "00"); + ci->params.emplace(ctx->id("CLKOUT1_PHASE"), "0.0"); + ci->params.emplace(ctx->id("CLKOUT1_PM"), "000"); + ci->params.emplace(ctx->id("CLKOUT2_DIVIDE"), "1"); + ci->params.emplace(ctx->id("CLKOUT2_DT"), "0"); + ci->params.emplace(ctx->id("CLKOUT2_DUTY_CYCLE"), "0.5"); + ci->params.emplace(ctx->id("CLKOUT2_HT"), "1"); + ci->params.emplace(ctx->id("CLKOUT2_LT"), "1"); + ci->params.emplace(ctx->id("CLKOUT2_MX"), "00"); + ci->params.emplace(ctx->id("CLKOUT2_PHASE"), "0.0"); + ci->params.emplace(ctx->id("CLKOUT2_PM"), "000"); + ci->params.emplace(ctx->id("CLKOUT3_DIVIDE"), "1"); + ci->params.emplace(ctx->id("CLKOUT3_DT"), "0"); + ci->params.emplace(ctx->id("CLKOUT3_DUTY_CYCLE"), "0.5"); + ci->params.emplace(ctx->id("CLKOUT3_HT"), "1"); + ci->params.emplace(ctx->id("CLKOUT3_LT"), "1"); + ci->params.emplace(ctx->id("CLKOUT3_MX"), "00"); + ci->params.emplace(ctx->id("CLKOUT3_PHASE"), "0.0"); + ci->params.emplace(ctx->id("CLKOUT3_PM"), "000"); + ci->params.emplace(ctx->id("CLKOUT4_DIVIDE"), "1"); + ci->params.emplace(ctx->id("CLKOUT4_DT"), "0"); + ci->params.emplace(ctx->id("CLKOUT4_DUTY_CYCLE"), "0.5"); + ci->params.emplace(ctx->id("CLKOUT4_HT"), "1"); + ci->params.emplace(ctx->id("CLKOUT4_LT"), "1"); + ci->params.emplace(ctx->id("CLKOUT4_MX"), "00"); + ci->params.emplace(ctx->id("CLKOUT4_PHASE"), "0.0"); + ci->params.emplace(ctx->id("CLKOUT4_PM"), "000"); + ci->params.emplace(ctx->id("CLKOUT5_DIVIDE"), "1"); + ci->params.emplace(ctx->id("CLKOUT5_DT"), "0"); + ci->params.emplace(ctx->id("CLKOUT5_DUTY_CYCLE"), "0.5"); + ci->params.emplace(ctx->id("CLKOUT5_HT"), "1"); + ci->params.emplace(ctx->id("CLKOUT5_LT"), "1"); + ci->params.emplace(ctx->id("CLKOUT5_MX"), "00"); + ci->params.emplace(ctx->id("CLKOUT5_PHASE"), "0.0"); + ci->params.emplace(ctx->id("CLKOUT5_PM"), "000"); + ci->params.emplace(ctx->id("CLKOUT6_DIVIDE"), "1"); + ci->params.emplace(ctx->id("CLKOUT6_DT"), "0"); + ci->params.emplace(ctx->id("CLKOUT6_DUTY_CYCLE"), "0.5"); + ci->params.emplace(ctx->id("CLKOUT6_HT"), "1"); + ci->params.emplace(ctx->id("CLKOUT6_LT"), "1"); + ci->params.emplace(ctx->id("CLKOUT6_MX"), "00"); + ci->params.emplace(ctx->id("CLKOUT6_PHASE"), "0.0"); + ci->params.emplace(ctx->id("CLKOUT6_PM"), "000"); + ci->params.emplace(ctx->id("CONTROL_0"), "1111001101111100"); + ci->params.emplace(ctx->id("CONTROL_1"), "0111110101001101"); + ci->params.emplace(ctx->id("CONTROL_2"), "0101000001000010"); + ci->params.emplace(ctx->id("CONTROL_3"), "1110101111001000"); + ci->params.emplace(ctx->id("CONTROL_4"), "1101010011011111"); + ci->params.emplace(ctx->id("CONTROL_5"), "1010110111111011"); + ci->params.emplace(ctx->id("CONTROL_6"), "1011001011000011"); + ci->params.emplace(ctx->id("CONTROL_7"), "0100110000101110"); + ci->params.emplace(ctx->id("CP"), "0000"); + ci->params.emplace(ctx->id("CP_BIAS_TRIP_SET"), "0"); + ci->params.emplace(ctx->id("CP_RES"), "01"); + ci->params.emplace(ctx->id("DIVCLK_DIVIDE"), "5"); + ci->params.emplace(ctx->id("DIVCLK_HT"), "1"); + ci->params.emplace(ctx->id("DIVCLK_LT"), "1"); + ci->params.emplace(ctx->id("DVDD_COMP_SET"), "011"); + ci->params.emplace(ctx->id("DVDD_VBG_PD"), "110"); + ci->params.emplace(ctx->id("DVDD_VBG_SEL"), "1001"); + ci->params.emplace(ctx->id("EN_CURR_SINK"), "11"); + ci->params.emplace(ctx->id("FINE_PS_FRAC"), "0"); + ci->params.emplace(ctx->id("FREQ_BB_USE_CLK0"), "0"); + ci->params.emplace(ctx->id("FREQ_BB_USE_CLK1"), "0"); + ci->params.emplace(ctx->id("FREQ_BB_USE_CLK2"), "0"); + ci->params.emplace(ctx->id("FREQ_BB_USE_CLK3"), "0"); + ci->params.emplace(ctx->id("FREQ_COMP"), "01"); + ci->params.emplace(ctx->id("HROW_DLY_SET"), "0"); + ci->params.emplace(ctx->id("HVLF_CNT_TEST"), "0"); + ci->params.emplace(ctx->id("INTERP_EN"), "00010000"); + ci->params.emplace(ctx->id("IN_DLY_MX_CVDD"), "011000"); + ci->params.emplace(ctx->id("IN_DLY_MX_DVDD"), "000001"); + ci->params.emplace(ctx->id("IN_DLY_SET"), "38"); + ci->params.emplace(ctx->id("LFHF"), "11"); + ci->params.emplace(ctx->id("LF_NEN"), "10"); + ci->params.emplace(ctx->id("LF_PEN"), "00"); + ci->params.emplace(ctx->id("LOCK_CNT"), "128"); + ci->params.emplace(ctx->id("LOCK_FB_DLY"), "3"); + ci->params.emplace(ctx->id("LOCK_REF_DLY"), "3"); + ci->params.emplace(ctx->id("LOCK_SAT_HIGH"), "160"); + ci->params.emplace(ctx->id("MAN_LF"), "000"); + ci->params.emplace(ctx->id("MVDD_SEL"), "11"); + ci->params.emplace(ctx->id("PERF0_MUX_SEL"), "000"); + ci->params.emplace(ctx->id("PERF1_MUX_SEL"), "000"); + ci->params.emplace(ctx->id("PERF2_MUX_SEL"), "000"); + ci->params.emplace(ctx->id("PERF3_MUX_SEL"), "000"); + ci->params.emplace(ctx->id("PFD"), "0100001"); + ci->params.emplace(ctx->id("REF_JITTER1"), "0.01"); + ci->params.emplace(ctx->id("REF_JITTER2"), "0.01"); + ci->params.emplace(ctx->id("RES"), "0000"); + ci->params.emplace(ctx->id("SKEW_FLOP_INV"), "0000"); + ci->params.emplace(ctx->id("SPARE_ANALOG"), "00000"); + ci->params.emplace(ctx->id("SPARE_DIGITAL"), "00000"); ci->params.emplace(ctx->id("SS_MOD_PERIOD"), "10000"); + ci->params.emplace(ctx->id("SS_STEPS"), "011"); + ci->params.emplace(ctx->id("SS_STEPS_INIT"), "010"); + ci->params.emplace(ctx->id("SYNTH_CLK_DIV"), "11"); + ci->params.emplace(ctx->id("UNLOCK_CNT"), "64"); + ci->params.emplace(ctx->id("VREF_START"), "01"); + + ci->params[ctx->id("COMPENSATION")] = "INTERNAL"; } else if (is_sb_lfosc(ctx, ci)) { std::unique_ptr packed = create_xc7_cell(ctx, ctx->id("ICESTORM_LFOSC"), ci->name.str(ctx) + "_OSC");