1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-06-03 07:29:37 +00:00
kickc/src/main/java/dk/camelot64/kickc/passes/reports/ReportRIG.java

69 lines
2.7 KiB
Java

package dk.camelot64.kickc.passes.reports;
import dk.camelot64.kickc.model.*;
import dk.camelot64.kickc.model.statements.Statement;
import dk.camelot64.kickc.model.symbols.Procedure;
import dk.camelot64.kickc.model.values.VariableRef;
import java.util.List;
/**
* Creates a reference interference graph from the liveliness analysis and coalesce actions.
*/
public class ReportRIG extends Report {
public MermaidGraph mermaidGraph;
public ReportRIG(Program program, String pass, String extension) {
super(program, pass, extension);
}
public void mermaidRIGBlock(Graph.Block block, LiveRangeVariables liveRanges) {
if(!block.getStatements().isEmpty()) {
for (Statement statement : block.getStatements()) {
List<VariableRef> aliveVariables = liveRanges.getAlive(statement.getIndex());
int size = aliveVariables.size();
if(size > 2) {
for (int i = 0; i < size - 1; i++) {
VariableRef varInner = aliveVariables.get(i);
MermaidNode innerNode = mermaidGraph.addNode(varInner.getFullName());
for (int o = i+1; o < size; o++) {
VariableRef varOuter = aliveVariables.get(o);
MermaidNode outerNode = mermaidGraph.addNode(varOuter.getFullName());
mermaidGraph.addFlow(innerNode, outerNode, null, MermaidFlow.Type.FULL, MermaidFlow.Direction.BI);
}
}
}
}
}
}
public String mermaidLiveRanges(Procedure procedure, Graph graph, LiveRangeVariables liveRanges) {
for(Graph.Block block : graph.getAllBlocks()) {
mermaidRIGBlock(block, liveRanges);
}
return mermaidGraph.getText(program);
}
@Override
public String generateReport(Program program) {
StringBuilder report = new StringBuilder();
LiveRangeVariables liveRanges = program.getLiveRangeVariables();
for(ProcedureCompilation procedureCompilation : program.getProcedureCompilations()) {
Procedure procedure = program.getScope().getProcedure(procedureCompilation.getProcedureRef());
Graph graph = procedureCompilation.getGraph();
if(graph != null) {
report.append("Procedure " + procedure.getFullName() + "\n");
report.append("```mermaid\n");
mermaidGraph = new MermaidGraph(MermaidGraph.Direction.TOP_DOWN);
report.append(configureReport());
report.append(mermaidLiveRanges(procedure, graph, liveRanges));
report.append("```\n\n");
}
}
return report.toString();
}
}