LMemLoopbackMAX5CManager.maxj 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. /**
  2. * Document: MaxCompiler Tutorial (maxcompiler-tutorial.pdf)
  3. * Chapter: 13 Example: 2 Name: LMem Loopback
  4. * MaxFile name: LMemLoopback
  5. * Summary:
  6. * Connects the Kernel's input / output streams to LMem. Also creates one
  7. * input and one output stream for accessing the LMem directly from the CPU
  8. * software.
  9. */
  10. package perfmodels;
  11. import com.maxeler.maxcompiler.v2.build.EngineParameters;
  12. import com.maxeler.maxcompiler.v2.kernelcompiler.Kernel;
  13. import com.maxeler.maxcompiler.v2.managers.custom.DFELink;
  14. import com.maxeler.maxcompiler.v2.managers.custom.blocks.KernelBlock;
  15. import com.maxeler.maxcompiler.v2.managers.custom.stdlib.LMemCommandGroup;
  16. import com.maxeler.maxcompiler.v2.managers.custom.stdlib.LMemInterface;
  17. import com.maxeler.maxcompiler.v2.managers.engine_interfaces.CPUTypes;
  18. import com.maxeler.maxcompiler.v2.managers.engine_interfaces.EngineInterface;
  19. import com.maxeler.maxcompiler.v2.managers.engine_interfaces.EngineInterface.Direction;
  20. import com.maxeler.maxcompiler.v2.managers.engine_interfaces.InterfaceParam;
  21. import com.maxeler.platform.max5.manager.MAX5CManager;
  22. public class LMemLoopbackMAX5CManager extends MAX5CManager {
  23. private static final CPUTypes TYPE = CPUTypes.INT32;
  24. public LMemLoopbackMAX5CManager(EngineParameters params) {
  25. super(params);
  26. Kernel kernel = new LMemLoopbackKernel(makeKernelParameters("LMemLoopbackKernel"));
  27. KernelBlock kernelBlock = addKernel(kernel);
  28. LMemInterface iface = addLMemInterface();
  29. DFELink cpu2lmem = iface.addStreamToLMem("cpu2lmem", LMemCommandGroup.MemoryAccessPattern.LINEAR_1D);
  30. DFELink lmem2cpu = iface.addStreamFromLMem("lmem2cpu", LMemCommandGroup.MemoryAccessPattern.LINEAR_1D);
  31. DFELink fromcpu = addStreamFromCPU("fromcpu");
  32. DFELink tocpu = addStreamToCPU("tocpu");
  33. cpu2lmem <== fromcpu;
  34. tocpu <== lmem2cpu;
  35. DFELink inA = iface.addStreamFromLMem("inA", LMemCommandGroup.MemoryAccessPattern.LINEAR_1D);
  36. DFELink inB = iface.addStreamFromLMem("inB", LMemCommandGroup.MemoryAccessPattern.LINEAR_1D);
  37. kernelBlock.getInput("inA") <== inA;
  38. kernelBlock.getInput("inB") <== inB;
  39. DFELink oData = iface.addStreamToLMem("oData", LMemCommandGroup.MemoryAccessPattern.LINEAR_1D);
  40. oData <== kernelBlock.getOutput("oData");
  41. createSlicInterface(interfaceDefault());
  42. createSlicInterface(interfaceWrite("writeLMem"));
  43. createSlicInterface(interfaceRead("readLMem"));
  44. }
  45. public static void main(String[] args) {
  46. LMemLoopbackMAX5CManager manager = new LMemLoopbackMAX5CManager(new EngineParameters(args));
  47. manager.build();
  48. }
  49. private static EngineInterface interfaceDefault() {
  50. EngineInterface ei = new EngineInterface();
  51. InterfaceParam N = ei.addParam("N", TYPE);
  52. InterfaceParam zero = ei.addConstant(0l);
  53. ei.setTicks("LMemLoopbackKernel", N);
  54. InterfaceParam sizeInBytes = N * TYPE.sizeInBytes();
  55. ei.setLMemLinear("inA", zero, sizeInBytes);
  56. ei.setLMemLinear("inB", sizeInBytes, sizeInBytes);
  57. ei.setLMemLinear("oData", 2 * sizeInBytes, sizeInBytes);
  58. ei.ignoreAll(Direction.IN_OUT);
  59. return ei;
  60. }
  61. private static EngineInterface interfaceWrite(String name) {
  62. EngineInterface ei = new EngineInterface(name);
  63. InterfaceParam size = ei.addParam("size", TYPE);
  64. InterfaceParam start = ei.addParam("start", TYPE);
  65. InterfaceParam sizeInBytes = size * TYPE.sizeInBytes();
  66. ei.setStream("fromcpu", TYPE, sizeInBytes );
  67. ei.setLMemLinear("cpu2lmem", start * TYPE.sizeInBytes(), sizeInBytes);
  68. ei.ignoreAll(Direction.IN_OUT);
  69. return ei;
  70. }
  71. private static EngineInterface interfaceRead(String name) {
  72. EngineInterface ei = new EngineInterface(name);
  73. InterfaceParam size = ei.addParam("size", TYPE);
  74. InterfaceParam start = ei.addParam("start", TYPE);
  75. InterfaceParam sizeInBytes = size * TYPE.sizeInBytes();
  76. ei.setLMemLinear("lmem2cpu", start * TYPE.sizeInBytes(), sizeInBytes);
  77. ei.setStream("tocpu", TYPE, sizeInBytes);
  78. ei.ignoreAll(Direction.IN_OUT);
  79. return ei;
  80. }
  81. }