redshift 1.3.21 → 1.3.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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;