#include <stdio.h>
#include "parc.h"

using namespace parc;

module top {
public:
  char i,j;
  top() {
    i = j = 1;
  }

  r_signal<logic> sig;

  process p1 {
    driver<logic> drv1 = sig;
  start:
    for (; i < 40 ; i++) {
      mt_printf("p1: %d @ %3.3f\n",i,Kern->Now().D());
      drv1 := i & 1;
      wait(7);
    }
  } a;

  process px {
    driver<logic> drv1 = sig;
  start:
    migrate();    
    mt_printf("px: on %d\n",MyKern()->CPU());
    for (; j < 40 ; j++) {
      mt_printf("px: %d @ %3.3f\n",i,Kern->Now().D());
      drv1 := j & 1;
      wait(11);
    }
  } x;

  process p2 {
    char d;
  start:
    for (;;) { @(sig) mt_printf("p2: v=%d,k=%d,s=%d @ %3.3f\n",
                                sig.Value().value,sig.Value().known,sig.Value().strength,
                                Kern->Now().D()); }
  } b;

  process p3 {
    char d; 
  start:
    migrate();    
    mt_printf("p3: on %d\n",MyKern()->CPU());
    for (;;) { 
      @(sig) 
      mt_printf("p3: v=%d,k=%d,s=%d @ %3.3f\n",
                sig.Value().value,sig.Value().known,sig.Value().strength,
                Kern->Now().D()); 
    }
  } c;

};

void test()
{
  top t;

  root()->StartAll();
}

int main(int argc,char **argv)
{
  int x(1);

  test();
}