view src/parallel_execution/tmp_tool/parse_cerate_each_context.pl @ 571:d9c3bccaa13c

add semiron..
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Sun, 24 Nov 2019 22:55:33 +0900
parents 1233236c244d
children
line wrap: on
line source

#!/usr/bin/env perl
use strict;
use warnings;
use DDP {deparse => 1};

my @already_defined = qw/
Atomic
Buffer
CodeGear
Executor
Iterator
Lock
Queue
Semaphore
Stack
TaskManager
Timer
Tree
Worker
SingleLinkedStack
SortArray
/;

my %already_defined_hash;
map { $already_defined_hash{$_}++ } @already_defined;

my $context = shift // "context.h";

open my $fh, '<', $context;
while (my $line = <$fh>) {
  if ($line =~ /^union Data \{/) {
    last;
  }
}

my @context_cg_str = <$fh>;
close($fh);
chomp @context_cg_str;
my $res = {};

while (my $line = shift @context_cg_str) {
  if ($line =~ /\s*struct\s*(\w+)\s*\{/) {
    my $struct = $1;
    if (exists $already_defined_hash{$struct}) {
      next;
    }
    $line = shift @context_cg_str;
    while ($line !~  /\}\s*$struct/) {
        $line =~ s/\s+([\*\w ]+);/$1/;
        push (@{$res->{$struct}},$line);
        $line = shift @context_cg_str ;
    }
    unless (defined $res->{$struct}) {
        push (@{$res->{$struct}},"");
    }
  }
}

map { print "$_\n" } keys %$res;
my %impl2inter = (
  SpinLock          => "Lock",
  CUDAWorker        => "Worker",
  RedBlackTree      => "Tree",
  AtomicReference   => "Atomic",
  CPUWoker          => "Woker",
  MultiDimIterator  => "Iterator",
  CUDAExecutor      => "Executor",
  SingleLinkedStack => "Stack",
  SingleLinkedQueue => "Queue",
  SynchronizedQueue => "Queue",
);

for my $dg_name (keys %$res) {
  if ($dg_name =~ /(\w+)Impl/) {
      create_impl_file($dg_name,$res->{$dg_name},$1);
      next;
  }

  if (exists $impl2inter{$dg_name}) {
      create_impl_file($dg_name,$res->{$dg_name},$impl2inter{$dg_name});
      next;
  }
  create_inter_file($dg_name,$res->{$dg_name});
}

sub create_impl_file {
  my ($name, $contents,$interface) = @_;
  my $str = "typedef struct $name <Type, Isa> impl $interface {\n";
  create_file("impl/$name.h",$contents,$str,$name);
}

sub create_inter_file {
  my ($name, $contents) = @_;
  my $str = "typedef struct $name <Type, Impl> {\n";
  create_file("interface/$name.h",$contents,$str,$name);
}

sub create_file {
  my ($file_name, $contents, $str, $name) = @_;
  my $space = "  ";
  for my $co (@$contents) {
    if ($co =~ /enum\s*Code\s*(\w+)/) {
      $str .= "${space}__code $1(...);\n";
      next;
    }
    chomp $co;
    $str .= "${space}$co;\n";
  }
  open my $fh, '>', "$ENV{PWD}/plautogen/$file_name" or die "oops! $file_name\n";
  print $fh $str;
  print $fh "} $name;\n";
  close $fh;
}

sub print_impl {
  my ($out, $name, $cg_info) = @_;
  print $out "typedef strcut $name<Impl, Bot> {\n";
}

__DATA__
SpinLock
Main
CUDAExecutor
TaskManagerImpl
LockImpl
MultiDim
SynchronizedQueue
ArrayStack
LoopCounter
TimerImpl
Node
CUDAWorker
Memory
SemaphoreImpl
BoundedBuffer
RotateTree
CUDABuffer
Array
Allocate
Meta
SingleLinkedQueue
CPUWorker
Integer
MultiDimIterator
Element
RedBlackTree