/lib/synopsys/std_logic_signed.vhd

https://github.com/nickg/nvc · VHDL · 343 lines · 227 code · 62 blank · 54 comment · 1 complexity · e8461a9d75ffe0803907d4629087d17e MD5 · raw file

  1. --------------------------------------------------------------------------
  2. -- --
  3. -- Copyright (c) 1990, 1991, 1992 by Synopsys, Inc. --
  4. -- All rights reserved. --
  5. -- --
  6. -- This source file may be used and distributed without restriction --
  7. -- provided that this copyright statement is not removed from the file --
  8. -- and that any derivative work contains this copyright notice. --
  9. -- --
  10. -- Package name: STD_LOGIC_SIGNED --
  11. -- --
  12. -- --
  13. -- Date: 09/11/91 KN --
  14. -- 10/08/92 AMT change std_ulogic to signed std_logic --
  15. -- 10/28/92 AMT added signed functions, -, ABS --
  16. -- --
  17. -- Purpose: --
  18. -- A set of signed arithemtic, conversion, --
  19. -- and comparision functions for STD_LOGIC_VECTOR. --
  20. -- --
  21. -- Note: Comparision of same length std_logic_vector is defined --
  22. -- in the LRM. The interpretation is for unsigned vectors --
  23. -- This package will "overload" that definition. --
  24. -- --
  25. --------------------------------------------------------------------------
  26. library IEEE;
  27. use IEEE.std_logic_1164.all;
  28. use IEEE.std_logic_arith.all;
  29. package STD_LOGIC_SIGNED is
  30. function "+"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
  31. function "+"(L: STD_LOGIC_VECTOR; R: INTEGER) return STD_LOGIC_VECTOR;
  32. function "+"(L: INTEGER; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
  33. function "+"(L: STD_LOGIC_VECTOR; R: STD_LOGIC) return STD_LOGIC_VECTOR;
  34. function "+"(L: STD_LOGIC; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
  35. function "-"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
  36. function "-"(L: STD_LOGIC_VECTOR; R: INTEGER) return STD_LOGIC_VECTOR;
  37. function "-"(L: INTEGER; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
  38. function "-"(L: STD_LOGIC_VECTOR; R: STD_LOGIC) return STD_LOGIC_VECTOR;
  39. function "-"(L: STD_LOGIC; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
  40. function "+"(L: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
  41. function "-"(L: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
  42. function "ABS"(L: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
  43. function "*"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
  44. function "<"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN;
  45. function "<"(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN;
  46. function "<"(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN;
  47. function "<="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN;
  48. function "<="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN;
  49. function "<="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN;
  50. function ">"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN;
  51. function ">"(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN;
  52. function ">"(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN;
  53. function ">="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN;
  54. function ">="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN;
  55. function ">="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN;
  56. function "="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN;
  57. function "="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN;
  58. function "="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN;
  59. function "/="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN;
  60. function "/="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN;
  61. function "/="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN;
  62. function SHL(ARG:STD_LOGIC_VECTOR;COUNT: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
  63. function SHR(ARG:STD_LOGIC_VECTOR;COUNT: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR;
  64. function CONV_INTEGER(ARG: STD_LOGIC_VECTOR) return INTEGER;
  65. -- remove this since it is already in std_logic_arith
  66. -- function CONV_STD_LOGIC_VECTOR(ARG: INTEGER; SIZE: INTEGER) return STD_LOGIC_VECTOR;
  67. end STD_LOGIC_SIGNED;
  68. library IEEE;
  69. use IEEE.std_logic_1164.all;
  70. use IEEE.std_logic_arith.all;
  71. package body STD_LOGIC_SIGNED is
  72. function maximum(L, R: INTEGER) return INTEGER is
  73. begin
  74. if L > R then
  75. return L;
  76. else
  77. return R;
  78. end if;
  79. end;
  80. function "+"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
  81. -- pragma label_applies_to plus
  82. constant length: INTEGER := maximum(L'length, R'length);
  83. variable result : STD_LOGIC_VECTOR (length-1 downto 0);
  84. begin
  85. result := SIGNED(L) + SIGNED(R); -- pragma label plus
  86. return std_logic_vector(result);
  87. end;
  88. function "+"(L: STD_LOGIC_VECTOR; R: INTEGER) return STD_LOGIC_VECTOR is
  89. -- pragma label_applies_to plus
  90. variable result : STD_LOGIC_VECTOR (L'range);
  91. begin
  92. result := SIGNED(L) + R; -- pragma label plus
  93. return std_logic_vector(result);
  94. end;
  95. function "+"(L: INTEGER; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
  96. -- pragma label_applies_to plus
  97. variable result : STD_LOGIC_VECTOR (R'range);
  98. begin
  99. result := L + SIGNED(R); -- pragma label plus
  100. return std_logic_vector(result);
  101. end;
  102. function "+"(L: STD_LOGIC_VECTOR; R: STD_LOGIC) return STD_LOGIC_VECTOR is
  103. -- pragma label_applies_to plus
  104. variable result : STD_LOGIC_VECTOR (L'range);
  105. begin
  106. result := SIGNED(L) + R; -- pragma label plus
  107. return std_logic_vector(result);
  108. end;
  109. function "+"(L: STD_LOGIC; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
  110. -- pragma label_applies_to plus
  111. variable result : STD_LOGIC_VECTOR (R'range);
  112. begin
  113. result := L + SIGNED(R); -- pragma label plus
  114. return std_logic_vector(result);
  115. end;
  116. function "-"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
  117. -- pragma label_applies_to minus
  118. constant length: INTEGER := maximum(L'length, R'length);
  119. variable result : STD_LOGIC_VECTOR (length-1 downto 0);
  120. begin
  121. result := SIGNED(L) - SIGNED(R); -- pragma label minus
  122. return std_logic_vector(result);
  123. end;
  124. function "-"(L: STD_LOGIC_VECTOR; R: INTEGER) return STD_LOGIC_VECTOR is
  125. -- pragma label_applies_to minus
  126. variable result : STD_LOGIC_VECTOR (L'range);
  127. begin
  128. result := SIGNED(L) - R; -- pragma label minus
  129. return std_logic_vector(result);
  130. end;
  131. function "-"(L: INTEGER; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
  132. -- pragma label_applies_to minus
  133. variable result : STD_LOGIC_VECTOR (R'range);
  134. begin
  135. result := L - SIGNED(R); -- pragma label minus
  136. return std_logic_vector(result);
  137. end;
  138. function "-"(L: STD_LOGIC_VECTOR; R: STD_LOGIC) return STD_LOGIC_VECTOR is
  139. -- pragma label_applies_to minus
  140. variable result : STD_LOGIC_VECTOR (L'range);
  141. begin
  142. result := SIGNED(L) - R; -- pragma label minus
  143. return std_logic_vector(result);
  144. end;
  145. function "-"(L: STD_LOGIC; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
  146. -- pragma label_applies_to minus
  147. variable result : STD_LOGIC_VECTOR (R'range);
  148. begin
  149. result := L - SIGNED(R); -- pragma label minus
  150. return std_logic_vector(result);
  151. end;
  152. function "+"(L: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
  153. -- pragma label_applies_to plus
  154. variable result : STD_LOGIC_VECTOR (L'range);
  155. begin
  156. result := + SIGNED(L); -- pragma label plus
  157. return std_logic_vector(result);
  158. end;
  159. function "-"(L: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
  160. -- pragma label_applies_to minus
  161. variable result : STD_LOGIC_VECTOR (L'range);
  162. begin
  163. result := - SIGNED(L); -- pragma label minus
  164. return std_logic_vector(result);
  165. end;
  166. function "ABS"(L: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
  167. variable result : STD_LOGIC_VECTOR (L'range);
  168. begin
  169. result := ABS( SIGNED(L));
  170. return std_logic_vector(result);
  171. end;
  172. function "*"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
  173. -- pragma label_applies_to mult
  174. constant length: INTEGER := maximum(L'length, R'length);
  175. variable result : STD_LOGIC_VECTOR ((L'length+R'length-1) downto 0);
  176. begin
  177. result := SIGNED(L) * SIGNED(R); -- pragma label mult
  178. return std_logic_vector(result);
  179. end;
  180. function "<"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN is
  181. -- pragma label_applies_to lt
  182. constant length: INTEGER := maximum(L'length, R'length);
  183. begin
  184. return SIGNED(L) < SIGNED(R); -- pragma label lt
  185. end;
  186. function "<"(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN is
  187. -- pragma label_applies_to lt
  188. begin
  189. return SIGNED(L) < R; -- pragma label lt
  190. end;
  191. function "<"(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN is
  192. -- pragma label_applies_to lt
  193. begin
  194. return L < SIGNED(R); -- pragma label lt
  195. end;
  196. function "<="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN is
  197. -- pragma label_applies_to leq
  198. begin
  199. return SIGNED(L) <= SIGNED(R); -- pragma label leq
  200. end;
  201. function "<="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN is
  202. -- pragma label_applies_to leq
  203. begin
  204. return SIGNED(L) <= R; -- pragma label leq
  205. end;
  206. function "<="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN is
  207. -- pragma label_applies_to leq
  208. begin
  209. return L <= SIGNED(R); -- pragma label leq
  210. end;
  211. function ">"(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN is
  212. -- pragma label_applies_to gt
  213. begin
  214. return SIGNED(L) > SIGNED(R); -- pragma label gt
  215. end;
  216. function ">"(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN is
  217. -- pragma label_applies_to gt
  218. begin
  219. return SIGNED(L) > R; -- pragma label gt
  220. end;
  221. function ">"(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN is
  222. -- pragma label_applies_to gt
  223. begin
  224. return L > SIGNED(R); -- pragma label gt
  225. end;
  226. function ">="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN is
  227. -- pragma label_applies_to geq
  228. begin
  229. return SIGNED(L) >= SIGNED(R); -- pragma label geq
  230. end;
  231. function ">="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN is
  232. -- pragma label_applies_to geq
  233. begin
  234. return SIGNED(L) >= R; -- pragma label geq
  235. end;
  236. function ">="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN is
  237. -- pragma label_applies_to geq
  238. begin
  239. return L >= SIGNED(R); -- pragma label geq
  240. end;
  241. function "="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN is
  242. begin
  243. return SIGNED(L) = SIGNED(R);
  244. end;
  245. function "="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN is
  246. begin
  247. return SIGNED(L) = R;
  248. end;
  249. function "="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN is
  250. begin
  251. return L = SIGNED(R);
  252. end;
  253. function "/="(L: STD_LOGIC_VECTOR; R: STD_LOGIC_VECTOR) return BOOLEAN is
  254. begin
  255. return SIGNED(L) /= SIGNED(R);
  256. end;
  257. function "/="(L: STD_LOGIC_VECTOR; R: INTEGER) return BOOLEAN is
  258. begin
  259. return SIGNED(L) /= R;
  260. end;
  261. function "/="(L: INTEGER; R: STD_LOGIC_VECTOR) return BOOLEAN is
  262. begin
  263. return L /= SIGNED(R);
  264. end;
  265. function SHL(ARG:STD_LOGIC_VECTOR;COUNT: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
  266. begin
  267. return STD_LOGIC_VECTOR(SHL(SIGNED(ARG),UNSIGNED(COUNT)));
  268. end;
  269. function SHR(ARG:STD_LOGIC_VECTOR;COUNT: STD_LOGIC_VECTOR) return STD_LOGIC_VECTOR is
  270. begin
  271. return STD_LOGIC_VECTOR(SHR(SIGNED(ARG),UNSIGNED(COUNT)));
  272. end;
  273. -- This function converts std_logic_vector to a signed integer value
  274. -- using a conversion function in std_logic_arith
  275. function CONV_INTEGER(ARG: STD_LOGIC_VECTOR) return INTEGER is
  276. variable result : SIGNED(ARG'range);
  277. begin
  278. result := SIGNED(ARG);
  279. return CONV_INTEGER(result);
  280. end;
  281. end STD_LOGIC_SIGNED;