1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- #!/usr/bin/env python3
- import argparse
- OVERHEAD = 5 # Guesstimated
- class PanelConfig(object):
- def __init__(self, **kwargs):
- params = [
- 'freq', # Clock frequency in Hz
- 'n_banks', # Number of banks
- 'n_rows', # Number of rows
- 'n_cols', # Number of columns
- 'n_planes', # Number of bitplanes in BCM modulation
- 'bcm_lsb_len', # Duration of the LSB of BCM modulation (in clk cycles)
- ]
- for x in params:
- setattr(self, x, kwargs.pop(x))
- self._sim()
- def _sim(self):
- # Init
- cyc_tot = 0
- cyc_on = 0
- # Scan all place
- for plane in range(self.n_planes):
- # Length of the plane in clock cycle
- len_show = self.bcm_lsb_len << plane
- # Length required to do data shift for the next plane
- len_shift = self.n_cols
- # Length of this cycle is the max
- len_plane = max(len_show, len_shift) + OVERHEAD
- # Accumulate
- cyc_tot += len_plane
- cyc_on += len_show
- # Compute results
- self._light_efficiency = 1.0 * cyc_on / cyc_tot
- self._refresh_rate = self.freq / (self.n_rows * cyc_tot)
- @property
- def light_efficiency(self):
- return self._light_efficiency
- @property
- def refresh_rate(self):
- return self._refresh_rate
- def main():
- # Parse options
- parser = argparse.ArgumentParser()
- parser.add_argument('--freq', type=float, help='Clock frequency in Hz', default=30e6)
- parser.add_argument('--n_banks', type=int, required=True, metavar='N', help='Number of banks')
- parser.add_argument('--n_rows', type=int, required=True, metavar='N', help='Number of rows')
- parser.add_argument('--n_cols', type=int, required=True, metavar='N', help='Number of columns')
- parser.add_argument('--n_planes', type=int, required=True, metavar='N', help='Number of bitplanes in BCM modulation')
- parser.add_argument('--bcm_min_len',type=int, metavar='CYCLES', help='Min duration of the LSB of BCM modulation (in clk cycles, default=1)', default=1)
- parser.add_argument('--bcm_max_len',type=int, metavar='CYCLES', help='Max duration of the LSB of BCM modulation (in clk cycles, default=20)', default=20)
- args = parser.parse_args()
- # Scan various bcm_lsb_len
- print("bcm_lsb_len\tlight_efficiency\trefresh_rate")
- for i in range(args.bcm_min_len, args.bcm_max_len+1):
- pc = PanelConfig(
- freq = args.freq,
- n_banks = args.n_banks,
- n_rows = args.n_rows,
- n_cols = args.n_cols,
- n_planes = args.n_planes,
- bcm_lsb_len = i,
- )
- print("%2d\t\t%4.1f\t\t\t%5.1f" % (
- i,
- pc.light_efficiency * 100.0,
- pc.refresh_rate
- ))
- if __name__ == '__main__':
- main()
|