Skip to content

Dot Files

Tom edited this page Jul 21, 2023 · 5 revisions
digraph OverallStructure {

	/* Styles */
	node [shape=box];

	/* Relations */
	subgraph s1 {
		rank = "same";
		Source -> Binary;
		Binary -> ".relf" [xlabel = "readelf"];
		Binary -> ".adt" [label = "bap"];
	}

	".adt" -> IR;
	".relf" -> IR;
	
	subgraph cluster_basil {
		style = "dotted";
		color = "red";
		margin = "20";
		newrank = true; rank = "same";
		label = "BASIL";
		IR -> Analyses;
		Analyses:n -> Analyses:n;
		Analyses -> Boogie;
	}

	Boogie -> "SMT Solver";
}
digraph AdtParsing {
	
	/* Relations */
	{
		node [shape=box, fixedsize="True", width="1.7"];
		Main -> generateVcsAdt;
		generateVcsAdt -> BilAdtParser;
		BilAdtParser -> AdtStatementLoader;

		AdtStatementLoader -> BAPProgram;

		subgraph cluster_parsing {
			graph[
				style="dotted", 
				label="Parser", 
				labeljust="l",
				margin="15"
			]

			BilAdtParser
		}

		subgraph cluster_walking {
			graph[
				style="dotted", 
				label="Walker", 
				labeljust="l",
				margin="15"
			]

			AdtStatementLoader
		}

		subgraph cluster_translator {
			graph[
				style="dotted", 
				label="Translator", 
				labeljust="l",
				margin="15"
			]

			BAPProgram -> BAPToIR;
		}

		BAPToIR -> IR;
		
		IR[shape=oval];
	} // </Relations>

	/* Source Code Structure */
	{
	edge[style="invis"];
	node[shape="plaintext"];
	src0 -> src1;
	src1 -> src2;
	src2 -> src3;
	src3 -> src4;
	
	src4 -> src5;
	src5 -> src6;
	} // </Source Code Structure>

	/* Source Code Labels */
	src0[label="scala/Main"];
	src1[label="scala/util/RunUtils"];
	src2[label="antlr4/BilAdt"];
	src3[label="scala/translating/AdtStatementLoader"];
	src4[label="scala/bap/BAPProgram"];
	src5[label="scala/translating/BAPToIR"];
	src6[label="scala/ir/Program"];
}
digraph BasilIR {
	
	/* Styles */
	node[shape=box, fixedsize="True", width="1.5", height="1.6"];
	graph[splines=ortho]

	/* Node Groups */
	Program[group=g1];
	Procedure[group=g1];
	Block[group=g1];
	Statement[group=g2];
	Jump[group=g2];

	{ rank = "same"; Statement; Jump; }

	{
		node[shape=box, fixedsize="True", width="1.5", height="0.4"];
		LocalAssign;
		MemoryAssign;
		GoTo[group=g2];
		DirectCall;
		IndirectCall;
	}

	/* Relations */
	Program -> Procedure;
	Program -> MemorySection;
	Procedure -> Block;
	Block -> Statement;
	Block -> Jump;

	

	Statement -> LocalAssign;
	Statement -> MemoryAssign;

	Jump -> GoTo;
	Jump -> DirectCall;
	Jump -> IndirectCall;


	/* Node Contents */
	Program[label =  <
    <table border="0">
       	<tr><td align="text" width="100%">Program</td></tr>
       	<tr><td align="text">• procedures<br align="left"/></td></tr>
		<tr><td align="text">• initialMemory<br align="left"/></td></tr>
    </table>
  > , labelloc=t];

  Procedure[label =  <
    <table border="0">
       	<tr><td align="text" width="100%">Procedure</td></tr>
       	<tr><td align="left">• name<br align="left"/></td></tr>
		<tr><td align="left">• address<br align="left"/></td></tr>
		<tr><td align="left">• blocks<br align="left"/></td></tr>
    </table>
  > , labelloc=t];

  Block[label =  <
    <table border="0">
       	<tr><td align="text" width="100%">Block</td></tr>
       	<tr><td align="left">• label<br align="left"/></td></tr>
		<tr><td align="left">• address<br align="left"/></td></tr>
		<tr><td align="left">• statements<br align="left"/></td></tr>
		<tr><td align="left">• jumps<br align="left"/></td></tr>
    </table>
  > , labelloc=t];

  Statement[label = <
    <table border="0" valign="top">
		<tr><td align="text" width="100%">Statement</td></tr>
       	<tr><td align="left" width="100%">• modifies<br align="left"/></td></tr>
		<tr><td align="left">• locals<br align="left"/></td></tr>
    </table>
  > , labelloc=t];

  Jump[label = <
    <table border="0" valign="top">
		<tr><td align="text" width="100%">Jump</td></tr>
       	<tr><td align="left" width="100%">• modifies<br align="left"/></td></tr>
		<tr><td align="left">• locals<br align="left"/></td></tr>
		<tr><td align="left">• calls<br align="left"/></td></tr>
    </table>
  > , labelloc=t];

  MemorySection[label = <
    <table border="0" valign="top">
		<tr><td align="text" width="100%">MemorySection</td></tr>
       	<tr><td align="left" width="100%">• name<br align="left"/></td></tr>
		<tr><td align="left">• address<br align="left"/></td></tr>
		<tr><td align="left">• size<br align="left"/></td></tr>
		<tr><td align="left">• bytes<br align="left"/></td></tr>
    </table>
  > , labelloc=t];
}
digraph CfgNodes {
	
	/* Styles */
	node[shape=box, fixedsize="True", width="2.2", height="1"];
	graph[splines=ortho]

	/* Node Groups */
	CfgNode[group=g1];
	CfgNodeWithData[group=g1];
	CfgFunctionEntryNode[group=g2];
	CfgCommandNode[group=g3];

	/* Relations */
	CfgNode -> CfgNodeWithData [minlen=2];

	
	CfgNodeWithData -> CfgFunctionEntryNode
	CfgNodeWithData -> CfgFunctionExitNode

	CfgNodeWithData -> CfgCommandNode [minlen = 2]

	CfgCommandNode -> CfgStatementNode 
	CfgCommandNode -> CfgJumpNode
	CfgCommandNode -> CfgGhostNode


	CfgNode -> CfgCallReturnNode 
	CfgNode -> CfgCallNoReturnNode
	CfgNode -> CfgProcedureReturnNode
}
digraph CfgEdges {
	
	/* Styles */
	node[shape=box, fixedsize="True", width="2.2", height="1"];
	graph[splines=ortho]

	/* Relations */
	CfgEdge -> RegularEdge;
	CfgEdge -> IntraprocEdge;

	CfgEdge -> InterprocEdge;

	InterprocEdge -> InlineEdge;
	InterprocEdge -> InterprocCallEdge;
}
Clone this wiki locally