Browse Source

PoC compiler and grapher working, need to test with non trivial patches/cases

spesk 2 years ago
parent
commit
10c8ef0847
1 changed files with 90 additions and 1 deletions
  1. 90 1
      pl_proto.pl

+ 90 - 1
pl_proto.pl

@@ -3,6 +3,8 @@
 use strict;
 use warnings;
 use Data::Dumper;
+use lib "/home/swatson/perl5/lib/perl5";
+use GraphViz2;
 
 my $SOURCE_FILE = $ARGV[0];
 
@@ -357,5 +359,92 @@ foreach my $line ( split("\n", $src_content) ) {
 	line_parse($line);
 }
 
-    # Dump the AST for now. This is where we'd render the output
+# Dump the AST for now. This is where we'd render the output
 print Dumper %AST;
+
+my $graph = GraphViz2->new(
+        edge   => {color => 'grey'},
+        global => {directed => 1},
+        graph  => {label => $AST{'Title'}, rankdir => 'TB'},
+	node   => {shape => 'square'},
+);
+
+# Given a mod_ref, construct a graph object
+# that represents a module
+sub module_node_constructor($$) {
+	my $graph = shift;
+	my $mod_ref = shift;
+	$graph->push_subgraph(
+		name => "cluster_$$mod_ref{'Module'}",
+		graph => {label => "$$mod_ref{'Module'}"},
+		node => {color => 'black', shape => 'circle'},
+	);
+	foreach my $node_name ( keys %{$mod_ref} ) {
+		if ( $node_name =~ m/Module|Manufacturer|Rev/ ) { 
+			$graph->add_node(name => "$node_name : $$mod_ref{$node_name}", shape => 'oval');
+		}
+	}
+
+	if ( defined $AST{'Sets'}->{$$mod_ref{'Module'}} ) {
+		my $sets_ref = $AST{'Sets'}->{$$mod_ref{'Module'}};
+		foreach my $set ( keys %{$sets_ref} ) {
+			my $name = "cluster" . "_" . "$set";
+			my $label = "$set" . "_" . "settings";
+			$graph->push_subgraph(
+				name => $name,
+				graph => {label => $label},
+				node => {color => "red", shape => 'square'},
+			);
+			$graph->add_node(name => "$set : $$sets_ref{$set}->{'Param'} : $$sets_ref{$set}->{'Value'}");
+			$graph->pop_subgraph;
+		}
+	}
+
+	# Handle connections
+	if ( defined $AST{'Connections'} ) {
+		my $conn_ref = $AST{'Connections'};
+		foreach my $conn ( keys %{$conn_ref} ) {
+			if ($$mod_ref{'Module'} eq $$conn_ref{$conn}->{'Output_Module'} ) {
+				my $name = "cluster" . "_" . "$$conn_ref{$conn}->{'Output_Port'}";
+				my $label = "$$conn_ref{$conn}->{'Output_Port'}";
+				$graph->push_subgraph(
+					name => $name,
+					graph => {label => $label},
+					node => {color => "blue"},
+				);
+				$graph->add_node(name => "$$conn_ref{$conn}->{'Output_Port'}");
+				$graph->pop_subgraph;
+			} elsif ($$mod_ref{'Module'} eq $$conn_ref{$conn}->{'Input_Module'} ) {
+				my $name = "cluster" . "_" . "$$conn_ref{$conn}->{'Input_Mod_Dst'}";
+				my $label = "$$conn_ref{$conn}->{'Input_Mod_Dst'}";
+				$graph->push_subgraph(
+					name => $name,
+					graph => {label => $label},
+					node => {color => 'purple'},
+				);
+				$graph->add_node(name => "$$conn_ref{$conn}->{'Input_Mod_Dst'}");
+				$graph->pop_subgraph;
+			}
+			
+		}
+	}
+
+	$graph->pop_subgraph;
+}
+
+sub connection_node_constructor($) {
+	my $graph = shift;
+}
+
+foreach my $mod_ref ( @{$AST{'Modules'}} ) {
+	module_node_constructor($graph,$mod_ref);
+}
+# Draw connections
+foreach my $conn_ref ( keys %{$AST{'Connections'}} ) {
+	my $from = $AST{'Connections'}->{$conn_ref}->{'Output_Port'};
+	my $to = $AST{'Connections'}->{$conn_ref}->{'Input_Mod_Dst'};
+	$graph->add_edge(from => $from, to => $to);
+}
+
+my $format = 'svg';
+$graph->run(format => $format, output_file => "test.svg");