redshift 1.3.21 → 1.3.22

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,32 +1,31 @@
1
1
  module RedShift; class CexprGuard
2
-
3
2
  def initialize f
4
3
  super nil, f
5
4
  end
6
5
 
7
- @@serial = 0
6
+ @@serial = Hash.new(0)
8
7
 
9
- # +cl+ is the component class
10
- ## maybe all these methods should just be called wrapper?
11
- def guard_wrapper cl
12
- guard = self
13
- cl_cname = CGenerator.make_c_name cl.name
14
- g_cname = "Guard_#{@@serial}"; @@serial += 1
15
- guard_name = "guard_#{cl_cname}_#{g_cname}"
16
-
17
- Component::GuardWrapper.make_subclass guard_name do
18
- @inspect_str = "#{cl.name}: #{guard.formula}"
8
+ def make_generator cl
9
+ @fname = "guard_#{CGenerator.make_c_name cl.name}_#{@@serial[cl]}"
10
+ @@serial[cl] += 1
11
+ @inspect_str = "#{cl.name}: #{formula}"
19
12
 
20
- ssn = cl.shadow_struct.name
21
- cont_state_ssn = cl.cont_state_class.shadow_struct.name
13
+ @generator = proc do
14
+ sl = cl.shadow_library
15
+ ssn = cl.shadow_struct_name
16
+ cont_state_ssn = cl.cont_state_class.shadow_struct_name
17
+
18
+ include_file, source_file = sl.add_file fname
22
19
 
23
20
  # We need the struct
24
- shadow_library_source_file.include(cl.shadow_library_include_file)
21
+ source_file.include(cl.shadow_library_include_file)
25
22
 
26
23
  strict = false
27
24
 
28
- shadow_library_source_file.define(guard_name).instance_eval do
25
+ guard = self
26
+ source_file.define(fname).instance_eval do
29
27
  arguments "ComponentShadow *comp_shdw"
28
+ scope:extern
30
29
  return_type "int"
31
30
  declare :shadow => %{
32
31
  struct #{ssn} *shadow;
@@ -35,23 +34,21 @@ module RedShift; class CexprGuard
35
34
  }
36
35
  setup :shadow => %{
37
36
  shadow = (#{ssn} *)comp_shdw;
38
- cont_state = (#{cont_state_ssn} *)shadow->cont_state;
37
+ cont_state = (struct #{cont_state_ssn} *)shadow->cont_state;
39
38
  }
40
39
  declare :result => "int result"
41
- translation = guard.translate(self, "result", 0, cl) {|s| strict = s}
40
+ translation = guard.translate(self, "result", cl, 0) {|s| strict = s}
42
41
  body %{
43
42
  #{translation.join("
44
43
  ")};
45
44
  return result;
46
45
  }
47
46
  end
48
-
47
+
48
+ s = strict ? "STRICT" : "NONSTRICT"
49
+ sl.init_library_function.body \
50
+ "s_init_guard(#{fname}, #{fname.inspect}, #{inspect_str.inspect}, #{s});"
49
51
  @strict = strict
50
- ## should set guard.strict = strict too?
51
-
52
- define_c_method :calc_function_pointer do
53
- body "shadow->guard = &#{guard_name}"
54
- end
55
52
  end
56
53
  end
57
54
  end; end
@@ -64,26 +61,30 @@ module RedShift; class Expr
64
61
  @type = type
65
62
  end
66
63
 
67
- @@serial = 0
64
+ @@serial = Hash.new(0)
68
65
 
69
- # +cl+ is the component class
70
- def wrapper(cl)
71
- expr = self
72
- cl_cname = CGenerator.make_c_name cl.name
73
- ex_cname = "Expr_#{@@serial}"; @@serial += 1
74
- expr_name = "expr_#{cl_cname}_#{ex_cname}"
66
+ def make_generator cl
67
+ @fname = "expr_#{CGenerator.make_c_name cl.name}_#{@@serial[cl]}"
68
+ @@serial[cl] += 1
69
+ @inspect_str = "#{cl.name}: #{formula}"
75
70
 
76
- Component::ExprWrapper.make_subclass expr_name do
77
- @inspect_str = "#{cl.name}: #{expr.formula}"
71
+ @generator = proc do
72
+ sl = cl.shadow_library
73
+ ssn = cl.shadow_struct_name
74
+ cont_state_ssn = cl.cont_state_class.shadow_struct_name
75
+
76
+ sl.init_library_function.body \
77
+ "s_init_expr(#{fname}, #{fname.inspect}, #{inspect_str.inspect});"
78
78
 
79
- ssn = cl.shadow_struct.name
80
- cont_state_ssn = cl.cont_state_class.shadow_struct.name
79
+ include_file, source_file = sl.add_file fname
81
80
 
82
81
  # We need the struct
83
- shadow_library_source_file.include(cl.shadow_library_include_file)
82
+ source_file.include(cl.shadow_library_include_file)
84
83
 
85
- shadow_library_source_file.define(expr_name).instance_eval do
84
+ expr = self
85
+ source_file.define(fname).instance_eval do
86
86
  arguments "ComponentShadow *comp_shdw"
87
+ scope:extern
87
88
  return_type expr.type
88
89
  declare :shadow => %{
89
90
  struct #{ssn} *shadow;
@@ -92,20 +93,16 @@ module RedShift; class Expr
92
93
  }
93
94
  setup :shadow => %{
94
95
  shadow = (#{ssn} *)comp_shdw;
95
- cont_state = (#{cont_state_ssn} *)shadow->cont_state;
96
+ cont_state = (struct #{cont_state_ssn} *)shadow->cont_state;
96
97
  }
97
98
  declare :result => "#{expr.type} result"
98
- translation = expr.translate(self, "result", 0, cl)
99
+ translation = expr.translate(self, "result", cl, 0)
99
100
  body %{
100
101
  #{translation.join("
101
102
  ")};
102
103
  return result;
103
104
  }
104
105
  end
105
-
106
- define_c_method :calc_function_pointer do
107
- body "shadow->expr = &#{expr_name}"
108
- end
109
106
  end
110
107
  end
111
108
  end; end
@@ -1,21 +1,26 @@
1
1
  module RedShift; class RK4DifferentialFlow
2
- def flow_wrapper cl, state
3
- var_name = @var
4
- flow = self
5
-
6
- flow_name = "flow_#{CGenerator.make_c_name cl.name}_#{var_name}_#{state}"
7
-
8
- Component::FlowWrapper.make_subclass flow_name do
9
- @inspect_str = "#{cl.name}:#{state}: #{var_name} = #{flow.formula}"
2
+ def make_generator cl, state
3
+ @fname = "flow_#{CGenerator.make_c_name cl.name}_#{var}_#{state}"
4
+ @inspect_str = "#{cl.name}:#{state}: #{var} = #{formula}"
10
5
 
11
- ssn = cl.shadow_struct.name
12
- cont_state_ssn = cl.cont_state_class.shadow_struct.name
6
+ @generator = proc do
7
+ sl = cl.shadow_library
8
+ ssn = cl.shadow_struct_name
9
+ cont_state_ssn = cl.cont_state_class.shadow_struct_name
10
+
11
+ sl.init_library_function.body \
12
+ "s_init_flow(#{fname}, #{fname.inspect}, #{inspect_str.inspect}, NONALGEBRAIC);"
13
+
14
+ include_file, source_file = sl.add_file fname
13
15
 
14
16
  # We need the struct
15
- shadow_library_source_file.include(cl.shadow_library_include_file)
17
+ source_file.include(cl.shadow_library_include_file)
16
18
 
17
- shadow_library_source_file.define(flow_name).instance_eval do
19
+ flow = self
20
+ var_name = @var
21
+ source_file.define(fname).instance_eval do
18
22
  arguments "ComponentShadow *comp_shdw"
23
+ scope :extern
19
24
  declare :shadow => %{
20
25
  struct #{ssn} *shadow;
21
26
  struct #{cont_state_ssn} *cont_state;
@@ -26,7 +31,7 @@ module RedShift; class RK4DifferentialFlow
26
31
  }
27
32
  setup :shadow => %{
28
33
  shadow = (#{ssn} *)comp_shdw;
29
- cont_state = (#{cont_state_ssn} *)shadow->cont_state;
34
+ cont_state = (struct #{cont_state_ssn} *)shadow->cont_state;
30
35
  var = &cont_state->#{var_name};
31
36
  time_step = shadow->world->time_step;
32
37
  }
@@ -34,32 +39,27 @@ module RedShift; class RK4DifferentialFlow
34
39
  shadow->world->rk_level--;
35
40
  } # has to happen before referenced alg flows are called in other setups
36
41
  body %{
42
+ #{flow.translate(self, "ddt_#{var_name}", cl).join("
43
+ ")};
44
+
37
45
  switch (shadow->world->rk_level) {
38
46
  case 0:
39
- #{flow.translate(self, "ddt_#{var_name}", 0, cl).join("
40
- ")};
41
- var->value_1 = var->value_0 + ddt_#{var_name} * time_step/2;
47
+ var->value[1] = var->value[0] + ddt_#{var_name} * time_step/2;
42
48
  break;
43
49
 
44
50
  case 1:
45
- #{flow.translate(self, "ddt_#{var_name}", 1, cl).join("
46
- ")};
47
- var->value_2 = var->value_0 + ddt_#{var_name} * time_step/2;
51
+ var->value[2] = var->value[0] + ddt_#{var_name} * time_step/2;
48
52
  break;
49
53
 
50
54
  case 2:
51
- #{flow.translate(self, "ddt_#{var_name}", 2, cl).join("
52
- ")};
53
- var->value_3 = var->value_0 + ddt_#{var_name} * time_step;
55
+ var->value[3] = var->value[0] + ddt_#{var_name} * time_step;
54
56
  break;
55
57
 
56
58
  case 3:
57
- #{flow.translate(self, "ddt_#{var_name}", 3, cl).join("
58
- ")};
59
- value_4 = var->value_0 + ddt_#{var_name} * time_step;
60
- var->value_0 =
61
- (-3*var->value_0 + 2*var->value_1 + 4*var->value_2 +
62
- 2*var->value_3 + value_4) / 6;
59
+ value_4 = var->value[0] + ddt_#{var_name} * time_step;
60
+ var->value[0] =
61
+ (-3*var->value[0] + 2*var->value[1] + 4*var->value[2] +
62
+ 2*var->value[3] + value_4) / 6;
63
63
  break;
64
64
 
65
65
  default:
@@ -71,10 +71,6 @@ module RedShift; class RK4DifferentialFlow
71
71
  var->rk_level = shadow->world->rk_level;
72
72
  }
73
73
  end
74
-
75
- define_c_method :calc_function_pointer do
76
- body "shadow->flow = &#{flow_name}"
77
- end
78
74
  end
79
75
  end
80
76
  end; end
@@ -12,14 +12,7 @@ module RedShift
12
12
  super
13
13
 
14
14
  self.purge_source_dir = :delete
15
-
16
- self.show_times_flag =
17
- case $REDSHIFT_BUILD_TIMES
18
- when nil, false, /\A(false|0*)\z/i
19
- false
20
- else
21
- true
22
- end
15
+ self.show_times_flag = $REDSHIFT_BUILD_TIMES
23
16
 
24
17
  if $REDSHIFT_DEBUG
25
18
  include_file.include "<assert.h>"
@@ -89,6 +82,7 @@ module RedShift
89
82
  def precommit
90
83
  ## no need to precommit Component? Other abstract classes?
91
84
  component_classes.each {|cl| cl.precommit}
85
+ component_classes.each {|cl| cl.generate_wrappers}
92
86
  ## optimization?
93
87
  ## check if changed
94
88
  end
@@ -90,6 +90,10 @@ class World
90
90
  shadow_attr_accessor :rk_level => "long rk_level"
91
91
  shadow_attr_accessor :d_tick => "long d_tick"
92
92
  shadow_attr_accessor :alg_nest => "long alg_nest"
93
+ shadow_attr_accessor :input_depth_limit =>
94
+ "long input_depth_limit"
95
+ shadow_attr_accessor :alg_depth_limit =>
96
+ "long alg_depth_limit"
93
97
 
94
98
  shadow_attr_accessor :base_clock => "double base_clock"
95
99
  shadow_attr_accessor :base_step_count =>
@@ -209,7 +213,7 @@ class World
209
213
  while (var < end_var) {
210
214
  var->rk_level = 0;
211
215
  if (!var->flow) {
212
- var->value_1 = var->value_2 = var->value_3 = var->value_0;
216
+ var->value[1] = var->value[2] = var->value[3] = var->value[0];
213
217
  }
214
218
  var++;
215
219
  }
@@ -377,7 +381,7 @@ class World
377
381
  move_comp(l->ptr[l->len-1], list, next_list);
378
382
  }
379
383
  inline static void remove_comp(VALUE comp, VALUE list,
380
- #{World.shadow_struct.name} *shadow)
384
+ #{World.shadow_struct_name} *shadow)
381
385
  {
382
386
  ComponentShadow *comp_shdw = get_shadow(comp);
383
387
  assert(RARRAY(list)->ptr[RARRAY(list)->len-1] == comp);
@@ -390,7 +394,7 @@ class World
390
394
  {
391
395
  double (*fn)(ComponentShadow *), rslt;
392
396
  assert(rb_obj_is_kind_of(expr, ExprWrapperClass));
393
- fn = ((#{RedShift::Component::ExprWrapper.shadow_struct.name} *)
397
+ fn = ((#{RedShift::Component::ExprWrapper.shadow_struct_name} *)
394
398
  get_shadow(expr))->expr;
395
399
  rslt = (*fn)(get_shadow(comp));
396
400
  return rslt;
@@ -400,7 +404,8 @@ class World
400
404
  ComponentShadow *(*fn)(ComponentShadow *);
401
405
  ComponentShadow *rslt;
402
406
  assert(rb_obj_is_kind_of(expr, ExprWrapperClass));
403
- fn = ((#{RedShift::Component::ExprWrapper.shadow_struct.name} *)
407
+ fn = (ComponentShadow *(*)(ComponentShadow *))
408
+ ((#{RedShift::Component::ExprWrapper.shadow_struct_name} *)
404
409
  get_shadow(expr))->expr;
405
410
  rslt = (*fn)(get_shadow(comp));
406
411
  return rslt;
@@ -409,7 +414,7 @@ class World
409
414
  {
410
415
  int (*fn)(ComponentShadow *), rslt;
411
416
  assert(rb_obj_is_kind_of(guard, GuardWrapperClass));
412
- fn = ((#{RedShift::Component::GuardWrapper.shadow_struct.name} *)
417
+ fn = ((#{RedShift::Component::GuardWrapper.shadow_struct_name} *)
413
418
  get_shadow(guard))->guard;
414
419
  rslt = (*fn)(get_shadow(comp));
415
420
  return rslt;
@@ -459,15 +464,6 @@ class World
459
464
  }
460
465
  break;
461
466
 
462
- case T_CLASS:
463
- assert(RTEST(rb_funcall(guard, #{declare_symbol "<"},
464
- 1, GuardWrapperClass)));
465
- guard = rb_funcall(guard, #{declare_symbol :instance}, 0);
466
- RARRAY(guards)->ptr[i] = guard;
467
- if (!test_cexpr_guard(comp, guard))
468
- return 0;
469
- break;
470
-
471
467
  default:
472
468
  assert(0);
473
469
  }
@@ -477,7 +473,7 @@ class World
477
473
  }
478
474
 
479
475
  inline static int comp_can_sync(ComponentShadow *comp_shdw,
480
- #{World.shadow_struct.name} *shadow)
476
+ #{World.shadow_struct_name} *shadow)
481
477
  {
482
478
  int i, j;
483
479
  int can_sync = 1;
@@ -523,7 +519,7 @@ class World
523
519
  }
524
520
 
525
521
  inline static int eval_events(ComponentShadow *comp_shdw,
526
- #{World.shadow_struct.name} *shadow)
522
+ #{World.shadow_struct_name} *shadow)
527
523
  {
528
524
  VALUE events = cur_events(comp_shdw);
529
525
  int has_events = RTEST(events);
@@ -557,7 +553,7 @@ class World
557
553
 
558
554
  inline static void cache_new_constant_value(
559
555
  double *dbl_ptr, double value,
560
- #{World.shadow_struct.name} *shadow)
556
+ #{World.shadow_struct_name} *shadow)
561
557
  {
562
558
  CVCacheEntry *entry;
563
559
 
@@ -586,7 +582,7 @@ class World
586
582
  }
587
583
 
588
584
  inline static int assign_new_constant_values(
589
- #{World.shadow_struct.name} *shadow)
585
+ #{World.shadow_struct_name} *shadow)
590
586
  {
591
587
  int did_reset = shadow->cv_cache_used;
592
588
 
@@ -606,7 +602,7 @@ class World
606
602
 
607
603
  inline static void cache_new_link(
608
604
  ComponentShadow **link_ptr, VALUE value,
609
- #{World.shadow_struct.name} *shadow)
605
+ #{World.shadow_struct_name} *shadow)
610
606
  {
611
607
  LinkCacheEntry *entry;
612
608
 
@@ -634,7 +630,7 @@ class World
634
630
  }
635
631
 
636
632
  inline static int assign_new_links(
637
- #{World.shadow_struct.name} *shadow)
633
+ #{World.shadow_struct_name} *shadow)
638
634
  {
639
635
  int did_reset = shadow->link_cache_used;
640
636
 
@@ -658,7 +654,7 @@ class World
658
654
  }
659
655
 
660
656
  inline static void cache_new_port(VALUE input_port, VALUE other_port,
661
- #{World.shadow_struct.name} *shadow)
657
+ #{World.shadow_struct_name} *shadow)
662
658
  {
663
659
  PortCacheEntry *entry;
664
660
 
@@ -686,7 +682,7 @@ class World
686
682
  }
687
683
 
688
684
  inline static int assign_new_ports(
689
- #{World.shadow_struct.name} *shadow)
685
+ #{World.shadow_struct_name} *shadow)
690
686
  {
691
687
  int did_reset = shadow->port_cache_used;
692
688
 
@@ -706,7 +702,7 @@ class World
706
702
  }
707
703
 
708
704
  inline static int eval_continuous_resets(ComponentShadow *comp_shdw,
709
- #{World.shadow_struct.name} *shadow)
705
+ #{World.shadow_struct_name} *shadow)
710
706
  {
711
707
  VALUE resets = cur_resets(comp_shdw);
712
708
  VALUE cont_resets;
@@ -770,7 +766,7 @@ class World
770
766
  //%% rb_funcall(comp_shdw->cont_state->self,//
771
767
  //%% #{declare_symbol :var_at_index},1,INT2NUM(i)),
772
768
  //%% rb_float_new(new_value));
773
- var->value_1 = new_value;
769
+ var->value[1] = new_value;
774
770
  var->reset = 1;
775
771
  }
776
772
  }
@@ -780,7 +776,7 @@ class World
780
776
  }
781
777
 
782
778
  inline static int eval_constant_resets(ComponentShadow *comp_shdw,
783
- #{World.shadow_struct.name} *shadow)
779
+ #{World.shadow_struct_name} *shadow)
784
780
  {
785
781
  VALUE resets = cur_resets(comp_shdw);
786
782
  VALUE const_resets;
@@ -879,7 +875,7 @@ class World
879
875
  }
880
876
 
881
877
  inline static int eval_port_connects(ComponentShadow *comp_shdw,
882
- #{World.shadow_struct.name} *shadow)
878
+ #{World.shadow_struct_name} *shadow)
883
879
  {
884
880
  VALUE connects = cur_connects(comp_shdw);
885
881
 
@@ -937,7 +933,7 @@ class World
937
933
  for (i = len; i > 0; i--, var++) {
938
934
  if (var->reset) {
939
935
  var->reset = 0;
940
- var->value_0 = var->value_1;
936
+ var->value[0] = var->value[1];
941
937
  did_reset = 1;
942
938
  }
943
939
  }
@@ -945,7 +941,7 @@ class World
945
941
  }
946
942
 
947
943
  inline static void do_actions(ComponentShadow *comp_shdw, VALUE actions,
948
- #{World.shadow_struct.name} *shadow)
944
+ #{World.shadow_struct_name} *shadow)
949
945
  {
950
946
  long i;
951
947
  VALUE comp = comp_shdw->self;
@@ -969,7 +965,7 @@ class World
969
965
  }
970
966
 
971
967
  inline static void update_all_alg_vars(ComponentShadow *comp_shdw,
972
- #{World.shadow_struct.name} *shadow)
968
+ #{World.shadow_struct_name} *shadow)
973
969
  {
974
970
  ContVar *vars = (ContVar *)&FIRST_CONT_VAR(comp_shdw);
975
971
  long count = comp_shdw->var_count;
@@ -985,7 +981,7 @@ class World
985
981
  }
986
982
 
987
983
  inline static void start_trans(ComponentShadow *comp_shdw,
988
- #{World.shadow_struct.name} *shadow,
984
+ #{World.shadow_struct_name} *shadow,
989
985
  VALUE trans, VALUE dest)
990
986
  {
991
987
  comp_shdw->trans = trans;
@@ -994,7 +990,7 @@ class World
994
990
  }
995
991
 
996
992
  inline static void finish_trans(ComponentShadow *comp_shdw,
997
- #{World.shadow_struct.name} *shadow)
993
+ #{World.shadow_struct_name} *shadow)
998
994
  { //%% hook_finish_transition(comp_shdw->self, comp_shdw->trans,
999
995
  //%% comp_shdw->dest);
1000
996
  if (comp_shdw->state != comp_shdw->dest) {
@@ -1024,16 +1020,16 @@ class World
1024
1020
  if (var->ck_strict) {
1025
1021
  var->ck_strict = 0;
1026
1022
  (*var->flow)(comp_shdw);
1027
- if (var->value_0 != var->value_1) {
1023
+ if (var->value[0] != var->value[1]) {
1028
1024
  rb_funcall(comp_shdw->self,
1029
1025
  #{declare_symbol :handle_strictness_error}, 3, INT2NUM(i),
1030
- rb_float_new(var->value_0), rb_float_new(var->value_1));
1026
+ rb_float_new(var->value[0]), rb_float_new(var->value[1]));
1031
1027
  }
1032
1028
  }
1033
1029
  }
1034
1030
  }
1035
1031
 
1036
- inline static void check_guards(#{World.shadow_struct.name} *shadow,
1032
+ inline static void check_guards(#{World.shadow_struct_name} *shadow,
1037
1033
  int sync_retry)
1038
1034
  {
1039
1035
  VALUE comp;
@@ -1109,7 +1105,7 @@ class World
1109
1105
  assert(RARRAY(shadow->prev_awake)->len == 0);
1110
1106
  }
1111
1107
 
1112
- inline static void do_sync_phase(#{World.shadow_struct.name} *shadow)
1108
+ inline static void do_sync_phase(#{World.shadow_struct_name} *shadow)
1113
1109
  {
1114
1110
  VALUE comp;
1115
1111
  ComponentShadow *comp_shdw;