TRM.Channels.Mod 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. (**
  2. AUTHOR "Felix Friedrich and Alexey Morozov";
  3. PURPOSE "ActiveCells AXI-4 Stream input/output for Tiny Register Machine (TRM) implemented on an FPGA";
  4. *)
  5. MODULE Channels;
  6. IMPORT
  7. SYSTEM;
  8. CONST
  9. ValidFlag* = (*100H;*) 010H;
  10. ReadyFlag* = (*200H;*) 020H;
  11. (** Send data to an output port (blocking version) *)
  12. PROCEDURE Send*(portAddr: ADDRESS; x: LONGINT);
  13. BEGIN
  14. REPEAT UNTIL SYSTEM.BIT(portAddr+ReadyFlag,0); (* wait until the sink is ready *)
  15. SYSTEM.PUT(portAddr,x);
  16. END Send;
  17. (** Send data to an output port (non-blocking version) *)
  18. PROCEDURE SendNonBlocking*(portAddr: ADDRESS; x: LONGINT): BOOLEAN;
  19. BEGIN
  20. IF SYSTEM.BIT(portAddr+ReadyFlag,0) THEN
  21. SYSTEM.PUT(portAddr,x);
  22. RETURN TRUE;
  23. ELSE
  24. RETURN FALSE;
  25. END;
  26. END SendNonBlocking;
  27. (** Receive data from an input port (blocking version) *)
  28. PROCEDURE Receive*(portAddr: ADDRESS; VAR x: LONGINT);
  29. BEGIN
  30. REPEAT UNTIL SYSTEM.BIT(portAddr+ValidFlag,0); (* wait until the source data is valid *)
  31. SYSTEM.GET(portAddr,x);
  32. END Receive;
  33. (** Receive data from an input port (non-blocking version) *)
  34. PROCEDURE ReceiveNonBlocking*(portAddr: ADDRESS; VAR x: LONGINT): BOOLEAN;
  35. BEGIN
  36. IF SYSTEM.BIT(portAddr+ValidFlag,0) THEN
  37. SYSTEM.GET(portAddr,x);
  38. RETURN TRUE;
  39. ELSE
  40. RETURN FALSE;
  41. END;
  42. END ReceiveNonBlocking;
  43. (** Send a block of bytes to a port *)
  44. PROCEDURE SendBytes*(portAddr: ADDRESS; CONST x: ARRAY OF CHAR; offs, len: LONGINT);
  45. BEGIN
  46. WHILE len > 0 DO
  47. Send(portAddr,ORD(x[offs]));
  48. INC(offs); DEC(len);
  49. END;
  50. END SendBytes;
  51. (** Receive a block of bytes from a port *)
  52. PROCEDURE ReceiveBytes*(portAddr: ADDRESS; VAR x: ARRAY OF CHAR; offs, len: LONGINT);
  53. VAR v: LONGINT;
  54. BEGIN
  55. WHILE len > 0 DO
  56. Receive(portAddr,v); x[offs] := CHR(v);
  57. INC(offs); DEC(len);
  58. END;
  59. END ReceiveBytes;
  60. (** Send a character to a port *)
  61. PROCEDURE SendChar*(portAddr: ADDRESS; ch: CHAR);
  62. BEGIN
  63. Send(portAddr,ORD(ch));
  64. END SendChar;
  65. (** Send a null terminated strings; the terminating null is not sent *)
  66. PROCEDURE SendString*(portAddr: ADDRESS; CONST str: ARRAY OF CHAR);
  67. VAR i: LONGINT;
  68. BEGIN
  69. i := 0;
  70. WHILE (i < LEN(str)) & (str[i] # 0X) DO
  71. Send(portAddr,ORD(str[i]));
  72. INC(i);
  73. END;
  74. END SendString;
  75. (** Send an integer in decimal right-justified in a field of at least w characters *)
  76. PROCEDURE SendInt*(portAddr: ADDRESS; x, w: LONGINT);
  77. VAR
  78. i, x0, y: LONGINT;
  79. str: ARRAY 12 OF CHAR;
  80. BEGIN
  81. IF x < 0 THEN
  82. IF x = MIN(LONGINT) THEN
  83. DEC(w,11);
  84. WHILE w > 0 DO SendChar(portAddr,' '); DEC(w); END;
  85. SendString(portAddr,"-2147483648"); RETURN;
  86. ELSE DEC(w); x0 := -x;
  87. END
  88. ELSIF x = 0 THEN
  89. WHILE w > 1 DO SendChar(portAddr,' '); DEC(w); END;
  90. SendChar(portAddr,'0'); RETURN;
  91. ELSE x0 := x;
  92. END;
  93. i := 0;
  94. WHILE x0 > 0 DO
  95. y := x0 DIV 10;
  96. str[i] := CHR(x0 - (y*10)+48); (*k := y*10; k := x0-k; k := k + 48; str[i] := CHR(k);*)
  97. x0 := y;
  98. INC(i);
  99. END;
  100. WHILE w > i DO SendChar(portAddr,' '); DEC(w); END;
  101. IF x < 0 THEN SendChar(portAddr,'-') END;
  102. REPEAT DEC(i); SendChar(portAddr,str[i]); UNTIL i = 0;
  103. END SendInt;
  104. END Channels.