/** * Create switch assembly code for to route one item from * * <pre>fire</pre> * * to the dests. * * <pre>previous</pre> * * is a hashmap from ComputeNode -> ComputeNode that maps a node to its previous hop, * * <pre>next</pre> * * is similiar... */ protected void asm( ComputeNode fire, HashMap<ComputeNode, ComputeNode> previous, HashMap<ComputeNode, HashSet> next) { assert fire != null; // System.out.println("asm: " + fire); // generate the sends if (!switchSchedules.containsKey(fire)) switchSchedules.put(fire, new StringBuffer()); StringBuffer buf = switchSchedules.get(fire); Iterator it = next.get(fire).iterator(); buf.append("route "); while (it.hasNext()) { ComputeNode dest = (ComputeNode) it.next(); buf.append("$csto->" + "$c" + rawChip.getDirection(fire, dest) + "o,"); } // erase the trailing , buf.setCharAt(buf.length() - 1, '\n'); // generate all the other Iterator<ComputeNode> tiles = next.keySet().iterator(); while (tiles.hasNext()) { ComputeNode tile = tiles.next(); assert tile != null; if (tile == fire) continue; if (!switchSchedules.containsKey(tile)) switchSchedules.put(tile, new StringBuffer()); buf = switchSchedules.get(tile); ComputeNode prevTile = previous.get(tile); buf.append("route "); Iterator nexts = next.get(tile).iterator(); while (nexts.hasNext()) { ComputeNode nextTile = (ComputeNode) nexts.next(); if (!nextTile.equals(tile)) buf.append( "$c" + rawChip.getDirection(tile, prevTile) + "i->$c" + rawChip.getDirection(tile, nextTile) + "o,"); else buf.append( "$c" + rawChip.getDirection(tile, prevTile) + "i->$c" + rawChip.getDirection(tile, nextTile) + "i,"); } buf.setCharAt(buf.length() - 1, '\n'); } }
public static void createMakefile(SpdStreamGraph sg) { streamGraph = sg; layout = sg.getLayout(); rawChip = sg.getRawChip(); try { // create a set of all the tiles with code HashSet<ComputeNode> computeTiles = new HashSet<ComputeNode>(); computeTiles.addAll(TileCode.realTiles); computeTiles.addAll(TileCode.tiles); // remove joiners from the hashset if we are in decoupled mode, // we do not want to simulate joiners if (KjcOptions.decoupled || IMEMEstimation.TESTING_IMEM) removeJoiners(computeTiles); Iterator<ComputeNode> tilesIterator = computeTiles.iterator(); // generate the bC file BCFile.generate(streamGraph, computeTiles); FileWriter fw = new FileWriter(MAKEFILE_NAME); fw.write("#-*-Makefile-*-\n\n"); /* * if (KjcOptions.outputs < 0 && ! (KjcOptions.numbers > 0)) * fw.write("LIMIT = TRUE\n"); // need to define limit for SIMCYCLES * to matter */ if (!IMEMEstimation.TESTING_IMEM && !KjcOptions.decoupled) { // old settings // fw.write("BTL-DEVICES += -dram_freq 100\n"); // turn off hardware icaching for now // fw.write("ATTRIBUTES += HWIC\n"); // add some other stuff // fw.write("MEMORY_LAYOUT=LEFT_RIGHT_SIDES\n"); // fw.write("BTL-DEVICES += -enable_all_sides_for_dram -dram // lhs\n"); // fw.write("ATTRIBUTES = IMEM_EXTRA_LARGE\n"); // fw.write("MEMORY_LAYOUT=FOUR_SIDES\n"); // fw.write("BTL-DEVICES += -dram lhs -enable_all_sides_for_dram -dram ths -dram bhs \n"); } if (KjcOptions.rawdcachesize != 32768) { fw.write("EXTRA_BTL_ARGS += -dcache_size " + KjcOptions.rawdcachesize + "\n"); } if (KjcOptions.rawicachesize != 32768) { switch (KjcOptions.rawicachesize) { case 262144: fw.write("ATTRIBUTES = IMEM_EXTRA_LARGE\n"); break; case 131072: fw.write("ATTRIBUTES = IMEM_LARGE\n"); break; case 65536: fw.write("ATTRIBUTES = IMEM_MEDIUM\n"); break; default: assert KjcOptions.rawicachesize == 16384 || KjcOptions.rawicachesize == 8192 || KjcOptions.rawicachesize == 4096 || KjcOptions.rawicachesize == 2048 || KjcOptions.rawicachesize == 1024 || KjcOptions.rawicachesize == 512 : "icache size not set correctly"; fw.write("ATTRIBUTES = IMEM_" + KjcOptions.rawicachesize + "\n"); break; } } /* //restrict memory sizes for larger tile configurations switch (rawChip.getSimulatedXSize()) { case 1: //fw.write("ATTRIBUTES = IMEM_EXTRA_LARGE\n"); fw.write("EXTRA_BTL_ARGS += -dcache_size 262144\n"); break; case 2: //fw.write("ATTRIBUTES = IMEM_MEDIUM\n"); //fw.write("EXTRA_BTL_ARGS += -dcache_size 65536\n"); break; //case 3 is normal so don't do anything case 4: //fw.write("ATTRIBUTES = IMEM_16384\n"); fw.write("EXTRA_BTL_ARGS += -dcache_size 8192\n"); break; case 5: //fw.write("ATTRIBUTES = IMEM_8192\n"); fw.write("EXTRA_BTL_ARGS += -dcache_size 8192\n"); break; case 6: //fw.write("ATTRIBUTES = IMEM_4096\n"); fw.write("EXTRA_BTL_ARGS += -dcache_size 4096\n"); break; case 7: //fw.write("ATTRIBUTES = IMEM_2048\n"); fw.write("EXTRA_BTL_ARGS += -dcache_size 2048\n"); break; case 8: //fw.write("ATTRIBUTES = IMEM_1024\n"); fw.write("EXTRA_BTL_ARGS += -dcache_size 2048\n"); break; } */ if (KjcOptions.hwic) { fw.write("ATTRIBUTES += HWIC\n"); } // if we are data-parallelizing then for comparision to spacetime, // enable drams on all sides if (KjcOptions.dup == 1) { // fw.write("MEMORY_LAYOUT=FOUR_SIDES\n"); // fw.write("BTL-DEVICES += -dram lhs -enable_all_sides_for_dram -dram ths -dram bhs\n"); } // magic instruction support for printing... fw.write("EXTRA_BTL_ARGS += -magic_instruction\n "); // fw.write("SIM-CYCLES = 500000\n\n"); fw.write("\n"); // if we are using the magic network, tell btl if (KjcOptions.magic_net) fw.write("EXTRA_BTL_ARGS += " + "-magic_crossbar C1H1\n"); fw.write("include $(TOPDIR)/Makefile.include\n\n"); fw.write("RGCCFLAGS += -O3\n\n"); fw.write("BTL-MACHINE-FILE = fileio.bc\n\n"); if (rawChip.getYSize() > 4) { fw.write("TILE_PATTERN = 8x8\n\n"); } // fix for snake boot race condition fw.write("MULTI_SNAKEBOOT = 0\n\n"); fw.write("TILES = "); while (tilesIterator.hasNext()) { int tile = ((RawTile) tilesIterator.next()).getTileNumber(); if (tile < 10) fw.write("0" + tile + " "); else fw.write(tile + " "); } fw.write("\n\n"); tilesIterator = computeTiles.iterator(); while (tilesIterator.hasNext()) { int tile = ((RawTile) tilesIterator.next()).getTileNumber(); if (tile < 10) fw.write("OBJECT_FILES_0"); else fw.write("OBJECT_FILES_"); fw.write(tile + " = " + "tile" + tile + ".o "); // make sure that there is some if (!(KjcOptions.magic_net || KjcOptions.decoupled)) fw.write("sw" + tile + ".o"); fw.write("\n"); } // use sam's gcc and set the parameters of the tile // if (KjcOptions.altcodegen) { // fw.write // ("\nRGCC=/home/pkg/brave_new_linux/0225.btl.rawlib.starbuild/install/slgcc/bin/raw-gcc\n"); fw.write( "\nRGCC=/home/pkg/brave_new_linux/0277.newlib.rgdb.starbuild/install/slgcc/bin/raw-gcc\n"); fw.write("\nDMEM_PORTS = 1\n"); fw.write("ISSUE_WIDTH = 1\n\n"); fw.write("EXTRA_BTL_ARGS += -issue_width $(ISSUE_WIDTH) -dmem_ports $(DMEM_PORTS)\n"); fw.write("RGCCFLAGS += -missue_width=$(ISSUE_WIDTH) -mdmem_ports=$(DMEM_PORTS)\n"); // } fw.write("\ninclude $(COMMONDIR)/Makefile.all\n\n"); fw.write("clean:\n"); fw.write("\trm -f *.o\n"); fw.write("\trm -f tile*.s\n\n"); fw.close(); } catch (Exception e) { System.err.println("Error writing Makefile"); e.printStackTrace(); } }
private static int getIOPort(RawTile tile) { return rawChip.getXSize() + +tile.getY(); }