123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430 |
- /*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
- package analise;
- import API.MiddlewareInterface;
- import common.Instruction;
- import common.Block;
- import common.Code;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.LinkedHashMap;
- import java.util.LinkedList;
- import java.util.Map;
- /**
- *
- * @author lucas
- */
- public class ModuleSchedulingMiddleware implements MiddlewareInterface {
- protected Code target;
- protected Integer NumeroElementosDeProcessamento = 5;
- protected HashMap<String, String> instructionMap = new HashMap<String, String>() {
- {
- put("I", "rt");
- put("R", "rd");
- }
- };
- protected LinkedHashMap<String, Block> loops = new LinkedHashMap<>();
- protected LinkedHashMap<String, ArrayList<No>> graphs = new LinkedHashMap<>();
- private String loopId;
- private Block loopInstructions;
- public ModuleSchedulingMiddleware() {
- }
- @Override
- public void Exec(Code c, LinkedHashMap<String, MiddlewareInterface> cp) throws Exception {
- // Block bloco = c.Block();
- System.out.println("Running Module Scheduling");
- target = c;
- for (Map.Entry<String, Block> entry : c.Blocks().entrySet()) {
- ExtractLoopInstructions(entry.getValue());
- }
- ConstruirGrafoDeDependencia();
- // Join();
- System.out.println("Loops\n:" + loops.keySet());
- // for (Map.Entry<String, Block> entry : loops.entrySet()) {
- // System.out.println("Loop " + entry.getKey());
- // System.out.println("F:" + entry.getValue().Instructions().getFirst());
- // System.out.println("L:" + entry.getValue().Instructions().getLast());
- // };
- System.out.println("Detalhe dos grafos:");
- for (Map.Entry<String, ArrayList<No>> entry : graphs.entrySet()) {
- String key = entry.getKey();
- ArrayList<No> value = entry.getValue();
- System.out.println("Loop " + key + " (" + value.size() + ")");
- for (No no : value) {
- System.out.println(">>" + no.Dump(""));
- }
- }
- }
- protected void ExtractLoopInstructions(Block block) {
- String loopId, lastLoopId = "";
- HashMap<String, Boolean> removed = new HashMap<>();
- boolean ne;
- for (Instruction inst : block.Instructions()) {
- loopId = inst.Get("inloop");
- // System.out.println("loopId(" + inst.Get("global.position") + "):" + loopId);
- // Se a instrucao não esta dentro de um loop
- // Se é um loop mais externo e foi marcado como removido
- // A instrucao não é adicionada
- if (loopId.equals("") || removed.containsKey(loopId)) {
- continue;
- }
- // Se for a primeira ocorrencia cria um bloco para o loop
- if (!loops.containsKey(loopId)) {
- // System.out.println("Add loop " + loopId);
- loops.put(loopId, new Block(loopId));
- }
- // Adiciona a instrucao no loop atual
- loops.get(loopId).Add(inst.copy());
- // Se o id do loop anterior for mais externo que o atual remove o anterior
- // E marca como removido para evitar de adicionar instrucoes nele
- if (!loopId.equals(lastLoopId)) {
- if (!lastLoopId.equals("") && loopId.contains(lastLoopId)) {
- loops.remove(lastLoopId);
- removed.put(lastLoopId, Boolean.TRUE);
- }
- // Atualiza o ultimo id
- lastLoopId = loopId;
- }
- }
- }
- protected void ConstruirGrafoDeDependencia() {
- // Block loopInstructions;
- for (Map.Entry<String, Block> entry : loops.entrySet()) {
- loopId = entry.getKey();
- loopInstructions = entry.getValue();
- if (!graphs.containsKey(loopId)) {
- graphs.put(loopId, new ArrayList<>());
- }
- ContruirGrafoPara();
- }
- }
- // protected void Join() {
- // No next;
- // for (Map.Entry<String, ArrayList<No>> entry : graphs.entrySet()) {
- // for (No no : entry.getValue()) {
- // if (no.root) {
- // MarcarFilhosComoNaoRoot(no);
- // }
- // }
- // // Remove nos não root
- // for (Iterator<No> iterator = entry.getValue().iterator(); iterator.hasNext();) {
- // if (!iterator.next().root) {
- // iterator.remove();
- // }
- // }
- // }
- // }
- protected void MarcarFilhosComoNaoRoot(No n) {
- for (No dep : n.deps) {
- dep.root = false;
- MarcarFilhosComoNaoRoot(dep);
- }
- // n.deps.stream().map((dep) -> {
- // dep.root = false;
- // return dep;
- // }).forEachOrdered((dep) -> {
- // MarcarFilhosComoNaoRoot(dep);
- // });
- }
- protected void ContruirGrafoPara() {
- LinkedList<Instruction> instructions = loopInstructions.Instructions();
- Instruction instruction;
- for (int i = loopInstructions.Instructions().size() - 1; i >= 0; i--) {
- instruction = instructions.get(i);
- if (instruction.eq("visited", "true")) {
- continue;
- }
- EncontreDependencias(
- instruction,
- i - 1,
- GetNo(instruction, true)
- );
- }
- }
- protected void EncontreDependencias(
- Instruction instruction,
- Integer after,
- No n
- ) {
- LinkedList<Instruction> instructions = loopInstructions.Instructions();
- Instruction tmp;
- String dst;
- No no;
- instruction.eq("visited", "true");
- ArrayList<String> sources = new ArrayList<>();
- switch (instruction.Get("type")) {
- case "R":
- dst = instruction.Get("rt");
- if (!"zerogpfp".contains(dst)) {
- sources.add(dst);
- }
- // System.out.println("ENCONTRA R:'" + dst + "'" + "zerogpfp".contains(dst));
- case "I":
- if (instruction.eq("inst", "sw")) {
- sources.add(instruction.Get("rt"));
- }
- dst = instruction.Get("rs");
- if (!dst.equals("") && !"zerogpfp".contains(dst)) {
- sources.add(dst);
- }
- // System.out.println("ENCONTRA I:'" + dst + "'" + "zerogpfp".contains(dst));
- break;
- }
- if (sources.isEmpty()) {
- return;
- }
- //
- // System.out.println("In("
- // + instruction.Get("global.position")
- // + ") bd (" + sources + ") after {" + after
- // );
- String next;
- for (int i = after; i >= 0; i--) {
- // Se encontrou todas as dependencias, sai do loop
- if (sources.isEmpty()) {
- // System.out.println("Encontrei todas as dependecias de " + instruction.Get("global.position"));
- break;
- }
- tmp = instructions.get(i);
- if (tmp.eq("type", "label")) {
- continue;
- }
- dst = tmp.Get(instructionMap.get(tmp.Get("type")));
- for (Iterator<String> iterator = sources.iterator(); iterator.hasNext();) {
- next = iterator.next();
- // System.out.println(
- // "procurando em ( "
- // + tmp.Get("global.position")
- // + " ) dst( " + dst + " )"
- // + next
- // + ">" + dst.equals(next)
- // );
- if (dst.equals(next)) {
- // no =;
- // no.index = i;
- // Adiciona um no no grafo com a intrucao dependete
- n.deps.add(GetNo(tmp, false));
- iterator.remove();
- break;
- }
- }
- }
- // Busca recursiva pela dependencia das outras intrucoes
- }
- protected HashMap<String, No> instructionNodes = new HashMap<>();
- protected No GetNo(Instruction tmp, boolean root) {
- String key = tmp.Get("global.position");
- boolean create = false;
- if (!instructionNodes.containsKey(key)) {
- create = true;
- No n = new No(tmp, root);
- if (root) {
- graphs.get(loopId).add(n);
- }
- instructionNodes.put(key, n);
- }
- // System.out.println("GetNo:" + key + " (" + create + ")" + root);
- return instructionNodes.get(key);
- }
- }
- // 20: 0666763252 addiu sp,sp,-12 -- prolog| push stack frame
- // 24: 0001962017 addu fp,zero,sp -- prolog|copy fp ← sp
- // 28: 0605028353 addiu s0,zero,1 .0 -- copy _V1 ← 1
- // 32: 2949644288 sw s0,fp,0 .1 -- store content of s0 in _V1
- // 36: 0605093888 addiu s1,zero,0 .2 -- copy _V2 ← 0
- // 40: 2949709828 sw s1,fp,4 .3 -- store content of s1 in _V2
- // 44: 0134217789 j f4 <preenche+0xe0> .4 -- jump to preenche+_i3
- // 48: 0000000000 sll zero,zero,0 .4 -- Nop
- // 52: 0605159424 addiu s2,zero,0 .5 -- copy _V3 ← 0
- // 56: 2949775368 sw s2,fp,8 .6 -- store content of s2 in _V3
- // 60: 0134217779 j cc <preenche+0xb8> .7 -- jump to preenche+_i7
- // 64: 0000000000 sll zero,zero,0 .7 -- Nop
- // 68: 2412969988 lw s3,fp,4 .8 -- load content from _V2 in s3
- // 72: 0000000000 sll zero,zero,0 .8 -- Nop
- // 76: 0001267745 addu t3,zero,s3 .9 -- copy _T4 ← _V2
- // 80: 0000745536 sll t4,t3,1 .10 -- _T5 = _T4 << 1
- // 84: 2413035528 lw s4,fp,8 .11 -- load content from _V3 in s4
- // 88: 0000000000 sll zero,zero,0 .11 -- Nop
- // 92: 0001337377 addu t5,zero,s4 .12 -- copy _T7 ← _V3
- // 96: 0026042401 addu t4,t4,t5 .13 -- _T5 = _T5 + _T7
- //100: 0000815232 sll t6,t4,2 .14 -- _T11 = _T5 << 2
- //104: 2413101056 lw s5,fp,0 .15 -- load content from _V1 in s5
- //108: 0000000000 sll zero,zero,0 .15 -- Nop
- //112: 0059666465 addu t6,gp,t6 .16
- //116: 2916417536 sw s5,t6,0 .16 -- store content of t6 in _G13[_T11]
- //120: 2412969988 lw s3,fp,4 .17 -- load content from _V2 in s3
- //124: 0000000000 sll zero,zero,0 .17 -- Nop
- //128: 0001275937 addu t7,zero,s3 .18 -- copy _T14 ← _V2
- //132: 0001032256 sll t8,t7,1 .19 -- _T15 = _T14 << 1
- //136: 2413035528 lw s4,fp,8 .20 -- load content from _V3 in s4
- //140: 0000000000 sll zero,zero,0 .20 -- Nop
- //144: 0001327137 addu t0,zero,s4 .21 -- copy _T17 ← _V3
- //148: 0050905121 addu t8,t8,t0 .22 -- _T15 = _T15 + _T17
- //152: 0001591424 sll t1,t8,2 .23 -- _T21 = _T15 << 2
- //156: 2413101056 lw s5,fp,0 .24 -- load content from _V1 in s5
- //160: 0000000000 sll zero,zero,0 .24 -- Nop
- //164: 0059328545 addu t1,gp,t1 .25
- //168: 2905931792 sw s5,t1,16 .25 -- store content of t1 in _G23[_T21]
- //172: 2413101056 lw s5,fp,0 .26 -- load content from _V1 in s5
- //176: 0000000000 sll zero,zero,0 .26 -- Nop
- //180: 0649396225 addiu s5,s5,1 .27 -- _V1 = _V1 + 1
- //184: 2949971968 sw s5,fp,0 .28 -- store content of s5 in _V1
- //188: 2412773384 lw s0,fp,8 .29 -- load content from _V3 in s0
- //192: 0000000000 sll zero,zero,0 .29 -- Nop
- //196: 0638582785 addiu s0,s0,1 .30 -- _V3 = _V3 + 1
- //200: 2949644296 sw s0,fp,8 .31 -- store content of s0 in _V3
- //204: 2412838920 lw s1,fp,8 .32 -- load content from _V3 in s1
- //208: 0000000000 sll zero,zero,0 .32 -- Nop
- //212: 0604831746 addiu t5,zero,2 .33
- //216: 0036507683 subu v0,s1,t5 .33
- //220: 0071368665 bltz v0,44 <preenche+0x30> .33 -- branch if register < 0
- //224: 0000000000 sll zero,zero,0 .33 -- Nop
- //228: 2412904452 lw s2,fp,4 .34 -- load content from _V2 in s2
- //232: 0000000000 sll zero,zero,0 .34 -- Nop
- //236: 0642908161 addiu s2,s2,1 .35 -- _V2 = _V2 + 1
- //240: 2949775364 sw s2,fp,4 .36 -- store content of s2 in _V2
- //244: 2413166596 lw s6,fp,4 .37 -- load content from _V2 in s6
- //248: 0000000000 sll zero,zero,0 .37 -- Nop
- //252: 0604897282 addiu t6,zero,2 .38
- //256: 0047058979 subu v0,s6,t6 .38
- //260: 0071368651 bltz v0,34 <preenche+0x20> .38 -- branch if register < 0
- //264: 0000000000 sll zero,zero,0 .38 -- Nop
- //268: 0666697740 addiu sp,sp,12 -- epilog| pop stack frame
- //272: 0001962017 addu fp,zero,sp -- epilog| pop stack frame
- //276: 0065011720 jr ra -- epilog| return
- //280: 0666763248 addiu sp,sp,-16 -- prolog| push stack frame
- //284: 0001962017 addu fp,zero,sp -- prolog|copy fp ← sp
- //288: 0605028352 addiu s0,zero,0 .0 -- copy _V24 ← 0
- //292: 2949644288 sw s0,fp,0 .1 -- store content of s0 in _V24
- //296: 0605093888 addiu s1,zero,0 .2 -- copy _V25 ← 0
- //300: 2949709828 sw s1,fp,4 .3 -- store content of s1 in _V25
- //304: 0134217883 j 26c <multiplica+0x154> .4 -- jump to multiplica+_i11
- //308: 0000000000 sll zero,zero,0 .4 -- Nop
- //312: 0605159424 addiu s2,zero,0 .5 -- copy _V26 ← 0
- //316: 2949775368 sw s2,fp,8 .6 -- store content of s2 in _V26
- //320: 0134217873 j 244 <multiplica+0x12c> .7 -- jump to multiplica+_i15
- //324: 0000000000 sll zero,zero,0 .7 -- Nop
- //328: 0605224960 addiu s3,zero,0 .8 -- copy _V27 ← 0
- //332: 2949840908 sw s3,fp,12 .9 -- store content of s3 in _V27
- //336: 0134217848 j 1e0 <multiplica+0xc8> .10 -- jump to multiplica+_i19
- //340: 0000000000 sll zero,zero,0 .10 -- Nop
- //344: 2413035524 lw s4,fp,4 .11 -- load content from _V25 in s4
- //348: 0000000000 sll zero,zero,0 .11 -- Nop
- //352: 0001335329 addu t4,zero,s4 .12 -- copy _T28 ← _V25
- //356: 0000813120 sll t5,t4,1 .13 -- _T29 = _T28 << 1
- //360: 2413101068 lw s5,fp,12 .14 -- load content from _V27 in s5
- //364: 0000000000 sll zero,zero,0 .14 -- Nop
- //368: 0001404961 addu t6,zero,s5 .15 -- copy _T31 ← _V27
- //372: 0028207137 addu t5,t5,t6 .16 -- _T29 = _T29 + _T31
- //376: 0000882816 sll t7,t5,2 .17 -- _T35 = _T29 << 2
- //380: 0059734049 addu t7,gp,t7 .18
- //384: 2381840384 lw t8,t7,0 .18
- //388: 2413101068 lw s5,fp,12 .19 -- load content from _V27 in s5
- //392: 0000000000 sll zero,zero,0 .19 -- Nop
- //396: 0001392673 addu t0,zero,s5 .20 -- copy _T38 ← _V27
- //400: 0000542784 sll t1,t0,1 .21 -- _T39 = _T38 << 1
- //404: 2413232136 lw s7,fp,8 .22 -- load content from _V26 in s7
- //408: 0000000000 sll zero,zero,0 .22 -- Nop
- //412: 0001527841 addu t2,zero,s7 .23 -- copy _T41 ← _V26
- //416: 0019548193 addu t1,t1,t2 .24 -- _T39 = _T39 + _T41
- //420: 0000612480 sll t3,t1,2 .25 -- _T45 = _T39 << 2
- //424: 0059463713 addu t3,gp,t3 .26
- //428: 2372927504 lw s0,t3,16 .26
- //432: 0000000000 sll zero,zero,0 .26 -- Nop
- //436: 0001073185 addu t4,zero,s0 .26 -- copy t4 ← s0
- //440: 0051146776 mult t8,t4 .27 -- _T48 = _T37 * _T47
- //444: 0000028690 mflo t6 .27
- //448: 2412838912 lw s1,fp,0 .28 -- load content from _V24 in s1
- //452: 0000000000 sll zero,zero,0 .28 -- Nop
- //456: 0036603937 addu s1,s1,t6 .29 -- _V24 = _V24 + _T48
- //460: 2949709824 sw s1,fp,0 .30 -- store content of s1 in _V24
- //464: 2412904460 lw s2,fp,12 .31 -- load content from _V27 in s2
- //468: 0000000000 sll zero,zero,0 .31 -- Nop
- //472: 0642908161 addiu s2,s2,1 .32 -- _V27 = _V27 + 1
- //476: 2949775372 sw s2,fp,12 .33 -- store content of s2 in _V27
- //480: 2412969996 lw s3,fp,12 .34 -- load content from _V27 in s3
- //484: 0000000000 sll zero,zero,0 .34 -- Nop
- //488: 0604962818 addiu t7,zero,2 .35
- //492: 0040833059 subu v0,s3,t7 .35
- //496: 0071368665 bltz v0,158 <multiplica+0x40> .35 -- branch if register < 0
- //500: 0000000000 sll zero,zero,0 .35 -- Nop
- //504: 2413035524 lw s4,fp,4 .36 -- load content from _V25 in s4
- //508: 0000000000 sll zero,zero,0 .36 -- Nop
- //512: 0001327137 addu t0,zero,s4 .37 -- copy _T50 ← _V25
- //516: 0000544832 sll t2,t0,1 .38 -- _T51 = _T50 << 1
- //520: 2413166600 lw s6,fp,8 .39 -- load content from _V26 in s6
- //524: 0000000000 sll zero,zero,0 .39 -- Nop
- //528: 0001460257 addu t1,zero,s6 .40 -- copy _T53 ← _V26
- //532: 0021581857 addu t2,t2,t1 .41 -- _T51 = _T51 + _T53
- //536: 0000678016 sll t3,t2,2 .42 -- _T57 = _T51 << 2
- //540: 2413101056 lw s5,fp,0 .43 -- load content from _V24 in s5
- //544: 0000000000 sll zero,zero,0 .43 -- Nop
- //548: 0059463713 addu t3,gp,t3 .44
- //552: 2910126112 sw s5,t3,32 .44 -- store content of t3 in _G59[_T57]
- //556: 0605356032 addiu s5,zero,0 .45 -- copy _V24 ← 0
- //560: 2949971968 sw s5,fp,0 .46 -- store content of s5 in _V24
- //564: 2412773384 lw s0,fp,8 .47 -- load content from _V26 in s0
- //568: 0000000000 sll zero,zero,0 .47 -- Nop
- //572: 0638582785 addiu s0,s0,1 .48 -- _V26 = _V26 + 1
- //576: 2949644296 sw s0,fp,8 .49 -- store content of s0 in _V26
- //580: 2412838920 lw s1,fp,8 .50 -- load content from _V26 in s1
- //584: 0000000000 sll zero,zero,0 .50 -- Nop
- //588: 0604897282 addiu t6,zero,2 .51
- //592: 0036573219 subu v0,s1,t6 .51
- //596: 0071368636 bltz v0,148 <multiplica+0x30> .51 -- branch if register < 0
- //600: 0000000000 sll zero,zero,0 .51 -- Nop
- //604: 2412904452 lw s2,fp,4 .52 -- load content from _V25 in s2
- //608: 0000000000 sll zero,zero,0 .52 -- Nop
- //612: 0642908161 addiu s2,s2,1 .53 -- _V25 = _V25 + 1
- //616: 2949775364 sw s2,fp,4 .54 -- store content of s2 in _V25
- //620: 2412969988 lw s3,fp,4 .55 -- load content from _V25 in s3
- //624: 0000000000 sll zero,zero,0 .55 -- Nop
- //628: 0604962818 addiu t7,zero,2 .56
- //632: 0040833059 subu v0,s3,t7 .56
- //636: 0071368622 bltz v0,138 <multiplica+0x20> .56 -- branch if register < 0
- //640: 0000000000 sll zero,zero,0 .56 -- Nop
- //644: 0666697744 addiu sp,sp,16 -- epilog| pop stack frame
- //648: 0001962017 addu fp,zero,sp -- epilog| pop stack frame
- //652: 0065011720 jr ra
|