Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
FORMUS3IC_LAS3
/
embb
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
a5182aa5
authored
9 years ago
by
Marcus Winter
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
dataflow_cpp: support for default token count
parent
64b15b2a
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
192 additions
and
61 deletions
+192
-61
dataflow_cpp/include/embb/dataflow/internal/in.h
+9
-0
dataflow_cpp/include/embb/dataflow/internal/inputs.h
+56
-5
dataflow_cpp/include/embb/dataflow/internal/node.h
+9
-1
dataflow_cpp/include/embb/dataflow/internal/process.h
+20
-9
dataflow_cpp/include/embb/dataflow/internal/select.h
+6
-1
dataflow_cpp/include/embb/dataflow/internal/sink.h
+21
-14
dataflow_cpp/include/embb/dataflow/internal/switch.h
+5
-1
dataflow_cpp/include/embb/dataflow/network.h
+66
-30
No files found.
dataflow_cpp/include/embb/dataflow/internal/in.h
View file @
a5182aa5
...
@@ -74,7 +74,15 @@ class In {
...
@@ -74,7 +74,15 @@ class In {
void
SetConnected
()
{
connected_
=
true
;
}
void
SetConnected
()
{
connected_
=
true
;
}
void
SetSlices
(
int
slices
)
{
void
SetSlices
(
int
slices
)
{
if
(
0
<
slices_
)
{
for
(
int
ii
=
0
;
ii
<
slices_
;
ii
++
)
{
values_
[
ii
].
~
SignalType
();
}
embb
::
base
::
Allocation
::
Free
(
values_
);
values_
=
NULL
;
}
slices_
=
slices
;
slices_
=
slices
;
if
(
0
<
slices_
)
{
values_
=
reinterpret_cast
<
SignalType
*>
(
values_
=
reinterpret_cast
<
SignalType
*>
(
embb
::
base
::
Allocation
::
Allocate
(
embb
::
base
::
Allocation
::
Allocate
(
sizeof
(
SignalType
)
*
slices_
));
sizeof
(
SignalType
)
*
slices_
));
...
@@ -82,6 +90,7 @@ class In {
...
@@ -82,6 +90,7 @@ class In {
new
(
&
values_
[
ii
])
SignalType
();
new
(
&
values_
[
ii
])
SignalType
();
}
}
}
}
}
void
SetListener
(
ClockListener
*
listener
)
{
listener_
=
listener
;
}
void
SetListener
(
ClockListener
*
listener
)
{
listener_
=
listener
;
}
...
...
This diff is collapsed.
Click to expand it.
dataflow_cpp/include/embb/dataflow/internal/inputs.h
View file @
a5182aa5
...
@@ -59,6 +59,7 @@ class Inputs<embb::base::internal::Nil, embb::base::internal::Nil,
...
@@ -59,6 +59,7 @@ class Inputs<embb::base::internal::Nil, embb::base::internal::Nil,
bool
IsFullyConnected
()
{
bool
IsFullyConnected
()
{
return
true
;
return
true
;
}
}
void
SetSlices
(
int
/*slices*/
)
{}
};
};
template
<
typename
T1
>
template
<
typename
T1
>
...
@@ -69,13 +70,23 @@ class Inputs<T1, embb::base::internal::Nil, embb::base::internal::Nil,
...
@@ -69,13 +70,23 @@ class Inputs<T1, embb::base::internal::Nil, embb::base::internal::Nil,
embb
::
base
::
internal
::
Nil
>
embb
::
base
::
internal
::
Nil
>
,
public
ClockListener
{
,
public
ClockListener
{
public
:
public
:
explicit
Inputs
(
int
slices
)
:
count_
(
NULL
),
slices_
(
slices
)
{
explicit
Inputs
()
:
count_
(
NULL
),
slices_
(
0
)
{
// empty
}
void
SetSlices
(
int
slices
)
{
if
(
0
<
slices_
)
{
embb
::
base
::
Allocation
::
Free
(
count_
);
count_
=
NULL
;
}
slices_
=
slices
;
if
(
0
<
slices_
)
{
count_
=
reinterpret_cast
<
embb
::
base
::
Atomic
<
int
>*>
(
count_
=
reinterpret_cast
<
embb
::
base
::
Atomic
<
int
>*>
(
embb
::
base
::
Allocation
::
Allocate
(
embb
::
base
::
Allocation
::
Allocate
(
sizeof
(
embb
::
base
::
Atomic
<
int
>
)
*
slices_
));
sizeof
(
embb
::
base
::
Atomic
<
int
>
)
*
slices_
));
for
(
int
ii
=
0
;
ii
<
slices_
;
ii
++
)
{
for
(
int
ii
=
0
;
ii
<
slices_
;
ii
++
)
{
count_
[
ii
]
=
1
;
count_
[
ii
]
=
1
;
}
}
}
this
->
template
Get
<
0
>
().
SetSlices
(
slices_
);
this
->
template
Get
<
0
>
().
SetSlices
(
slices_
);
}
}
~
Inputs
()
{
~
Inputs
()
{
...
@@ -122,13 +133,23 @@ class Inputs<T1, T2, embb::base::internal::Nil,
...
@@ -122,13 +133,23 @@ class Inputs<T1, T2, embb::base::internal::Nil,
embb
::
base
::
internal
::
Nil
,
embb
::
base
::
internal
::
Nil
>
embb
::
base
::
internal
::
Nil
,
embb
::
base
::
internal
::
Nil
>
,
public
ClockListener
{
,
public
ClockListener
{
public
:
public
:
explicit
Inputs
(
int
slices
)
:
count_
(
NULL
),
slices_
(
slices
)
{
explicit
Inputs
()
:
count_
(
NULL
),
slices_
(
0
)
{
// empty
}
void
SetSlices
(
int
slices
)
{
if
(
0
<
slices_
)
{
embb
::
base
::
Allocation
::
Free
(
count_
);
count_
=
NULL
;
}
slices_
=
slices
;
if
(
0
<
slices_
)
{
count_
=
reinterpret_cast
<
embb
::
base
::
Atomic
<
int
>*>
(
count_
=
reinterpret_cast
<
embb
::
base
::
Atomic
<
int
>*>
(
embb
::
base
::
Allocation
::
Allocate
(
embb
::
base
::
Allocation
::
Allocate
(
sizeof
(
embb
::
base
::
Atomic
<
int
>
)
*
slices_
));
sizeof
(
embb
::
base
::
Atomic
<
int
>
)
*
slices_
));
for
(
int
ii
=
0
;
ii
<
slices_
;
ii
++
)
{
for
(
int
ii
=
0
;
ii
<
slices_
;
ii
++
)
{
count_
[
ii
]
=
2
;
count_
[
ii
]
=
2
;
}
}
}
this
->
template
Get
<
0
>
().
SetSlices
(
slices_
);
this
->
template
Get
<
0
>
().
SetSlices
(
slices_
);
this
->
template
Get
<
1
>
().
SetSlices
(
slices_
);
this
->
template
Get
<
1
>
().
SetSlices
(
slices_
);
}
}
...
@@ -181,13 +202,23 @@ class Inputs<T1, T2, T3, embb::base::internal::Nil,
...
@@ -181,13 +202,23 @@ class Inputs<T1, T2, T3, embb::base::internal::Nil,
embb
::
base
::
internal
::
Nil
,
embb
::
base
::
internal
::
Nil
>
embb
::
base
::
internal
::
Nil
,
embb
::
base
::
internal
::
Nil
>
,
public
ClockListener
{
,
public
ClockListener
{
public
:
public
:
explicit
Inputs
(
int
slices
)
:
count_
(
NULL
),
slices_
(
slices
)
{
explicit
Inputs
()
:
count_
(
NULL
),
slices_
(
0
)
{
// empty
}
void
SetSlices
(
int
slices
)
{
if
(
0
<
slices_
)
{
embb
::
base
::
Allocation
::
Free
(
count_
);
count_
=
NULL
;
}
slices_
=
slices
;
if
(
0
<
slices_
)
{
count_
=
reinterpret_cast
<
embb
::
base
::
Atomic
<
int
>*>
(
count_
=
reinterpret_cast
<
embb
::
base
::
Atomic
<
int
>*>
(
embb
::
base
::
Allocation
::
Allocate
(
embb
::
base
::
Allocation
::
Allocate
(
sizeof
(
embb
::
base
::
Atomic
<
int
>
)
*
slices_
));
sizeof
(
embb
::
base
::
Atomic
<
int
>
)
*
slices_
));
for
(
int
ii
=
0
;
ii
<
slices_
;
ii
++
)
{
for
(
int
ii
=
0
;
ii
<
slices_
;
ii
++
)
{
count_
[
ii
]
=
3
;
count_
[
ii
]
=
3
;
}
}
}
this
->
template
Get
<
0
>
().
SetSlices
(
slices_
);
this
->
template
Get
<
0
>
().
SetSlices
(
slices_
);
this
->
template
Get
<
1
>
().
SetSlices
(
slices_
);
this
->
template
Get
<
1
>
().
SetSlices
(
slices_
);
this
->
template
Get
<
2
>
().
SetSlices
(
slices_
);
this
->
template
Get
<
2
>
().
SetSlices
(
slices_
);
...
@@ -245,13 +276,23 @@ class Inputs<T1, T2, T3, T4, embb::base::internal::Nil>
...
@@ -245,13 +276,23 @@ class Inputs<T1, T2, T3, T4, embb::base::internal::Nil>
In
<
T4
>
,
embb
::
base
::
internal
::
Nil
>
In
<
T4
>
,
embb
::
base
::
internal
::
Nil
>
,
public
ClockListener
{
,
public
ClockListener
{
public
:
public
:
explicit
Inputs
(
int
slices
)
:
count_
(
NULL
),
slices_
(
slices
)
{
explicit
Inputs
()
:
count_
(
NULL
),
slices_
(
0
)
{
// empty
}
void
SetSlices
(
int
slices
)
{
if
(
0
<
slices_
)
{
embb
::
base
::
Allocation
::
Free
(
count_
);
count_
=
NULL
;
}
slices_
=
slices
;
if
(
0
<
slices_
)
{
count_
=
reinterpret_cast
<
embb
::
base
::
Atomic
<
int
>*>
(
count_
=
reinterpret_cast
<
embb
::
base
::
Atomic
<
int
>*>
(
embb
::
base
::
Allocation
::
Allocate
(
embb
::
base
::
Allocation
::
Allocate
(
sizeof
(
embb
::
base
::
Atomic
<
int
>
)
*
slices_
));
sizeof
(
embb
::
base
::
Atomic
<
int
>
)
*
slices_
));
for
(
int
ii
=
0
;
ii
<
slices_
;
ii
++
)
{
for
(
int
ii
=
0
;
ii
<
slices_
;
ii
++
)
{
count_
[
ii
]
=
4
;
count_
[
ii
]
=
4
;
}
}
}
this
->
template
Get
<
0
>
().
SetSlices
(
slices_
);
this
->
template
Get
<
0
>
().
SetSlices
(
slices_
);
this
->
template
Get
<
1
>
().
SetSlices
(
slices_
);
this
->
template
Get
<
1
>
().
SetSlices
(
slices_
);
this
->
template
Get
<
2
>
().
SetSlices
(
slices_
);
this
->
template
Get
<
2
>
().
SetSlices
(
slices_
);
...
@@ -316,13 +357,23 @@ class Inputs
...
@@ -316,13 +357,23 @@ class Inputs
In
<
T4
>
,
In
<
T5
>
>
In
<
T4
>
,
In
<
T5
>
>
,
public
ClockListener
{
,
public
ClockListener
{
public
:
public
:
explicit
Inputs
(
int
slices
)
:
count_
(
NULL
),
slices_
(
slices
)
{
explicit
Inputs
()
:
count_
(
NULL
),
slices_
(
0
)
{
// empty
}
void
SetSlices
(
int
slices
)
{
if
(
0
<
slices_
)
{
embb
::
base
::
Allocation
::
Free
(
count_
);
count_
=
NULL
;
}
slices_
=
slices
;
if
(
0
<
slices_
)
{
count_
=
reinterpret_cast
<
embb
::
base
::
Atomic
<
int
>*>
(
count_
=
reinterpret_cast
<
embb
::
base
::
Atomic
<
int
>*>
(
embb
::
base
::
Allocation
::
Allocate
(
embb
::
base
::
Allocation
::
Allocate
(
sizeof
(
embb
::
base
::
Atomic
<
int
>
)
*
slices_
));
sizeof
(
embb
::
base
::
Atomic
<
int
>
)
*
slices_
));
for
(
int
ii
=
0
;
ii
<
slices_
;
ii
++
)
{
for
(
int
ii
=
0
;
ii
<
slices_
;
ii
++
)
{
count_
[
ii
]
=
5
;
count_
[
ii
]
=
5
;
}
}
}
this
->
template
Get
<
0
>
().
SetSlices
(
slices_
);
this
->
template
Get
<
0
>
().
SetSlices
(
slices_
);
this
->
template
Get
<
1
>
().
SetSlices
(
slices_
);
this
->
template
Get
<
1
>
().
SetSlices
(
slices_
);
this
->
template
Get
<
2
>
().
SetSlices
(
slices_
);
this
->
template
Get
<
2
>
().
SetSlices
(
slices_
);
...
...
This diff is collapsed.
Click to expand it.
dataflow_cpp/include/embb/dataflow/internal/node.h
View file @
a5182aa5
...
@@ -49,13 +49,21 @@ class Node {
...
@@ -49,13 +49,21 @@ class Node {
EMBB_THROW
(
embb
::
base
::
ErrorException
,
EMBB_THROW
(
embb
::
base
::
ErrorException
,
"Nodes are started implicitly."
);
"Nodes are started implicitly."
);
}
}
void
SetScheduler
(
Scheduler
*
sched
)
{
sched_
=
sched
;
if
(
NULL
!=
sched_
)
{
SetSlices
(
sched_
->
GetSlices
());
}
else
{
SetSlices
(
0
);
}
}
protected
:
protected
:
Scheduler
*
sched_
;
Scheduler
*
sched_
;
static
int
next_process_id_
;
static
int
next_process_id_
;
void
SetScheduler
(
Scheduler
*
sched
)
{
sched_
=
sched
;
}
static
int
GetNextProcessID
()
{
return
next_process_id_
++
;
}
static
int
GetNextProcessID
()
{
return
next_process_id_
++
;
}
virtual
void
SetSlices
(
int
/*slices*/
)
{};
};
};
}
// namespace internal
}
// namespace internal
...
...
This diff is collapsed.
Click to expand it.
dataflow_cpp/include/embb/dataflow/internal/process.h
View file @
a5182aa5
...
@@ -53,11 +53,11 @@ class Process< Serial, Inputs<I1, I2, I3, I4, I5>,
...
@@ -53,11 +53,11 @@ class Process< Serial, Inputs<I1, I2, I3, I4, I5>,
typedef
ProcessExecutor
<
InputsType
,
OutputsType
>
ExecutorType
;
typedef
ProcessExecutor
<
InputsType
,
OutputsType
>
ExecutorType
;
typedef
typename
ExecutorType
::
FunctionType
FunctionType
;
typedef
typename
ExecutorType
::
FunctionType
FunctionType
;
Process
(
int
slices
,
Scheduler
*
sched
,
FunctionType
function
)
Process
(
Scheduler
*
sched
,
FunctionType
function
)
:
inputs_
(
slices
)
:
inputs_
()
,
executor_
(
function
)
,
executor_
(
function
)
,
action_
(
NULL
)
,
action_
(
NULL
)
,
slices_
(
slices
)
{
,
slices_
(
0
)
{
next_clock_
=
0
;
next_clock_
=
0
;
queued_clock_
=
0
;
queued_clock_
=
0
;
bool
ordered
=
Serial
;
bool
ordered
=
Serial
;
...
@@ -67,12 +67,6 @@ class Process< Serial, Inputs<I1, I2, I3, I4, I5>,
...
@@ -67,12 +67,6 @@ class Process< Serial, Inputs<I1, I2, I3, I4, I5>,
queue_id_
=
0
;
queue_id_
=
0
;
}
}
inputs_
.
SetListener
(
this
);
inputs_
.
SetListener
(
this
);
action_
=
reinterpret_cast
<
Action
*>
(
embb
::
base
::
Allocation
::
Allocate
(
sizeof
(
Action
)
*
slices_
));
for
(
int
ii
=
0
;
ii
<
slices_
;
ii
++
)
{
action_
[
ii
]
=
Action
();
}
SetScheduler
(
sched
);
SetScheduler
(
sched
);
}
}
...
@@ -173,6 +167,23 @@ class Process< Serial, Inputs<I1, I2, I3, I4, I5>,
...
@@ -173,6 +167,23 @@ class Process< Serial, Inputs<I1, I2, I3, I4, I5>,
embb
::
base
::
Atomic
<
int
>
queued_clock_
;
embb
::
base
::
Atomic
<
int
>
queued_clock_
;
int
queue_id_
;
int
queue_id_
;
int
slices_
;
int
slices_
;
virtual
void
SetSlices
(
int
slices
)
{
if
(
0
<
slices_
)
{
embb
::
base
::
Allocation
::
Free
(
action_
);
action_
=
NULL
;
}
slices_
=
slices
;
inputs_
.
SetSlices
(
slices
);
if
(
0
<
slices_
)
{
action_
=
reinterpret_cast
<
Action
*>
(
embb
::
base
::
Allocation
::
Allocate
(
sizeof
(
Action
)
*
slices_
));
for
(
int
ii
=
0
;
ii
<
slices_
;
ii
++
)
{
action_
[
ii
]
=
Action
();
}
}
}
};
};
}
// namespace internal
}
// namespace internal
...
...
This diff is collapsed.
Click to expand it.
dataflow_cpp/include/embb/dataflow/internal/select.h
View file @
a5182aa5
...
@@ -44,7 +44,7 @@ class Select
...
@@ -44,7 +44,7 @@ class Select
typedef
Inputs
<
bool
,
Type
,
Type
>
InputsType
;
typedef
Inputs
<
bool
,
Type
,
Type
>
InputsType
;
typedef
Outputs
<
Type
>
OutputsType
;
typedef
Outputs
<
Type
>
OutputsType
;
Select
(
int
slices
,
Scheduler
*
sched
)
:
inputs_
(
slices
),
slices_
(
slices
)
{
Select
(
Scheduler
*
sched
)
:
inputs_
(),
slices_
(
0
)
{
inputs_
.
SetListener
(
this
);
inputs_
.
SetListener
(
this
);
SetScheduler
(
sched
);
SetScheduler
(
sched
);
}
}
...
@@ -119,6 +119,11 @@ class Select
...
@@ -119,6 +119,11 @@ class Select
InputsType
inputs_
;
InputsType
inputs_
;
OutputsType
outputs_
;
OutputsType
outputs_
;
int
slices_
;
int
slices_
;
virtual
void
SetSlices
(
int
slices
)
{
slices_
=
slices
;
inputs_
.
SetSlices
(
slices
);
}
};
};
}
// namespace internal
}
// namespace internal
...
...
This diff is collapsed.
Click to expand it.
dataflow_cpp/include/embb/dataflow/internal/sink.h
View file @
a5182aa5
...
@@ -48,23 +48,17 @@ class Sink< Inputs<I1, I2, I3, I4, I5> >
...
@@ -48,23 +48,17 @@ class Sink< Inputs<I1, I2, I3, I4, I5> >
typedef
SinkExecutor
<
InputsType
>
ExecutorType
;
typedef
SinkExecutor
<
InputsType
>
ExecutorType
;
typedef
typename
ExecutorType
::
FunctionType
FunctionType
;
typedef
typename
ExecutorType
::
FunctionType
FunctionType
;
Sink
(
int
slices
,
Scheduler
*
sched
,
ClockListener
*
listener
,
Sink
(
Scheduler
*
sched
,
ClockListener
*
listener
,
FunctionType
function
)
FunctionType
function
)
:
inputs_
(
slices
)
:
inputs_
()
,
executor_
(
function
)
,
executor_
(
function
)
,
action_
(
NULL
)
,
action_
(
NULL
)
,
slices_
(
slices
)
{
,
slices_
(
0
)
{
next_clock_
=
0
;
next_clock_
=
0
;
queued_clock_
=
0
;
queued_clock_
=
0
;
queue_id_
=
GetNextProcessID
();
queue_id_
=
GetNextProcessID
();
inputs_
.
SetListener
(
this
);
inputs_
.
SetListener
(
this
);
action_
=
reinterpret_cast
<
Action
*>
(
listener_
=
listener
;
embb
::
base
::
Allocation
::
Allocate
(
sizeof
(
Action
)
*
slices_
));
for
(
int
ii
=
0
;
ii
<
slices_
;
ii
++
)
{
action_
[
ii
]
=
Action
();
}
SetListener
(
listener
);
SetScheduler
(
sched
);
SetScheduler
(
sched
);
}
}
...
@@ -74,10 +68,6 @@ class Sink< Inputs<I1, I2, I3, I4, I5> >
...
@@ -74,10 +68,6 @@ class Sink< Inputs<I1, I2, I3, I4, I5> >
}
}
}
}
void
SetListener
(
ClockListener
*
listener
)
{
listener_
=
listener
;
}
virtual
bool
HasInputs
()
const
{
virtual
bool
HasInputs
()
const
{
return
inputs_
.
Size
()
>
0
;
return
inputs_
.
Size
()
>
0
;
}
}
...
@@ -143,6 +133,23 @@ class Sink< Inputs<I1, I2, I3, I4, I5> >
...
@@ -143,6 +133,23 @@ class Sink< Inputs<I1, I2, I3, I4, I5> >
embb
::
base
::
Atomic
<
int
>
queued_clock_
;
embb
::
base
::
Atomic
<
int
>
queued_clock_
;
int
queue_id_
;
int
queue_id_
;
int
slices_
;
int
slices_
;
virtual
void
SetSlices
(
int
slices
)
{
if
(
0
<
slices_
)
{
embb
::
base
::
Allocation
::
Free
(
action_
);
action_
=
NULL
;
}
slices_
=
slices
;
inputs_
.
SetSlices
(
slices
);
if
(
0
<
slices_
)
{
action_
=
reinterpret_cast
<
Action
*>
(
embb
::
base
::
Allocation
::
Allocate
(
sizeof
(
Action
)
*
slices_
));
for
(
int
ii
=
0
;
ii
<
slices_
;
ii
++
)
{
action_
[
ii
]
=
Action
();
}
}
}
};
};
}
// namespace internal
}
// namespace internal
...
...
This diff is collapsed.
Click to expand it.
dataflow_cpp/include/embb/dataflow/internal/switch.h
View file @
a5182aa5
...
@@ -44,7 +44,7 @@ class Switch
...
@@ -44,7 +44,7 @@ class Switch
typedef
Inputs
<
bool
,
Type
>
InputsType
;
typedef
Inputs
<
bool
,
Type
>
InputsType
;
typedef
Outputs
<
Type
,
Type
>
OutputsType
;
typedef
Outputs
<
Type
,
Type
>
OutputsType
;
Switch
(
int
slices
,
Scheduler
*
sched
)
:
inputs_
(
slices
)
{
Switch
(
Scheduler
*
sched
)
:
inputs_
(
)
{
inputs_
.
SetListener
(
this
);
inputs_
.
SetListener
(
this
);
SetScheduler
(
sched
);
SetScheduler
(
sched
);
}
}
...
@@ -115,6 +115,10 @@ class Switch
...
@@ -115,6 +115,10 @@ class Switch
private
:
private
:
InputsType
inputs_
;
InputsType
inputs_
;
OutputsType
outputs_
;
OutputsType
outputs_
;
virtual
void
SetSlices
(
int
slices
)
{
inputs_
.
SetSlices
(
slices
);
}
};
};
}
// namespace internal
}
// namespace internal
...
...
This diff is collapsed.
Click to expand it.
dataflow_cpp/include/embb/dataflow/network.h
View file @
a5182aa5
...
@@ -58,6 +58,14 @@ class Network {
...
@@ -58,6 +58,14 @@ class Network {
public
:
public
:
/**
/**
* Constructs an empty network.
* Constructs an empty network.
* \note The number of concurrent tokens will be derived from the structure
* of the network automatically on the first call to operator () and the
* corresponding resources will be allocated then.
*/
Network
()
{}
/**
* Constructs an empty network.
* \param slices Number of concurrent tokens allowed in the network.
* \param slices Number of concurrent tokens allowed in the network.
*/
*/
explicit
Network
(
int
slices
)
{}
explicit
Network
(
int
slices
)
{}
...
@@ -673,6 +681,10 @@ class Network {
...
@@ -673,6 +681,10 @@ class Network {
/**
/**
* Executes the network until one of the the sources returns \c false.
* Executes the network until one of the the sources returns \c false.
* \note If the network was default constructed the number of concurrent
* tokens will be derived from the structure of the network automatically
* on the first call of the operator and the corresponding resources will
* be allocated then.
*/
*/
void
operator
()
();
void
operator
()
();
};
};
...
@@ -681,22 +693,14 @@ class Network {
...
@@ -681,22 +693,14 @@ class Network {
class
Network
:
public
internal
::
ClockListener
{
class
Network
:
public
internal
::
ClockListener
{
public
:
public
:
explicit
Network
(
int
slices
=
0
)
Network
()
:
sink_counter_
(
NULL
),
slices_
(
slices
),
sched_
(
NULL
)
{
:
sink_counter_
(
NULL
),
sink_count_
(
0
),
slices_
(
0
),
sched_
(
NULL
)
{
if
(
0
>=
slices
)
{
// empty
slices_
=
int
(
embb_core_count_available
())
*
4
;
}
}
sched_
=
embb
::
base
::
Allocation
::
New
<
internal
::
SchedulerMTAPI
>
(
slices_
);
if
(
sched_
->
GetSlices
()
!=
slices_
)
{
explicit
Network
(
int
slices
)
slices_
=
sched_
->
GetSlices
();
:
sink_counter_
(
NULL
),
sink_count_
(
0
),
slices_
(
slices
),
sched_
(
NULL
)
{
}
PrepareSlices
();
sink_counter_
=
reinterpret_cast
<
embb
::
base
::
Atomic
<
int
>*>
(
embb
::
base
::
Allocation
::
Allocate
(
sizeof
(
embb
::
base
::
Atomic
<
int
>
)
*
slices_
));
for
(
int
ii
=
0
;
ii
<
slices_
;
ii
++
)
{
sink_counter_
[
ii
]
=
0
;
}
sink_count_
=
0
;
}
}
~
Network
()
{
~
Network
()
{
...
@@ -710,24 +714,22 @@ class Network : public internal::ClockListener {
...
@@ -710,24 +714,22 @@ class Network : public internal::ClockListener {
}
}
}
}
template
<
typename
T1
,
typename
T2
=
embb
::
base
::
internal
::
Nil
,
template
<
typename
T1
,
typename
T2
=
embb
::
base
::
internal
::
Nil
,
typename
T3
=
embb
::
base
::
internal
::
Nil
,
typename
T3
=
embb
::
base
::
internal
::
Nil
,
typename
T4
=
embb
::
base
::
internal
::
Nil
,
typename
T4
=
embb
::
base
::
internal
::
Nil
,
typename
T5
=
embb
::
base
::
internal
::
Nil
>
typename
T5
=
embb
::
base
::
internal
::
Nil
>
class
Inputs
:
public
internal
::
Inputs
<
T1
,
T2
,
T3
,
T4
,
T5
>
{
class
Inputs
{
public
:
// empty
explicit
Inputs
(
int
slices
)
:
internal
::
Inputs
<
T1
,
T2
,
T3
,
T4
,
T5
>
(
slices
)
{}
};
};
template
<
typename
T1
,
typename
T2
=
embb
::
base
::
internal
::
Nil
,
template
<
typename
T1
,
typename
T2
=
embb
::
base
::
internal
::
Nil
,
typename
T3
=
embb
::
base
::
internal
::
Nil
,
typename
T3
=
embb
::
base
::
internal
::
Nil
,
typename
T4
=
embb
::
base
::
internal
::
Nil
,
typename
T4
=
embb
::
base
::
internal
::
Nil
,
typename
T5
=
embb
::
base
::
internal
::
Nil
>
typename
T5
=
embb
::
base
::
internal
::
Nil
>
class
Outputs
:
public
internal
::
Outputs
<
T1
,
T2
,
T3
,
T4
,
T5
>
{
class
Outputs
{
public
:
// empty
Outputs
()
:
internal
::
Outputs
<
T1
,
T2
,
T3
,
T4
,
T5
>
()
{}
};
};
template
<
class
Inputs
,
class
Outputs
>
class
SerialProcess
;
template
<
class
Inputs
,
class
Outputs
>
class
SerialProcess
;
...
@@ -749,7 +751,7 @@ class Network : public internal::ClockListener {
...
@@ -749,7 +751,7 @@ class Network : public internal::ClockListener {
:
internal
::
Process
<
true
,
:
internal
::
Process
<
true
,
internal
::
Inputs
<
I1
,
I2
,
I3
,
I4
,
I5
>
,
internal
::
Inputs
<
I1
,
I2
,
I3
,
I4
,
I5
>
,
internal
::
Outputs
<
O1
,
O2
,
O3
,
O4
,
O5
>
>
(
internal
::
Outputs
<
O1
,
O2
,
O3
,
O4
,
O5
>
>
(
network
.
s
lices_
,
network
.
s
ched_
,
function
)
{
network
.
sched_
,
function
)
{
network
.
processes_
.
push_back
(
this
);
network
.
processes_
.
push_back
(
this
);
}
}
};
};
...
@@ -773,7 +775,7 @@ class Network : public internal::ClockListener {
...
@@ -773,7 +775,7 @@ class Network : public internal::ClockListener {
:
internal
::
Process
<
false
,
:
internal
::
Process
<
false
,
internal
::
Inputs
<
I1
,
I2
,
I3
,
I4
,
I5
>
,
internal
::
Inputs
<
I1
,
I2
,
I3
,
I4
,
I5
>
,
internal
::
Outputs
<
O1
,
O2
,
O3
,
O4
,
O5
>
>
(
internal
::
Outputs
<
O1
,
O2
,
O3
,
O4
,
O5
>
>
(
network
.
s
lices_
,
network
.
s
ched_
,
function
)
{
network
.
sched_
,
function
)
{
network
.
processes_
.
push_back
(
this
);
network
.
processes_
.
push_back
(
this
);
}
}
};
};
...
@@ -782,7 +784,7 @@ class Network : public internal::ClockListener {
...
@@ -782,7 +784,7 @@ class Network : public internal::ClockListener {
class
Switch
:
public
internal
::
Switch
<
Type
>
{
class
Switch
:
public
internal
::
Switch
<
Type
>
{
public
:
public
:
explicit
Switch
(
Network
&
network
)
explicit
Switch
(
Network
&
network
)
:
internal
::
Switch
<
Type
>
(
network
.
s
lices_
,
network
.
s
ched_
)
{
:
internal
::
Switch
<
Type
>
(
network
.
sched_
)
{
network
.
processes_
.
push_back
(
this
);
network
.
processes_
.
push_back
(
this
);
}
}
};
};
...
@@ -791,7 +793,7 @@ class Network : public internal::ClockListener {
...
@@ -791,7 +793,7 @@ class Network : public internal::ClockListener {
class
Select
:
public
internal
::
Select
<
Type
>
{
class
Select
:
public
internal
::
Select
<
Type
>
{
public
:
public
:
explicit
Select
(
Network
&
network
)
explicit
Select
(
Network
&
network
)
:
internal
::
Select
<
Type
>
(
network
.
s
lices_
,
network
.
s
ched_
)
{
:
internal
::
Select
<
Type
>
(
network
.
sched_
)
{
network
.
processes_
.
push_back
(
this
);
network
.
processes_
.
push_back
(
this
);
}
}
};
};
...
@@ -809,7 +811,7 @@ class Network : public internal::ClockListener {
...
@@ -809,7 +811,7 @@ class Network : public internal::ClockListener {
explicit
Sink
(
Network
&
network
,
FunctionType
function
)
explicit
Sink
(
Network
&
network
,
FunctionType
function
)
:
internal
::
Sink
<
:
internal
::
Sink
<
internal
::
Inputs
<
I1
,
I2
,
I3
,
I4
,
I5
>
>
(
internal
::
Inputs
<
I1
,
I2
,
I3
,
I4
,
I5
>
>
(
network
.
s
lices_
,
network
.
s
ched_
,
&
network
,
function
)
{
network
.
sched_
,
&
network
,
function
)
{
network
.
sinks_
.
push_back
(
this
);
network
.
sinks_
.
push_back
(
this
);
network
.
sink_count_
++
;
network
.
sink_count_
++
;
}
}
...
@@ -857,6 +859,27 @@ class Network : public internal::ClockListener {
...
@@ -857,6 +859,27 @@ class Network : public internal::ClockListener {
}
}
void
operator
()
()
{
void
operator
()
()
{
if
(
0
>=
slices_
)
{
slices_
=
static_cast
<
int
>
(
sources_
.
size
()
+
sinks_
.
size
());
for
(
size_t
ii
=
0
;
ii
<
processes_
.
size
();
ii
++
)
{
int
tt
=
processes_
[
ii
]
->
IsSequential
()
?
1
:
static_cast
<
int
>
(
embb_core_count_available
());
slices_
+=
tt
;
}
PrepareSlices
();
for
(
size_t
ii
=
0
;
ii
<
sources_
.
size
();
ii
++
)
{
sources_
[
ii
]
->
SetScheduler
(
sched_
);
}
for
(
size_t
ii
=
0
;
ii
<
processes_
.
size
();
ii
++
)
{
processes_
[
ii
]
->
SetScheduler
(
sched_
);
}
for
(
size_t
ii
=
0
;
ii
<
sinks_
.
size
();
ii
++
)
{
sinks_
[
ii
]
->
SetScheduler
(
sched_
);
}
}
int
clock
=
0
;
int
clock
=
0
;
while
(
clock
>=
0
)
{
while
(
clock
>=
0
)
{
const
int
idx
=
clock
%
slices_
;
const
int
idx
=
clock
%
slices_
;
...
@@ -913,6 +936,19 @@ class Network : public internal::ClockListener {
...
@@ -913,6 +936,19 @@ class Network : public internal::ClockListener {
}
}
return
result
;
return
result
;
}
}
void
PrepareSlices
()
{
sched_
=
embb
::
base
::
Allocation
::
New
<
internal
::
SchedulerMTAPI
>
(
slices_
);
if
(
sched_
->
GetSlices
()
!=
slices_
)
{
slices_
=
sched_
->
GetSlices
();
}
sink_counter_
=
reinterpret_cast
<
embb
::
base
::
Atomic
<
int
>*>
(
embb
::
base
::
Allocation
::
Allocate
(
sizeof
(
embb
::
base
::
Atomic
<
int
>
)
*
slices_
));
for
(
int
ii
=
0
;
ii
<
slices_
;
ii
++
)
{
sink_counter_
[
ii
]
=
0
;
}
}
};
};
#endif // DOXYGEN
#endif // DOXYGEN
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment