Features listed below are early versions and should be considered as "experimental".
Users can evaluate the feature, however the feature is not fully tested at TI side.
TI would not support these feature on public e2e.
Experimental features will be enabled with limited examples and SW modules.
TISP (TI signal processing) is a software library that strives to abstract away the software and the hardware complexity of programming the C7x.
Introduction
A typical signal chain is shown in the figure below. Basically, a collection of kernels (nodes) stitched together. A set of these kernels in the signal chain are grouped for DMA (supernode). Typically, in user applications, the complete data needs to be processed by nodes encapsulated inside the supernode before calling the next node in the signal chain. Nodes (kernels) themselves perform compute using data in L2SRAM. Data movement from DDR to L2SRAM (DMA) is accomplished via DRU (data routing unit) available within the C7x.
Typical Signal Chain
Node-level Abstraction
In order to create a common baseline for kernels from various libraries, we first create a virtual class TISP::virtualOp. Doing so, allows us to create a class for every kernel in a given library that is derived from the base virtual class TISP::virtualOp. Please note that node-level abstraction is not available for all kernels of a given library. Please refer to DSPLIB Nodes for supported nodes.
Node-Level Abstraction
Employing this methodology enables us to string a bunch of nodes together through a custom vector datatype, TISP::opVec. An example of the matrix transpose kernel from DSPLIB described as a class TISP::DSPLIB::matTrans is shown below. Please refer to the DSPLIB documentation for more details about the data structures pertaining to DSPLIB.
The data flow while connecting nodes is depicted through the pointer addresses shared between the nodes when creating a node through its class constructor. Whilst the compute flow is represented via the order in which the nodes are pushed back into TISP::opVec. Thus allowing us to create any given signal chain as a graph.
Connecting Nodes
An example code snippet is shown below for connecting creating and connecting nodes together, taken from TISP_fft1dBatched_test.cpp. After creating nodes via constructors and pushing them back into TISP::opVec with the desired order, TISP::execute::graph can be called to iterate through the vector of nodes to call the execute function pertaining to a given node.
We employ a similar strategy that was used to abstract nodes for supernodes as well. In the case of supernodes, we could have various variants such as TISP::SuperNode::i2d_to_o2d, TISP::SuperNode::i2d_to_o2d, etc. Further styles of supernodes will be added as we expand the scope of this library/framework. Note that variants of supernode are derived from a non-virtual base class TISP::SuperNode::superNode.
Supernode-Level Abstraction
An example code snippet for one input one output supernode is shown below. The DRU parameters are programmed to access the input and output DDR space in a 2D form.
Connecting and execution supernodes is also similar to nodes. The execution order of the kernels inside the supernode is determined by the TISP::opVec datastructure passed to the supernode constructor as argument.
Connecting Supernodes
Please refer to 2D FFT example section below for more details.
2D FFT Example
The example has two supernodes connected together as shown in the figure below.
2D FFT Example
Shown below is the code snippet that depicts the 2D FFT graph. The code snippet is taken from TISP_fft2d_superNode_test.cpp.