changeset 584:823503ada47f

add SingleLinkedStack.h
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Mon, 02 Dec 2019 22:51:17 +0900
parents ba529ff3f068
children b2157a88e0ef
files src/parallel_execution/plautogen/impl/SingleLinkedStack.h src/parallel_execution/trans_impl.pl
diffstat 2 files changed, 61 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/parallel_execution/plautogen/impl/SingleLinkedStack.h	Mon Dec 02 22:51:17 2019 +0900
@@ -0,0 +1,26 @@
+typedef struct SingleLinkedStack<Type, Isa> impl Stack {
+  struct Element* top;
+} SingleLinkedStack;
+
+/*
+    // Stack Interface
+    struct Stack {
+        union Data* stack;
+        union Data* data;
+        union Data* data1;
+        enum Code whenEmpty;
+        enum Code clear;
+        enum Code push;
+        enum Code pop;
+        enum Code pop2;
+        enum Code isEmpty;
+        enum Code get;
+        enum Code get2;
+        enum Code next;
+    } Stack;
+    // Stack implementations
+    struct SingleLinkedStack {
+        struct Element* top;
+    } SingleLinkedStack;
+    */
+
--- a/src/parallel_execution/trans_impl.pl	Thu Nov 28 16:33:01 2019 +0900
+++ b/src/parallel_execution/trans_impl.pl	Mon Dec 02 22:51:17 2019 +0900
@@ -104,6 +104,7 @@
 sub emit_code_gears {
   my ($out, $impl_ir, $inter_ir) = @_;
   my $impl = $impl_ir->{name};
+  my $interface_name = $inter_ir->{name};
 
   my @inter_data = @{$inter_ir->{data}};
   my $instance_inter = shift @inter_data;
@@ -114,22 +115,44 @@
   $instance_impl =~ s/([A-Z])/_\l$1/g;
   my $data_gear_types = {};
 
+  if (defined $impl_ir->{codes}) {
+    for my $cg (@{$impl_ir->{codes}}) {
+      while ($data_gears =~ /Type\*\s*(\w+),/g) {
+          $data_gears =~ s/Type\*/struct $impl*/;
+      }
+
+      while ($data_gears =~ /Isa\*\s*(\w+),/g) {
+          $data_gears =~ s/Isa\*/struct $inter_name*/;
+      }
+      print $out "__code $code_ir->{name}$impl(";
+      print $out "$data_gears) {\n\n";
+
+      #__code next(...), __code whenEmpty(...)
+      my @cg = ();
+      while ($data_gears =~ /__code ([\w(\.)\*\s,]+?\)),?/g) {
+        push(@cg, $1);
+      }
+
+      if (@cg) {
+        if (@cg == 2) {
+          print $out "  if (:TODO:) {\n";
+          print $out "       goto ",shift(@cg),";\n";
+          print $out "  }\n";
+          print $out "  goto ",shift(@cg),";\n";
+        } else {
+          print $out "  goto ",shift(@cg),";\n";
+        }
+      }
+      print $out "}\n\n";
+    }
+  }
+
   for my $code_ir (@{$inter_ir->{codes}}) {
     my $data_gears = $code_ir->{args};
     $data_gears =~ s/Impl/struct $impl/g;
+
     while ($data_gears =~ /Type\*\s*(\w+),/g) {
-      my $target = $1;
-      if (exists $data_gear_types->{$target}){
-        $data_gears =~ s/Type\*/$data_gear_types->{$target}/;
-      } else {
-        my $td = "";
-        map { $td = $_ if ($_ =~ /$target/) } @inter_data;
-        if ($td =~ /(\w+)\s*([\w\*]+)\s*(\w+)/) {
-          my $tmp = "$1 $2";
-          $data_gears =~ s/Type\*/$tmp/;
-          $data_gear_types->{$target} = $tmp;
-        }
-      }
+        $data_gears =~ s/Type\*/struct $interface_name*/;
     }
 
     print $out "__code $code_ir->{name}$impl(";