| #!/usr/bin/python3 |
| |
| import re |
| import os |
| |
| X=0 |
| Y=1 |
| |
| # We place a 40um halo around the macros, so if we place the macros 40um |
| # in from the edges we will allow some space for routing external I/Os on |
| # the periphery while still preventing any standard cells from being laid |
| # down |
| horizontal_margin = 40 |
| vertical_margin = 40 |
| |
| horizontal_placement = 0.46 |
| vertical_placement = 2.72 |
| |
| # Wrapper size |
| die_size = (2920, 3520) |
| |
| r = re.compile('SIZE\s+([0-9\.]+) BY ([0-9\.]+) ;') |
| |
| def get_macro_size(name): |
| lef_file = os.path.dirname(os.path.abspath(__file__)) + '/../../../lef/' + name + '.lef' |
| with open(lef_file) as f: |
| for line in f: |
| m = r.search(line) |
| if m: |
| lx = float(m.group(1)) |
| ly = float(m.group(2)) |
| return (lx, ly) |
| |
| def align(size, align_val): |
| multiple = int((size+align_val)/align_val) |
| return multiple*align_val |
| |
| def align_down(size, align_val): |
| multiple = int(size/align_val) |
| return multiple*align_val |
| |
| def align_h(size): |
| return align(size, horizontal_placement) |
| |
| def align_v(size): |
| return align(size, vertical_placement) |
| |
| def align_h_down(size): |
| return align_down(size, horizontal_placement) |
| |
| def align_v_down(size): |
| return align_down(size, vertical_placement) |
| |
| # Macro sizes |
| ram512 = get_macro_size('RAM512') |
| ram32_1rw1r = get_macro_size('RAM32_1RW1R') |
| multiply_add_64x64 = get_macro_size('multiply_add_64x64') |
| microwatt_fp_dffrfile = get_macro_size('Microwatt_FP_DFFRFile') |
| |
| # Macro layout |
| |
| # RAM at top |
| ram_l = (align_h((die_size[X]-ram512[X])/2), align_v_down(die_size[Y]-ram512[Y]-vertical_margin)) |
| |
| # cache RAMs at bottom - need a bigger margin because there are a lot of wires |
| icache_ram_1_l = (align_h(horizontal_margin), align_v(vertical_margin)) |
| dcache_ram_1_l = (align_h_down(die_size[X]-ram32_1rw1r[X]-horizontal_margin), align_v(vertical_margin)) |
| |
| cache_end_y = icache_ram_1_l[Y]+ram32_1rw1r[Y] |
| middle_y = (ram_l[Y]-cache_end_y)/2 + cache_end_y |
| |
| # Multipliers and regfile in middle |
| multiplier_l = (align_h(horizontal_margin), align_v(cache_end_y + 300)) |
| multiplier_fpu_l = (align_h(horizontal_margin), align_v(ram_l[Y]-multiply_add_64x64[Y]-300)) |
| regfile_l = (align_h_down(die_size[X]-microwatt_fp_dffrfile[X]-horizontal_margin), align_v(middle_y - microwatt_fp_dffrfile[Y]/2)) |
| |
| print('microwatt_0.soc0.bram.bram0.ram_0.memory_0 %8.3f %8.3f N' % ram_l) |
| print('microwatt_0.soc0.processor.dcache_0.rams:1.way.cache_ram_0 %8.3f %8.3f N' % icache_ram_1_l) |
| print('microwatt_0.soc0.processor.icache_0.rams:1.way.cache_ram_0 %8.3f %8.3f N' % dcache_ram_1_l) |
| print('microwatt_0.soc0.processor.execute1_0.multiply_0.multiplier %8.3f %8.3f N' % multiplier_l) |
| print('microwatt_0.soc0.processor.with_fpu.fpu_0.fpu_multiply_0.multiplier %8.3f %8.3f N' % multiplier_fpu_l) |
| print('microwatt_0.soc0.processor.register_file_0.register_file_0 %8.3f %8.3f N' % regfile_l) |