ct_process_constructors.hpp
Go to the documentation of this file.
1 /**********************************************************************
2  * ct_process_constructors.hpp -- Process constructors in the CT *
3  * MOC *
4  * *
5  * Author: Hosein Attarzadeh (shan2@kth.se) *
6  * *
7  * Purpose: Providing basic process constructors for modeling *
8  * continuous-time systems in ForSyDe-SystemC *
9  * *
10  * Usage: This file is included automatically *
11  * *
12  * License: BSD3 *
13  *******************************************************************/
14 
15 #ifndef CT_PROCESS_CONSTRUCTORS_HPP
16 #define CT_PROCESS_CONSTRUCTORS_HPP
17 
25 #include <functional>
26 #include <fstream>
27 #include <string>
28 
29 #include "sub_signal.hpp"
30 #include "ct_process.hpp"
31 
32 namespace ForSyDe
33 {
34 
35 namespace CT
36 {
37 
38 using namespace sc_core;
39 
41 
45 class comb : public ct_process
46 {
47 public:
50 
52  typedef std::function<void(CTTYPE&,const CTTYPE&)> functype;
53 
55 
59  comb(sc_module_name _name,
60  const functype& _func
61  ) : ct_process(_name), iport1("iport1"), oport1("oport1"),
62  _func(_func)
63  {
64 #ifdef FORSYDE_INTROSPECTION
65  std::string func_name = std::string(basename());
66  func_name = func_name.substr(0, func_name.find_last_not_of("0123456789")+1);
67  arg_vec.push_back(std::make_tuple("_func",func_name+std::string("_func")));
68 #endif
69  }
70 
72  std::string forsyde_kind() const {return "CT::comb";}
73 
74 private:
75  // Inputs and output variables
76  sub_signal oval;
77  sub_signal ival1;
78 
80  functype _func;
81 
82  //Implementing the abstract semantics
83  void init() {}
84 
85  void prep()
86  {
87  ival1 = iport1.read();
88  }
89 
90  void exec()
91  {
92  sub_signal iv1 = ival1;
93  oval = sub_signal(get_start_time(ival1), get_end_time(ival1),
94  [this,iv1](const sc_time& t)
95  {
96  CTTYPE res;
97  _func(res, iv1(t));
98  return res;
99  }
100  );
101  }
102 
103  void prod()
104  {
105  WRITE_MULTIPORT(oport1, oval)
106  wait(get_end_time(oval) - sc_time_stamp());
107  }
108 
109  void clean(){}
110 
111 #ifdef FORSYDE_INTROSPECTION
112  void bindInfo()
113  {
114  boundInChans.resize(1); // only one input port
115  boundInChans[0].port = &iport1;
116  boundOutChans.resize(1); // only one output port
117  boundOutChans[0].port = &oport1;
118  }
119 #endif
120 };
121 
123 
125 class comb2 : public ct_process
126 {
127 public:
131 
133  typedef std::function<void(CTTYPE&, const CTTYPE&,
134  const CTTYPE&)> functype;
135 
137 
141  comb2(sc_module_name _name,
142  const functype& _func
143  ) : ct_process(_name), iport1("iport1"), iport2("iport2"), oport1("oport1"),
144  _func(_func)
145  {
146 #ifdef FORSYDE_INTROSPECTION
147  std::string func_name = std::string(basename());
148  func_name = func_name.substr(0, func_name.find_last_not_of("0123456789")+1);
149  arg_vec.push_back(std::make_tuple("_func",func_name+std::string("_func")));
150 #endif
151  }
152 
154  std::string forsyde_kind() const {return "CT::comb2";}
155 private:
156  // Inputs and output sub-signals
157  sub_signal oss;
158  sub_signal iss1;
159  sub_signal iss2;
160 
161  // the current time (local time) and the next time
162  sc_time tl, tn;
163 
164  // clocks of the input ports (channel times)
165  sc_time in1T, in2T;
166 
168  functype _func;
169 
170  //Implementing the abstract semantics
171  void init()
172  {
173  in1T = in2T = tl = tn = SC_ZERO_TIME;
174  set_range(iss1, SC_ZERO_TIME, SC_ZERO_TIME);
175  set_range(iss2, SC_ZERO_TIME, SC_ZERO_TIME);
176  }
177 
178  void prep()
179  {
180  if (in1T == tl)
181  {
182  iss1 = iport1.read();
183  in1T = get_end_time(iss1);
184  }
185  if (in2T == tl)
186  {
187  iss2 = iport2.read();
188  in2T = get_end_time(iss2);
189  }
190 
191  // update the next local clock
192  tn = std::min(in1T, in2T);
193  }
194 
195  void exec()
196  {
197  sub_signal iv1 = iss1;
198  sub_signal iv2 = iss2;
199  oss = sub_signal(tl, tn,
200  [iv1,iv2,this](const sc_time& t)
201  {
202  CTTYPE res;
203  _func(res, iv1(t), iv2(t));
204  return res;
205  }
206  );
207  tl = tn;
208  }
209 
210  void prod()
211  {
212  WRITE_MULTIPORT(oport1, oss)
213  wait(tl - sc_time_stamp());
214  }
215 
216  void clean(){}
217 
218 #ifdef FORSYDE_INTROSPECTION
219  void bindInfo()
220  {
221  boundInChans.resize(2); // only one input port
222  boundInChans[0].port = &iport1;
223  boundInChans[1].port = &iport2;
224  boundOutChans.resize(1); // only one output port
225  boundOutChans[0].port = &oport1;
226  }
227 #endif
228 };
229 
231 
233 template <std::size_t N>
234 class combX : public ct_process
235 {
236 public:
237  std::array<CT_in,N> iport;
239 
241  typedef std::function<void(CTTYPE&, const std::array<CTTYPE,N>&)> functype;
242 
244 
248  combX(sc_module_name _name,
249  const functype& _func
250  ) : ct_process(_name), oport1("oport1"), _func(_func)
251  {
252 #ifdef FORSYDE_INTROSPECTION
253  std::string func_name = std::string(basename());
254  func_name = func_name.substr(0, func_name.find_last_not_of("0123456789")+1);
255  arg_vec.push_back(std::make_tuple("_func",func_name+std::string("_func")));
256 #endif
257  }
258 
260  std::string forsyde_kind() const {return "CT::combX";}
261 private:
262  // Inputs and output sub-signals
263  sub_signal oss;
264  std::array<sub_signal,N> isss;
265 
266  // the current time (local time) and the next time
267  sc_time tl, tn;
268 
269  // clocks of the input ports (channel times)
270  std::array<sc_time,N> insT;
271 
273  functype _func;
274 
275  //Implementing the abstract semantics
276  void init()
277  {
278  tl = tn = SC_ZERO_TIME;
279  std::fill(insT.begin(), insT.end(), SC_ZERO_TIME);
280  for(sub_signal &iss: isss)
281  set_range(iss, SC_ZERO_TIME, SC_ZERO_TIME);
282  }
283 
284  void prep()
285  {
286  for (size_t i=0;i<N;i++)
287  if (insT[i] == tl)
288  {
289  isss[i] = iport[i].read();
290  insT[i] = get_end_time(isss[i]);
291  }
292 
293  // update the next local clock
294  tn = *std::min_element(insT.begin(), insT.end());
295  }
296 
297  void exec()
298  {
299  std::array<sub_signal,N> temp_isss = isss;
300  oss = sub_signal(tl, tn,
301  [temp_isss,this](const sc_time& t)
302  {
303  CTTYPE res;
304  std::array<CTTYPE,N> ivs;
305  for (size_t i=0;i<N;i++)
306  ivs[i] = temp_isss[i](t);
307  _func(res, ivs);
308  return res;
309  }
310  );
311  tl = tn;
312  }
313 
314  void prod()
315  {
316  WRITE_MULTIPORT(oport1, oss)
317  wait(tl - sc_time_stamp());
318  }
319 
320  void clean(){}
321 
322 #ifdef FORSYDE_INTROSPECTION
323  void bindInfo()
324  {
325  boundInChans.resize(N); // N input ports
326  for (size_t i=0;i<N;i++)
327  boundInChans[i].port = &iport[i];
328  boundOutChans.resize(1); // only one output port
329  boundOutChans[0].port = &oport1;
330  }
331 #endif
332 };
333 
335 
341 class delay : public ct_process
342 {
343 public:
346 
348 
352  delay(sc_module_name _name,
353  sc_time delay_time
354  ) : ct_process(_name), iport1("iport1"), oport1("oport1"),
355  delay_time(delay_time)
356  {
357 #ifdef FORSYDE_INTROSPECTION
358  std::stringstream ss;
359  ss << delay_time;
360  arg_vec.push_back(std::make_tuple("delay_time", ss.str()));
361 #endif
362  }
363 
365  std::string forsyde_kind() const {return "CT::delay";}
366 
367 private:
368  // Initial value
369  sc_time delay_time;
370 
371  // Inputs and output variables
372  sub_signal val;
373 
374  //Implementing the abstract semantics
375  void init()
376  {
377  if (delay_time > SC_ZERO_TIME)
378  {
379  WRITE_MULTIPORT(oport1,
380  sub_signal(SC_ZERO_TIME, delay_time,
381  [](const sc_time& t){return 0;}
382  )
383  )
384  wait(delay_time);
385  }
386  }
387 
388  void prep()
389  {
390  val = iport1.read();
391  }
392 
393  void exec()
394  {
395  set_range(val, get_start_time(val)+delay_time,
396  get_end_time(val)+delay_time);
397  }
398 
399  void prod()
400  {
401  WRITE_MULTIPORT(oport1, val)
402  wait(get_end_time(val) - sc_time_stamp());
403  }
404 
405  void clean(){}
406 
407 #ifdef FORSYDE_INTROSPECTION
408  void bindInfo()
409  {
410  boundInChans.resize(1); // only one input port
411  boundInChans[0].port = &iport1;
412  boundOutChans.resize(1); // only one output port
413  boundOutChans[0].port = &oport1;
414  }
415 #endif
416 };
417 
419 
422 class shift : public ct_process
423 {
424 public:
427 
429 
433  shift(sc_module_name _name,
434  sc_time delay_time
435  ) : ct_process(_name), iport1("iport1"), oport1("oport1"),
436  delay_time(delay_time)
437  {
438 #ifdef FORSYDE_INTROSPECTION
439  std::stringstream ss;
440  ss << delay_time;
441  arg_vec.push_back(std::make_tuple("delay_time", ss.str()));
442 #endif
443  }
444 
446  std::string forsyde_kind() const {return "CT::shift";}
447 
448 private:
449  // Initial value
450  sc_time delay_time;
451 
452  // Inputs and output variables
453  sub_signal val;
454 
455  //Implementing the abstract semantics
456  void init()
457  {
458  if (delay_time > SC_ZERO_TIME)
459  {
460  WRITE_MULTIPORT(oport1,
461  sub_signal(SC_ZERO_TIME, delay_time,
462  [](const sc_time& t){return 0;}
463  )
464  )
465  wait(delay_time);
466  }
467  }
468 
469  void prep()
470  {
471  val = iport1.read();
472  }
473 
474  void exec()
475  {
476  set_range(val, get_start_time(val)+delay_time,
477  get_end_time(val)+delay_time);
478  sub_signal v = val;
479  set_function(val, [v,this](const sc_time& t){
480  return get_function(v)(t-delay_time);
481  }
482  );
483  }
484 
485  void prod()
486  {
487  WRITE_MULTIPORT(oport1, val)
488  wait(get_end_time(val) - sc_time_stamp());
489  }
490 
491  void clean() {}
492 
493 #ifdef FORSYDE_INTROSPECTION
494  void bindInfo()
495  {
496  boundInChans.resize(1); // only one input port
497  boundInChans[0].port = &iport1;
498  boundOutChans.resize(1); // only one output port
499  boundOutChans[0].port = &oport1;
500  }
501 #endif
502 };
503 
505 
510 class constant : public ct_process
511 {
512 public:
514 
516 
519  constant(sc_module_name _name,
520  CTTYPE init_val,
521  sc_time end_time
522  ) : ct_process(_name), oport1("oport1"),
523  init_val(init_val)
524 
525  {
526 #ifdef FORSYDE_INTROSPECTION
527  std::stringstream ss;
528  ss << init_val;
529  arg_vec.push_back(std::make_tuple("init_val", ss.str()));
530  ss.str("");
531  ss << end_time;
532  arg_vec.push_back(std::make_tuple("end_time", ss.str()));
533 #endif
534  }
535 
537  std::string forsyde_kind() const {return "CT::constant";}
538 
539 private:
540  CTTYPE init_val;
541  sc_time end_time;
542 
543  //Implementing the abstract semantics
544  void init()
545  {
546  auto ss = sub_signal(sc_time(0,SC_NS), end_time,
547  [this](const sc_time& t){return init_val;}
548  );
549  WRITE_MULTIPORT(oport1, ss)
550  wait(get_end_time(ss) - sc_time_stamp());
551  }
552 
553  void prep() {}
554 
555  void exec()
556  {
557  wait();
558  }
559 
560  void prod() {}
561 
562  void clean() {}
563 
564 #ifdef FORSYDE_INTROSPECTION
565  void bindInfo()
566  {
567  boundOutChans.resize(1); // only one output port
568  boundOutChans[0].port = &oport1;
569  }
570 #endif
571 };
572 
574 
580 class source : public ct_process
581 {
582 public:
584 
586  typedef std::function<void(CTTYPE&, const sc_time&)> functype;
587 
589 
592  source(sc_module_name _name,
593  functype _func,
594  const sc_time& end_time
595  ) : ct_process(_name), oport1("oport1"),
596  _func(_func), end_time(end_time)
597  {
598 #ifdef FORSYDE_INTROSPECTION
599  std::string func_name = std::string(basename());
600  func_name = func_name.substr(0, func_name.find_last_not_of("0123456789")+1);
601  arg_vec.push_back(std::make_tuple("_func",func_name+std::string("_func")));
602  std::stringstream ss;
603  ss << end_time;
604  arg_vec.push_back(std::make_tuple("end_time", ss.str()));
605 #endif
606  }
607 
609  std::string forsyde_kind() const {return "CT::source";}
610 
611 private:
613  functype _func;
614 
615  sc_time end_time; // The end time
616 
617  //Implementing the abstract semantics
618  void init()
619  {
620  auto ss = sub_signal(sc_time(0,SC_NS), end_time,
621  [this](const sc_time& t)
622  {
623  CTTYPE res=0;
624  _func(res, t);
625  return res;
626  }
627  );
628  WRITE_MULTIPORT(oport1, ss)
629  wait(get_end_time(ss) - sc_time_stamp());
630  }
631 
632  void prep() {}
633 
634  void exec()
635  {
636  wait();
637  }
638 
639  void prod() {}
640 
641  void clean(){}
642 
643 #ifdef FORSYDE_INTROSPECTION
644  void bindInfo()
645  {
646  boundOutChans.resize(1); // only one output port
647  boundOutChans[0].port = &oport1;
648  }
649 #endif
650 };
651 
653 
657 class sink : public ct_process
658 {
659 public:
661 
663  typedef std::function<void(const CTTYPE&)> functype;
664 
666 
669  sink(sc_module_name _name,
670  functype _func,
671  sc_time sampling_period
672  ) : ct_process(_name), iport1("iport1"), _func(_func),
673  sampling_period(sampling_period)
674 
675  {
676 #ifdef FORSYDE_INTROSPECTION
677  std::string func_name = std::string(basename());
678  func_name = func_name.substr(0, func_name.find_last_not_of("0123456789")+1);
679  arg_vec.push_back(std::make_tuple("_func",func_name+std::string("_func")));
680 #endif
681  }
682 
684  std::string forsyde_kind() const {return "CT::sink";}
685 
686 private:
687  sub_signal val; // The current read sub_signal
688  sc_time cur_time; // The current time used for sampling
689 
691  functype _func;
692 
693  sc_time sampling_period;
694 
695  //Implementing the abstract semantics
696  void init()
697  {
698  cur_time = sc_time(0, SC_NS);
699  }
700 
701  void prep()
702  {
703  while(get_end_time(val) <= cur_time)
704  val = iport1.read();
705  }
706 
707  void exec()
708  {
709  _func(val(cur_time));
710  cur_time+=sampling_period;
711  }
712 
713  void prod() {}
714 
715  void clean(){}
716 
717 #ifdef FORSYDE_INTROSPECTION
718  void bindInfo()
719  {
720  boundInChans.resize(1); // only one output port
721  boundInChans[0].port = &iport1;
722  }
723 #endif
724 };
725 
727 
733 class traceSig : public ct_process
734 {
735 public:
737 
739 
742  traceSig(sc_module_name _name,
743  const sc_time& sample_period
744  ) : ct_process(_name), iport1("iport1"),
745  sample_period(sample_period)
746  {
747 #ifdef FORSYDE_INTROSPECTION
748  std::stringstream ss;
749  ss << sample_period;
750  arg_vec.push_back(std::make_tuple("sample_period", ss.str()));
751 #endif
752  }
753 
755  std::string forsyde_kind() const {return "CT::traceSig";}
756 
757 private:
758  sc_time sample_period;
759 
760  // The internal variables
761  std::ofstream outFile;
762  sub_signal in_val;
763  sc_time curTime;
764 
765  //Implementing the abstract semantics
766  void init()
767  {
768  outFile.open(name()+std::string(".dat"));
769  if (!outFile.is_open())
770  SC_REPORT_ERROR(name(),"file could not be opened");
771  outFile << "#time " << name() << std::endl;
772  in_val = iport1.read();
773  curTime = get_start_time(in_val);
774  }
775 
776  void prep()
777  {
778  while (curTime >= get_end_time(in_val)) in_val = iport1.read();
779  }
780 
781  void exec() {}
782 
783  void prod()
784  {
785  outFile << curTime.to_seconds() << " " << in_val(curTime)
786  << std::endl;
787  curTime += sample_period;
788  }
789 
790  void clean()
791  {
792  if (outFile.is_open()) outFile.close();
793  }
794 
795 #ifdef FORSYDE_INTROSPECTION
796  void bindInfo()
797  {
798  boundInChans.resize(1); // only one input port
799  boundInChans[0].port = &iport1;
800  }
801 #endif
802 };
803 
805 
814 class fanout : public ct_process
815 {
816 public:
819 
821 
824  fanout(sc_module_name _name) // module name
825  : ct_process(_name) { }
826 
828  std::string forsyde_kind() const {return "CT::fanout";}
829 
830 private:
831  // Inputs and output variables
832  sub_signal* val;
833 
834  //Implementing the abstract semantics
835  void init()
836  {
837  val = new sub_signal;
838  }
839 
840  void prep()
841  {
842  *val = iport1.read();
843  }
844 
845  void exec() {}
846 
847  void prod()
848  {
849  WRITE_MULTIPORT(oport1, *val)
850  wait(get_end_time(*val) - sc_time_stamp());
851  }
852 
853  void clean()
854  {
855  delete val;
856  }
857 #ifdef FORSYDE_INTROSPECTION
858  void bindInfo()
859  {
860  boundInChans.resize(1); // only one input port
861  boundInChans[0].port = &iport1;
862  boundOutChans.resize(1); // only one output port
863  boundOutChans[0].port = &oport1;
864  }
865 #endif
866 };
867 
868 }
869 }
870 
871 #endif
comb(sc_module_name _name, const functype &_func)
The constructor requires the module name.
Definition: ct_process_constructors.hpp:59
The sub-signal type used to construct a CT signal.
Definition: sub_signal.hpp:38
CT_out oport1
port for the output channel
Definition: ct_process_constructors.hpp:513
std::function< void(CTTYPE &, const std::array< CTTYPE, N > &)> functype
Type of the function to be passed to the process constructor.
Definition: ct_process_constructors.hpp:241
traceSig(sc_module_name _name, const sc_time &sample_period)
The constructor requires the module name.
Definition: ct_process_constructors.hpp:742
combX(sc_module_name _name, const functype &_func)
The constructor requires the module name.
Definition: ct_process_constructors.hpp:248
fanout(sc_module_name _name)
The constructor requires the module name.
Definition: ct_process_constructors.hpp:824
std::function< void(CTTYPE &, const sc_time &)> functype
Type of the function to be passed to the process constructor.
Definition: ct_process_constructors.hpp:586
std::string forsyde_kind() const
Specifying from which process constructor is the module built.
Definition: ct_process_constructors.hpp:828
double CTTYPE
Type of the values used in the CT MoC (currently fixed)
Definition: sub_signal.hpp:27
Process constructor for a sink process.
Definition: ct_process_constructors.hpp:657
The namespace for ForSyDe.
Definition: abssemantics.hpp:30
CT_in iport2
port for the input channel 2
Definition: ct_process_constructors.hpp:129
CT_in iport1
port for the input channel
Definition: ct_process_constructors.hpp:48
source(sc_module_name _name, functype _func, const sc_time &end_time)
The constructor requires the module name.
Definition: ct_process_constructors.hpp:592
std::function< void(CTTYPE &, const CTTYPE &)> functype
Type of the function to be passed to the process constructor.
Definition: ct_process_constructors.hpp:52
CT_out oport1
port for the output channel
Definition: ct_process_constructors.hpp:818
CT_in iport1
port for the input channel
Definition: ct_process_constructors.hpp:344
Process constructor for a combinational process with one input and one output.
Definition: ct_process_constructors.hpp:45
Process constructor for a delay element.
Definition: ct_process_constructors.hpp:341
CT_in iport1
port for the input channel
Definition: ct_process_constructors.hpp:736
sink(sc_module_name _name, functype _func, sc_time sampling_period)
The constructor requires the module name.
Definition: ct_process_constructors.hpp:669
CT_out oport1
port for the output channel
Definition: ct_process_constructors.hpp:583
CT_out oport1
port for the output channel
Definition: ct_process_constructors.hpp:345
std::string forsyde_kind() const
Specifying from which process constructor is the module built.
Definition: ct_process_constructors.hpp:446
std::string forsyde_kind() const
Specifying from which process constructor is the module built.
Definition: ct_process_constructors.hpp:260
Process constructor for a trace process.
Definition: ct_process_constructors.hpp:733
The CT_out port is used for output ports of CT processes.
Definition: ct_process.hpp:64
CT_in iport1
port for the input channel
Definition: ct_process_constructors.hpp:425
CT_out oport1
port for the output channel
Definition: ct_process_constructors.hpp:238
delay(sc_module_name _name, sc_time delay_time)
The constructor requires the module name.
Definition: ct_process_constructors.hpp:352
std::array< CT_in, N > iport
port for the input channel array
Definition: ct_process_constructors.hpp:237
std::string forsyde_kind() const
Specifying from which process constructor is the module built.
Definition: ct_process_constructors.hpp:365
std::string forsyde_kind() const
Specifying from which process constructor is the module built.
Definition: ct_process_constructors.hpp:684
CT_in iport1
port for the input channel
Definition: ct_process_constructors.hpp:817
Process constructor for a source process.
Definition: ct_process_constructors.hpp:580
CT_in iport1
port for the input channel
Definition: ct_process_constructors.hpp:660
Process constructor for a combinational process with an array of inputs and one output.
Definition: ct_process_constructors.hpp:234
Implements the abstract process in the CT Model of Computation.
Process constructor for a constant source process.
Definition: ct_process_constructors.hpp:510
The process constructor which defines the abstract semantics of execution.
Definition: abssemantics.hpp:212
shift(sc_module_name _name, sc_time delay_time)
The constructor requires the module name.
Definition: ct_process_constructors.hpp:433
comb2(sc_module_name _name, const functype &_func)
The constructor requires the module name.
Definition: ct_process_constructors.hpp:141
std::string forsyde_kind() const
Specifying from which process constructor is the module built.
Definition: ct_process_constructors.hpp:154
std::function< void(const CTTYPE &)> functype
Type of the function to be passed to the process constructor.
Definition: ct_process_constructors.hpp:663
constant(sc_module_name _name, CTTYPE init_val, sc_time end_time)
The constructor requires the module name.
Definition: ct_process_constructors.hpp:519
std::string forsyde_kind() const
Specifying from which process constructor is the module built.
Definition: ct_process_constructors.hpp:72
Process constructor for a shift element.
Definition: ct_process_constructors.hpp:422
The CT_in port is used for input ports of CT processes.
Definition: ct_process.hpp:53
Process constructor for a fan-out process with one input and one output.
Definition: ct_process_constructors.hpp:814
std::string forsyde_kind() const
Specifying from which process constructor is the module built.
Definition: ct_process_constructors.hpp:755
std::string forsyde_kind() const
Specifying from which process constructor is the module built.
Definition: ct_process_constructors.hpp:609
CT_in iport1
port for the input channel 1
Definition: ct_process_constructors.hpp:128
Process constructor for a combinational process with two inputs and one output.
Definition: ct_process_constructors.hpp:125
CT_out oport1
port for the output channel
Definition: ct_process_constructors.hpp:426
std::string forsyde_kind() const
Specifying from which process constructor is the module built.
Definition: ct_process_constructors.hpp:537
CT_out oport1
port for the output channel
Definition: ct_process_constructors.hpp:49
std::function< void(CTTYPE &, const CTTYPE &, const CTTYPE &)> functype
Type of the function to be passed to the process constructor.
Definition: ct_process_constructors.hpp:134
Implements the sub-components of a CT signal.
CT_out oport1
port for the output channel
Definition: ct_process_constructors.hpp:130