- TOP là một generic.
VÀ QUÁ TRÌNH TRÀN
8.2 LƯỢNG QUÁ TẢI CHƯƠNG TRÌNHCON (subprogram ):
Đơi khi nĩ cĩ hai hoặc nhiều hơn các chương trình con cĩ cùng tên , điều đĩ hợp pháp . Trong trường hợp như vậy , tên chương trình con gọi là overloaded , khi đĩ các chương trình con tương ứng cũng được gọi là overloaded . Ví dụ cĩ 2 khai báo sau :
function COUNT ( ORANGES :INTEGER) return INTEGER ; function COUNT ( APPLES : BIT ) return INTEGER;
Cảø 2 function là overloaded khi chúng cĩ tên trùng nhau là COUNT . Khi gọi 1 function thực thi , nĩ cĩ thể nhận dạng chính xác function cần thực thi nhờ kiểu của các số thực đưa vào , bởi vì chúng cĩ kiểu các tham số khác nhau . Ví dụ gọi:
COUNT (20)
Nĩ được chuyển đến function thứ nhất , tại vì 20 là kiểu INTEGER , trong khi function call : COUNT (‘1’)
Nĩ được chuyển đến function thứ hai vì kiểu số thực là BIT .
Nếu 2 chương trình con overloaded cĩ các kiểu tham số và các kiểu kết quả giống nhau , thì chương trình con cĩ thể bị che bởi chương trình con khác . Điều này cĩ thể xảy ra ngẫu nhiên , nếu chương trình con được khai báo bên trong phạm vi của chương trình con khác . Sau đây là ví dụ :
architecture HIDING of DUMMY_ENTITY is
function ADD (A,B:BIT_VECTOR) return BIT_VECTOR is begin
--body of function here . end ADD;
begin
SUM_IN_ARCH <= ADD(N1,N2); process
function ADD(C,D:BIT_VECTOR) return BIT_VECTOR is begin
--body of function here. end ADD;
begin
SUM_IN_PROCESS <= ADD(IN1,IN2);
SUM_IN_ARCH <= HIDING_ADD .ADD(IN1,IN2); end process;
end HIDING;
Hàm ADD được khai báo bên trong thân architecture bị che bởi process , vì function ADD thứ hai được khai báo bên trong phần khai báo của process . Function này cĩ thể nằm im ở đường vào bởi bị hạn chế tên function với tên architecture , ta hãy xem phát biểu thứ hai trong process .
Cĩ thể cho 2 chương trình con overloaded đưa vào trực tiếp bên trong 1 vùng , sử dụng bằng mệnh đề use . Trong trường hợp này , nếu nĩ khơng thể định rõ chương trình con overloaded nào bị gọi, chương trình con gọi cĩ thể khơng rõ ràng , và vì thế bị lỗi. Xem ví dụ sau :
package P1 is
function ADD (A,B:BIT_VECTOR) return BIT_VECTOR; end P1;
package P2 is
function ADD (X,Y:BIT_VECTOR) return BIT_VECTOR; end P2;
use WORK.P1.all, WORK.P2.all;
architecture OVERLOADED of DUMMY_ENTITY is begin
SUM_CORRECT <= ADD (X=> IN1 , Y => IN2); SUM_ERROR <= ADD (IN1,IN2);
end OVERLOADED;
Function gọi trong phát biểu thứ nhất là khơng bị lỗi , từ đĩ nĩ chỉ đến function khai báo trong gĩi P2 ( các tham số hình thức được xác định rõ ràng trong mối liên kết ) . trong khi đĩ phát biểu gán tín hiệu thứ hai khơng rõ ràng và vì thế bị lỗi .
Hai chương trình con overloaded cĩ thể cĩ số các tham số khác nhau , nhưng cĩ các kiểu tham số và các kiểu kết quả giống nhau . Trong trường hợp này , số các số thực đáp ứng trong chương trình con gọi sẽ nhận dạng chương trình con tương ứng .
Sau đây là ví dụ của tập hợp các số nguyên 2,4,8 :
Function SMALLEST (A1,A2 :INTEGER) return INTEGER ; Function SMALLEST (A1,A2,A3,A4 :INTEGER) return INTEGER ; Function SMALLEST (A1,A2,A3,A4,A5,A6,A7,A8 :INTEGER) return INTEGER ;
Function gọi là
… SMALLEST (4,5)…
… SMALLEST (20,45,52,1,89,67,91,22)…
Sẽ chỉ đến function thứ ba . Sự linh động này giúp cho việc viết code được dễ dàng giải mã , từ đĩ tên các chương trình con giống nhau cĩ thể được đáp ứng khác nhau khi sử dụng tập hợp các input khác nhau .
Gọi đến 1 chương trình con overloaded là khơng rõ ràng và xuất hiện lỗi , nếu nĩ khơng thể nhận dạng chính xác chương trình con bị gọi , sử dụng các thơng tin sau :
1. Tên chương trình con (Subprogram name) . 2. Số các số thực (Number of actuals).
3. Kiểu và thứ tự của các số thực (Type and order of actuals). 4. Các tên và tham số hình thức (nếu sử dụng sự liên kết tên ). 5. Kiểu kết quả ( result type ).
Chú ý rằng overloaded khơng thể phân biệt được các kiểu con . Sau đây là ví dụ : type LOGIC5 is (‘X’,’0’,’1’,’D’,’Z’);
subtype LOGIC5_01 is LOGIC5 range ‘0’ to ‘1’ ;
function RISING_EDGE ( signal CLOCK : LOGIC5) return BOOLEAN; function RISING_EDGE ( signal CLOCK : LOGIC5_01) return BOOLEAN;
Khai báo function thứ hai bị che bởi function thứ nhất , vì cả hai cĩ các kiểu cơ bản của tham số giống nhau và các kiểu trả về cũng giống nhau . như vậy khi gọi :
signal CK : LOGIC5_01; …
… RISING_EDGE (CK)… sẽ bị lỗi .