plu.h 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. #ifndef __LPCPLU_H__
  2. #define __LPCPLU_H__
  3. #ifdef __cplusplus
  4. extern "C" {
  5. #endif
  6. //#define CONFIG_PLU_nLUT_IN (5)
  7. //#define CONFIG_PLU_nIN (6) /* Number of inputs */
  8. //#define CONFIG_PLU_nLU (26) /* Number of LUTs */
  9. //#define CONFIG_PLU_nFF (4) /* Number of FFs */
  10. //#define CONFIG_PLU_nOU (8) /* Number of outputs */
  11. #define LUT_INs 5
  12. #define PLU_INs 6
  13. #define PLU_LUTs 26
  14. #define PLU_FFs 4
  15. #define PLU_OUTs 8
  16. #pragma anon_unions
  17. typedef struct
  18. {
  19. struct { /* Input select register for LUT & Input... */
  20. union {
  21. __IO uint32_t INP[8]; /* Each LUT has maximum 5 inputs, the remaining are reserved. */
  22. struct {
  23. __IO uint32_t INP0;
  24. __IO uint32_t INP1;
  25. __IO uint32_t INP2;
  26. __IO uint32_t INP3;
  27. __IO uint32_t INP4;
  28. uint32_t RESERVED[3];
  29. };
  30. } LUT_MUX[PLU_LUTs];
  31. };
  32. uint32_t RESERVED0[8*64-8*PLU_LUTs]; /* ...-0x7FC */
  33. __IO uint32_t LUT_TRUTH[PLU_LUTs]; /* Truth-Table ("Look-up Table") programming */
  34. uint32_t RESERVED1[64-PLU_LUTs]; /* ...-0x8FC */
  35. __I uint32_t OUTPUTS; /* PLU Outputs Register (Read-only) */
  36. uint32_t RESERVED2[3*64-1]; /* ...-0xBFC */
  37. __IO uint32_t OUTPUT_MUX[PLU_OUTs]; /* Select register for PLU Ouptut */
  38. } LPC_PLU_T;
  39. /* PLU driver error code */
  40. #define PLU_OK 0
  41. #define PLU_INPUT_OUT_OF_RANGE 1
  42. #define PLU_LUT_OUT_OF_RANGE 2
  43. #define PLU_FF_OUT_OF_RANGE 3
  44. #define PLU_OUTPUT_OUT_OF_RANGE 4
  45. #define PLU_LUT_IN_DEFAULT 999
  46. #define PLU_ROUTINE_FAILED 9999
  47. #define PLU_STDL_OUT_OF_RANGE 0xDEAD
  48. /* PLU masks, and micros if PLU tool is not used. */
  49. #define LUT_OUT_MASK (1<<7)
  50. #define FF_OUT_MASK (1<<6)
  51. #define PLU_INPUT_MASK (0<<6)
  52. #define LUT_OUT(x) (LUT_OUT_MASK | (x & 0x7F))
  53. #define FF_OUT(x) (FF_OUT_MASK | (x & 0x3F))
  54. #define PLU_INPUT(x) (PLU_INPUT_MASK | (x & 0x3F))
  55. #define LUT_IN_OFFSET_INPUT 0
  56. #define LUT_IN_OFFSET_LUT_OUT (PLU_INs)
  57. #define LUT_IN_OFFSET_FF (PLU_INs+PLU_LUTs)
  58. #define LUT_IN_PLU_INPUT(x) (LUT_IN_OFFSET_INPUT+x)
  59. #define LUT_IN_LUT_OUT(x) (LUT_IN_OFFSET_LUT_OUT+x)
  60. #define LUT_IN_FF(x) (LUT_IN_OFFSET_FF+x)
  61. #define PLU_OUT_OFFSET_LUT_OUT 0
  62. #define PLU_OUT_OFFSET_FF (PLU_LUTs)
  63. #define PLU_OUT_LUT(x) (PLU_OUT_OFFSET_LUT_OUT+x)
  64. #define PLU_OUT_FF(x) (PLU_OUT_OFFSET_FF+x)
  65. extern uint32_t generate_plu_tt(uint32_t (* pnt_tt_function)(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t), uint32_t * pnt_tt);
  66. #define INMUX_IN(x) (x)
  67. #define INMUX_LUT(x) (PLU_INs+x)
  68. #define INMUX_FF(x) (PLU_INs+PLU_LUTs+x)
  69. #define INMUXDEF(x) INMUX_LUT(x)
  70. #define PLU_LUT_5IN_CUSTOM(lut,in0,in1,in2,in3,in4,tt) LPC_PLU0->LUT_MUX[lut].INP[0]=in0; \
  71. LPC_PLU0->LUT_MUX[lut].INP[1]=in1; \
  72. LPC_PLU0->LUT_MUX[lut].INP[2]=in2; \
  73. LPC_PLU0->LUT_MUX[lut].INP[3]=in3; \
  74. LPC_PLU0->LUT_MUX[lut].INP[4]=in4; \
  75. LPC_PLU0->LUT_TRUTH[lut]=tt
  76. #define PLU_LUT_4IN_CUSTOM(lut,in0,in1,in2,in3,tt) PLU_LUT_5IN_CUSTOM(lut,in0,in1,in2,in3,INMUXDEF(lut),tt)
  77. #define PLU_LUT_3IN_CUSTOM(lut,in0,in1,in2,tt) PLU_LUT_5IN_CUSTOM(lut,in0,in1,in2,INMUXDEF(lut),INMUXDEF(lut),tt)
  78. #define PLU_LUT_2IN_CUSTOM(lut,in0,in1,tt) PLU_LUT_5IN_CUSTOM(lut,in0,in1,INMUXDEF(lut),INMUXDEF(lut),INMUXDEF(lut),tt)
  79. #define PLU_LUT_2IN_AND(lut,in0,in1) PLU_LUT_2IN_CUSTOM(lut,in0,in1,0x88888888)
  80. #define PLU_LUT_3IN_AND(lut,in0,in1,in2) PLU_LUT_3IN_CUSTOM(lut,in0,in1,in2,0x80808080)
  81. #define PLU_LUT_4IN_AND(lut,in0,in1,in2,in3) PLU_LUT_4IN_CUSTOM(lut,in0,in1,in2,in3,0x80008000)
  82. #define PLU_LUT_5IN_AND(lut,in0,in1,in2,in3,in4) PLU_LUT_5IN_CUSTOM(lut,in0,in1,in2,in3,in4,0x80000000)
  83. #define PLU_LUT_2IN_NAND(lut,in0,in1) PLU_LUT_2IN_CUSTOM(lut,in0,in1,0x77777777)
  84. #define PLU_LUT_3IN_NAND(lut,in0,in1,in2) PLU_LUT_3IN_CUSTOM(lut,in0,in1,in2,0x7F7F7F7F)
  85. #define PLU_LUT_4IN_NAND(lut,in0,in1,in2,in3) PLU_LUT_4IN_CUSTOM(lut,in0,in1,in2,in3,0x7FFF7FFF)
  86. #define PLU_LUT_5IN_NAND(lut,in0,in1,in2,in3,in4) PLU_LUT_5IN_CUSTOM(lut,in0,in1,in2,in3,in4,0x7FFFFFFF)
  87. #define PLU_LUT_2IN_OR(lut,in0,in1) PLU_LUT_2IN_CUSTOM(lut,in0,in1,0xEEEEEEEE)
  88. #define PLU_LUT_3IN_OR(lut,in0,in1,in2) PLU_LUT_3IN_CUSTOM(lut,in0,in1,in2,0xFEFEFEFE)
  89. #define PLU_LUT_4IN_OR(lut,in0,in1,in2,in3) PLU_LUT_4IN_CUSTOM(lut,in0,in1,in2,in3,0xFFFEFFFE)
  90. #define PLU_LUT_5IN_OR(lut,in0,in1,in2,in3,in4) PLU_LUT_5IN_CUSTOM(lut,in0,in1,in2,in3,in4,0xFFFFFFFE)
  91. #define PLU_LUT_2IN_NOR(lut,in0,in1) PLU_LUT_2IN_CUSTOM(lut,in0,in1,0x11111111)
  92. #define PLU_LUT_3IN_NOR(lut,in0,in1,in2) PLU_LUT_3IN_CUSTOM(lut,in0,in1,in2,0x01010101)
  93. #define PLU_LUT_4IN_NOR(lut,in0,in1,in2,in3) PLU_LUT_4IN_CUSTOM(lut,in0,in1,in2,in3,0x00010001)
  94. #define PLU_LUT_5IN_NOR(lut,in0,in1,in2,in3,in4) PLU_LUT_5IN_CUSTOM(lut,in0,in1,in2,in3,in4,0x00000001)
  95. #define PLU_LUT_2IN_XOR(lut,in0,in1) PLU_LUT_2IN_CUSTOM(lut,in0,in1,0x66666666)
  96. #define PLU_LUT_3IN_XOR(lut,in0,in1,in2) PLU_LUT_3IN_CUSTOM(lut,in0,in1,in2,0x96969696)
  97. #define PLU_LUT_4IN_XOR(lut,in0,in1,in2,in3) PLU_LUT_4IN_CUSTOM(lut,in0,in1,in2,in3,0x69966996)
  98. #define PLU_LUT_5IN_XOR(lut,in0,in1,in2,in3,in4) PLU_LUT_5IN_CUSTOM(lut,in0,in1,in2,in3,in4,0x96696996)
  99. #define PLU_LUT_2IN_XNOR(lut,in0,in1) PLU_LUT_2IN_CUSTOM(lut,in0,in1,0x99999999)
  100. #define PLU_LUT_3IN_XNOR(lut,in0,in1,in2) PLU_LUT_3IN_CUSTOM(lut,in0,in1,in2,0x69696969)
  101. #define PLU_LUT_4IN_XNOR(lut,in0,in1,in2,in3) PLU_LUT_4IN_CUSTOM(lut,in0,in1,in2,in3,0x96699669)
  102. #define PLU_LUT_5IN_XNOR(lut,in0,in1,in2,in3,in4) PLU_LUT_5IN_CUSTOM(lut,in0,in1,in2,in3,in4,0x69969669)
  103. #define PLU_LUT_2IN1SEL_MUX(lut,in0,in1,in2) PLU_LUT_3IN_CUSTOM(lut,in0,in1,in2,0xCACACACA)
  104. #define PLU_LUT_BUFFER(lut,in0) PLU_LUT_2IN_CUSTOM(lut,in0,INMUXDEF(lut),0xAAAAAAAA)
  105. #define PLU_LUT_INVERTER(lut,in0) PLU_LUT_2IN_CUSTOM(lut,in0,INMUXDEF(lut),0x55555555)
  106. #define OUTMUX_LUT(x) (x)
  107. #define OUTMUX_FF(x) (PLU_LUTs+x)
  108. #define PLU_OUT(out,src) LPC_PLU0->OUTPUT_MUX[out]=src
  109. #ifdef __cplusplus
  110. }
  111. #endif
  112. #endif /* __LPCPLU_H__ */