You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CMSIS-DSP/ComputeGraph/examples/example10/graph.py

140 lines
3.3 KiB
Python

from cmsisdsp.cg.scheduler import *
### Define new types of Nodes
class SinkAsync(GenericSink):
def __init__(self,name,theType,inLength):
GenericSink.__init__(self,name)
self.addInput("i",theType,inLength)
@property
def typeName(self):
return "SinkAsync"
class SourceOdd(GenericSource):
def __init__(self,name,theType,inLength):
GenericSource.__init__(self,name)
self.addOutput("o",theType,inLength)
@property
def typeName(self):
return "SourceOdd"
class SourceEven(GenericSource):
def __init__(self,name,theType,inLength):
GenericSource.__init__(self,name)
self.addOutput("o",theType,inLength)
@property
def typeName(self):
return "SourceEven"
class ProcessingOddEven(GenericNode):
def __init__(self,name,theType,inLength,outLength):
GenericNode.__init__(self,name)
self.addInput("ia",theType,inLength)
self.addInput("ib",theType,inLength)
self.addOutput("o",theType,outLength)
@property
def typeName(self):
return "ProcessingOddEven"
### Define nodes
dataType=CType(SINT16)
odd=SourceOdd("sourceOdd",dataType,1)
even=SourceEven("sourceEven",dataType,1)
proc=ProcessingOddEven("proc",dataType,1,1)
comp=Unary("compute",dataType,1)
sinka=SinkAsync("sinka",dataType,1)
sinkb=SinkAsync("sinkb",dataType,1)
debug=NullSink("debug",dataType,1)
g = Graph()
# Option to customize the default class
# to use for Duplicate and FIFO
# FIFO class can also be changed in the connect
# function to change the class for a specific
# connection
g.defaultFIFOClass = "FIFO"
g.duplicateNodeClassName = "Duplicate"
g.connect(odd.o,proc.ia)
g.connect(even.o,proc.ib)
# Just for checking duplicate nodes
# with scaling factor are working.
# In practice, all edge of a duplicate nodes
# should have same FIFO size
g.connect(odd.o,debug.i,fifoScale=3.0)
g.connect(proc.o,comp.i)
g.connect(comp.o,sinka.i)
g.connect(comp.o,sinkb.i)
print("Generate graphviz and code")
conf=Configuration()
conf.debugLimit=10
conf.cOptionalArgs=""
# It is disabled in asynchronous mode
# since the schedule has no mor any reason to
# be periodic and thus the FIFO content can
# overlap several executions of the schedule
conf.memoryOptimization=True
conf.codeArray = True
conf.switchCase = True
# Asynchronous mode enable. It implies
# switchCase and codeArray true
conf.asynchronous = True
# Increase size of synchronous FIFOs by 100%
# for the asynchronous case (so 2 samples
# instead of 1 in this example)
#conf.FIFOIncrease = 100 # percent
conf.FIFOIncrease = 2.0
#conf.displayFIFOSizes=True
# Prefix for global FIFO buffers
#conf.prefix="sched1"
#conf.dumpSchedule = True
sched = g.computeSchedule(config=conf)
#print(sched.schedule)
print("Schedule length = %d" % sched.scheduleLength)
print("Memory usage %d bytes" % sched.memory)
#
#conf.postCustomCName = "post.h"
#conf.CAPI = True
#conf.prefix="global"
#conf.dumpFIFO = True
#conf.CMSISDSP = False
#conf.codeArray = False
#conf.switchCase = False
# For pure functions (like CMSIS-DSP) which are not
# packaged in a C++ class, we have to decide of the
# asynchronous policy. What must be done in case of
# FIFO overflow or underflow.
# By default, the execution is skipped.
conf.asyncDefaultSkip = True
sched.ccode("./generated",conf)
with open("test.dot","w") as f:
sched.graphviz(f)