Hi all ,
I was trying code to Implement a logic to know from which Class ( Out of many extended Classes ) , the base class constructor was called
// CODE SAMPLE 1
class Ext1 extends Base;
function new();
`ifdef THIS
super.new();
`else
super.new(this);
`endif
endfunction
endclass
class Ext2 extends Base;
function new();
`ifdef THIS
super.new();
`else
super.new(this);
`endif
endfunction
endclass
class Base;
`ifdef THIS
function new();
`else
function new(Base b); // Ext Class Passed as Argument
`endif
Ext1 E1 ;
Ext2 E2 ;
Base B ;
`ifdef THIS // To Use this as RHS of $cast
if ( $cast(E1,this) )
`else
if ( $cast(E1,b) )
`endif
begin
$display("Base Class Constructor Called from Ext1 Class Constructor");
end
else
`ifdef THIS
if ( $cast(E2,this) )
`else
if ( $cast(E2,b) )
`endif
begin
$display("Base Class Constructor Called from Ext2 Class Constructor");
end
else
`ifdef THIS
if ( $cast(B,this) )
`else
if ( $cast(B,b) )
`endif
begin
$display("Base Class Constructor Called directly");
end
endfunction
endclass
Base b1;
Ext1 e1;
Ext2 e2;
initial begin
e1 = new();
e2 = new();
end
// Output without +define+THIS Simulator 1 ::
Base Class Constructor Called directly
Base Class Constructor Called directly
// Output without +define+THIS Simulator 2 ::
Base Class Constructor Called from Ext1 Class Constructor
Base Class Constructor Called from Ext2 Class Constructor
// Output WITH +define+THIS Simulator 1 ::
Base Class Constructor Called directly
Base Class Constructor Called directly
// Output WITH +define+THIS Simulator 2 ::
Base Class Constructor Called from Ext1 Class Constructor
Base Class Constructor Called from Ext2 Class Constructor
I was expecting Output of Simulator 2 in Both Cases ( with/without define ).
BUT now if I change the order of $cast() used inside Base Class Constructor to ::
// CODE SAMPLE 2
...
class Base ;
`ifdef THIS
function new();
`else
function new(Base b); // Ext Class Passed as Argument
`endif
Ext1 E1 ;
Ext2 E2 ;
Base B ;
`ifdef THIS // To Use this as RHS of $cast
if ( $cast(B,this) ) // THE ORDER HAS CHANGED FROM SAMPLE 1
`else
if ( $cast(B,b) ) // THE ORDER HAS CHANGED FROM SAMPLE 1
`endif
begin
$display("Base Class Constructor Called directly");
end
else
`ifdef THIS
if ( $cast(E1,this) ) // THE ORDER HAS CHANGED FROM SAMPLE 1
`else
if ( $cast(E1,b) ) // THE ORDER HAS CHANGED FROM SAMPLE 1
`endif
begin
$display("Base Class Constructor Called from Ext1 Class Constructor");
end
else
`ifdef THIS
if ( $cast(E2,this) ) // THE ORDER HAS CHANGED FROM SAMPLE 1
`else
if ( $cast(E2,b) ) // THE ORDER HAS CHANGED FROM SAMPLE 1
`endif
begin
$display("Base Class Constructor Called from Ext2 Class Constructor");
end
endfunction
endclass
// Output without +define+THIS Simulator 1 ::
Base Class Constructor Called directly
Base Class Constructor Called directly
// Output without +define+THIS Simulator 2 ::
Base Class Constructor Called directly
Base Class Constructor Called directly
// Output WITH +define+THIS Simulator 1 ::
Base Class Constructor Called directly
Base Class Constructor Called directly
// Output WITH +define+THIS Simulator 2 ::
Base Class Constructor Called directly
Base Class Constructor Called directly
[Q1] What Causes the Output to differ in Sample 2 ? .
I was expecting Both Outputs of Simulator 2 in Sample 2 same as in Sample 1 i.e
" Base Class Constructor Called from Ext1 Class Constructor "
" Base Class Constructor Called from Ext2 Class Constructor "
Regards,
AGIS