Advertisement
Guest User

Untitled

a guest
Oct 26th, 2016
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.94 KB | None | 0 0
  1. package edu.mit.compilers.cfg.components;
  2.  
  3. import java.io.PrintWriter;
  4. import java.util.ArrayList;
  5. import java.util.Collections;
  6. import java.util.List;
  7. import java.util.Stack;
  8. import java.util.HashSet;
  9.  
  10. import edu.mit.compilers.cfg.CFGAble;
  11. import edu.mit.compilers.cfg.CFGContext;
  12. import edu.mit.compilers.cfg.components.BasicBlock;
  13. import edu.mit.compilers.lowir.instructions.Instruction;
  14.  
  15. public class CFG implements CFGAble {
  16. protected BasicBlock entryBlock;
  17. protected BasicBlock exitBlock;
  18.  
  19. public CFG(BasicBlock entryBlock, BasicBlock exitBlock) {
  20. this.entryBlock = entryBlock;
  21. this.exitBlock = exitBlock;
  22. }
  23.  
  24. // For purposes of creating a NOP start and a NOP end
  25. // to link to, note that entry and exit block are not linked
  26. // when creating the actual interior CFG link to the NOPs appropriately
  27. public CFG() {
  28. }
  29.  
  30. public BasicBlock getEntryBlock() {
  31. return entryBlock;
  32. }
  33.  
  34. public BasicBlock getExitBlock() {
  35. return exitBlock;
  36. }
  37.  
  38. public BasicBlock getPreviousBlock() {
  39. return getPreviousBlocks().get(0);
  40. }
  41.  
  42. public BasicBlock getNextBlock() {
  43. return getNextBlock(true);
  44. }
  45.  
  46. public BasicBlock getNextBlock(boolean condition) {
  47. if(getNextBlocks().size() == 0)
  48. return null;
  49. if(condition) {
  50. return exitBlock.getNextBlocks().get(0);
  51. } else {
  52. return exitBlock.getNextBlocks().get(1);
  53. }
  54. }
  55.  
  56. public List<BasicBlock> getPreviousBlocks() {
  57. return entryBlock.getPreviousBlocks();
  58. }
  59.  
  60. public List<BasicBlock> getNextBlocks() {
  61. return exitBlock.getNextBlocks();
  62. }
  63.  
  64. public void setPreviousBlocks(List<BasicBlock> prevBlocks) {
  65. entryBlock.setPreviousBlocks(prevBlocks);
  66. }
  67.  
  68. public void setNextBlocks(List<BasicBlock> nextBlocks) {
  69. exitBlock.setNextBlocks(nextBlocks);
  70. }
  71.  
  72. public void setPreviousBlock(BasicBlock prevBlock) {
  73. setPreviousBlocks(Collections.singletonList(prevBlock));
  74. }
  75.  
  76. public void setNextBlock(BasicBlock nextBlock) {
  77. setNextBlocks(Collections.singletonList(nextBlock));
  78. }
  79.  
  80. public void addPreviousBlocks(List<BasicBlock> prevBlocks) {
  81. List<BasicBlock> blocks = new ArrayList<>();
  82. blocks.addAll(getPreviousBlocks());
  83. blocks.addAll(prevBlocks);
  84. setPreviousBlocks(blocks);
  85. }
  86.  
  87. public void addPreviousBlock(BasicBlock prevBlock) {
  88. addPreviousBlocks(Collections.singletonList(prevBlock));
  89. }
  90.  
  91. public void exportDOT(){
  92. //create instance of from cfg
  93. DOTExporter exporter = new DOTExporter<BasicBlock,E>;
  94. //create an object of DOTExporter
  95.  
  96. //use this opject to export DOT file by calling exportDOT from the exporter obj
  97. }
  98.  
  99. @Override
  100. public CFG generateCFG(CFGContext context) {
  101. return this;
  102. }
  103.  
  104. @Override
  105. public void cfgPrint(PrintWriter pw, String prefix) {
  106. HashSet<BasicBlock> visited = new HashSet<BasicBlock>();
  107. Stack<BasicBlock> blockStack = new Stack<>();
  108. blockStack.push(getEntryBlock());
  109.  
  110. while(!blockStack.empty()) {
  111. BasicBlock currentBlock = blockStack.pop();
  112. if(visited.contains(currentBlock)) continue;
  113. else visited.add(currentBlock);
  114.  
  115. currentBlock.cfgPrint(pw, prefix + " ");
  116.  
  117. //push blocks in reverse order to pop in correct order
  118. if(currentBlock.getNextBlocks().size() > 1) {
  119. blockStack.push(currentBlock.getNextBlock(false));
  120. }
  121. if(currentBlock.getNextBlocks().size() > 0){
  122. blockStack.push(currentBlock.getNextBlock(true));
  123. }
  124. }
  125. }
  126.  
  127. @Override
  128. public List<Instruction> generateAssembly() {
  129. // TODO walk through CFG visit each basic block once,
  130. // generate list of instructions
  131. return null;
  132. }
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement