from itertools import product
pll_inputs = [2_000_000, 4_000_000, 8_000_000, 16_000_000, 20_000_000, 25_000_000]
pllp_opts = [2, 4, 6, 8]
plln_opts = list(range(50, 432 + 1))
pllm_opts = list(range(2, 63 + 1))
pllq_opts = list(range(2, 15 + 1))
pllr_opts = list(range(2, 7 + 1))
def clocks_float(pll_input, pllp, plln, pllm, pllq, pllr):
vco_input = pll_input / pllm
vco_output = vco_input * plln
main_clock = vco_output / pllp
usb_clock = vco_output / pllq
i2s_clock = vco_output / pllr
return main_clock, usb_clock, i2s_clock
def clocks_new(pll_input, pllp, plln, pllm, pllq, pllr):
main_clock = pll_input * plln // (pllm * pllp)
usb_clock = pll_input * plln // (pllm * pllq)
i2s_clock = pll_input * plln // (pllm * pllr)
return main_clock, usb_clock, i2s_clock
for pll_input, pllp, plln, pllm, pllq, pllr in product(pll_inputs, pllp_opts, plln_opts, pllm_opts, pllq_opts, pllr_opts):
cfloat = clocks_float(pll_input, pllp, plln, pllm, pllq, pllr)
cnew = clocks_new(pll_input, pllp, plln, pllm, pllq, pllr)
for correct, new in zip(cfloat, cnew):
# Without (correct - new) < 0.1 we get stiffed by floats like 1.9999999
# where the new calculation outputs 2 but int(correct) outputs 1
if not ((correct - new) < 0.1 or int(correct) == new):
print(f"deviation: {correct=} {new=}")