xschem/xschem_library/examples/loading_embedded.sch

620 lines
16 KiB
XML

v {xschem version=2.9.7 file_version=1.2}
G {}
V {// test}
S {* test}
E {}
T {rrreal type:
-----------
rreal is a record type containing voltage value, drive strength and
capacitive loading of an electrical node.
rrreal is a resolved subtype of rreal.
The resolution function invoked by the simulator updates
voltages, strengths and capacitive loading of all nodes.
this allows to simulate voltage transients, charge sharing,
floating conditions and more.
the example uses bidirectional analog switches
and simulates charge pumps which have a finite
driving capability (output impedance)} 10 -410 0 0 0.3 0.3 {}
T {VHDL DESIGN EXAMPLE} 140 -1290 0 0 1 1 {}
T {set netlist mode to VHDL
- create netlist
- simulate with ghdl
- view waveforms} 110 -1200 0 0 0.6 0.6 {}
N 830 -680 900 -680 {lab=VXS}
N 450 -680 510 -680 {lab=VX}
N 450 -680 450 -570 {lab=VX}
N 1230 -680 1240 -680 {lab=SP}
N 340 -680 450 -680 {lab=VX}
N 830 -680 830 -570 {lab=VXS}
N 1230 -680 1230 -570 {lab=SP}
N 470 -800 480 -800 {lab=VX2}
N 810 -800 810 -680 {lab=VXS}
N 780 -800 810 -800 {lab=VXS}
N 350 -910 470 -910 {lab=VX2}
N 470 -910 470 -800 {lab=VX2}
N 810 -680 830 -680 {lab=VXS}
N 1200 -680 1230 -680 {lab=SP}
N 340 -800 470 -800 {lab=VX2}
C {code.sym} 600 -200 0 0 {name=CODE
vhdl_ignore=false
value="
-- these assignments are done to have the voltage values available
-- in the waveform file
V_VX <= VX.value;
V_VX2 <= VX2.value;
V_VXS <= VXS.value;
V_SP <= SP.value;
process
begin
ING<='0';
ING1<='0';
SW <= '0';
SW1<='0';
SW2<='0';
--VX <= rreal'(4.5,10.0,0.0);
--VX2 <= rreal'(3.0, 5.0, 0.0);
wait for 200 ns;
ING1<='1';
wait for 200 ns;
ING<='1';
wait for 200 ns;
SW<='1';
wait for 200 ns;
SW2<='1';
wait for 200 ns;
SW1<='1';
wait for 200 ns;
SW1<='0';
wait for 200 ns;
SW2<='0';
wait for 200 ns;
SW1<='1';
wait for 200 ns;
SW<='1';
wait for 200 ns;
ING <='0';
wait for 200 ns;
SW1<= '0';
wait for 200 ns;
SW<='1';
wait for 200 ns;
ING<='1';
wait for 200 ns;
SW <= '0';
wait for 200 ns;
SW1<= '1';
wait for 200 ns;
ING<='1';
wait for 200 ns;
SW<='0';
wait for 200 ns;
SW1<='0';
wait for 200 ns;
SW<='1';
wait for 200 ns;
SW1<='1';
wait for 200 ns;
SW1<='0';
wait for 200 ns;
SW1<='1';
wait for 200 ns;
wait;
end process;
"
embed=true}
[
v {xschem version=2.9.7 file_version=1.2}
G {type=netlist_commands
template="name=s1 only_toplevel=false value=blabla"
format="
@value
"}
V {}
S {}
E {}
L 4 20 30 60 30 {}
L 4 20 40 40 40 {}
L 4 20 50 60 50 {}
L 4 20 60 50 60 {}
L 4 20 70 50 70 {}
L 4 20 80 90 80 {}
L 4 20 90 40 90 {}
L 4 20 20 70 20 {}
L 4 20 10 40 10 {}
L 4 100 10 110 10 {}
L 4 110 10 110 110 {}
L 4 20 110 110 110 {}
L 4 20 100 20 110 {}
L 4 100 0 100 100 {}
L 4 10 100 100 100 {}
L 4 10 0 10 100 {}
L 4 10 0 100 0 {}
T {@name} 15 -25 0 0 0.3 0.3 {}
]
C {use.sym} 840 -220 0 0 {library ieee;
use std.TEXTIO.all;
use ieee.std_logic_1164.all;
library work;
use work.rrreal.all;
-- embed=true}
[
v {xschem version=2.9.7 file_version=1.2}
G {type=use
template="
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
"}
V {}
S {}
E {}
L 4 -0 -10 355 -10 {}
T {VHDL USE} 5 -25 0 0 0.3 0.3 {}
T {@prop_ptr} 45 5 0 0 0.2 0.2 {}
]
C {pump.sym} 250 -680 0 0 {name=x4 conduct="1.0/20000.0" val=4.5 embed=true}
[
v {xschem version=2.9.7 file_version=1.2}
G {type=subcircuit
format="@name @pinlist @symname"
template="name=x1 val=4.5 conduct=10.0"
generic_type="conduct=real val=real"}
V {}
S {}
E {}
L 4 -80 -10 70 -10 {}
L 4 -80 10 70 10 {}
L 4 -80 -10 -80 10 {}
L 4 70 -10 70 10 {}
L 4 70 0 90 0 {}
L 4 -100 0 -80 0 {}
B 5 87.5 -2.5 92.5 2.5 {name=USC sig_type=rreal verilog_type=wire dir=inout }
B 5 -102.5 -2.5 -97.5 2.5 {name=ING sig_type=std_logic verilog_type=wire dir=in }
T {@symname} -45 -6 0 0 0.3 0.3 {}
T {@name} 75 -22 0 0 0.2 0.2 {}
T {USC} 65 -4 0 1 0.2 0.2 {}
T {ING} -75 -4 0 0 0.2 0.2 {}
T {conduct=@conduct
val=@val} -65 -36 0 0 0.2 0.2 {}
]
C {lab_pin.sym} 150 -680 0 0 {name=l4 lab=ING embed=true}
[
v {xschem version=2.9.7 file_version=1.2}
G {type=label
format="*.alias @lab"
template="name=l1 sig_type=std_logic lab=xxx"}
V {}
S {}
E {}
B 5 -1.25 -1.25 1.25 1.25 {name=p dir=in}
T {@lab} -7.5 -8.125 0 1 0.33 0.33 {}
]
C {switch_rreal.sch} 660 -670 0 0 {name=x5 del="2 ns" embed=true}
[
v {xschem version=2.9.7 file_version=1.2}
G {type=subcircuit
format="@name @pinlist @symname"
template="name=x1 del=\\"2 ns\\""
generic_type="del=time"}
V {}
S {}
E {}
L 4 -110 -20 110 -20 {}
L 4 -110 20 110 20 {}
L 4 -110 -20 -110 20 {}
L 4 110 -20 110 20 {}
L 4 110 -10 150 -10 {}
L 4 -150 -10 -110 -10 {}
L 4 -150 10 -110 10 {}
L 7 -140 7.5 -137.5 10 {}
L 7 -140 12.5 -137.5 10 {}
L 7 -142.5 -10 -140 -12.5 {}
L 7 -142.5 -10 -140 -7.5 {}
L 7 -140 -12.5 -137.5 -10 {}
L 7 -140 -7.5 -137.5 -10 {}
L 7 140 -12.5 142.5 -10 {}
L 7 140 -7.5 142.5 -10 {}
L 7 137.5 -10 140 -12.5 {}
L 7 137.5 -10 140 -7.5 {}
B 5 -152.5 7.5 -147.5 12.5 {name=ENAB dir=in }
B 5 147.5 -12.5 152.5 -7.5 {name=B dir=inout sig_type=rreal}
B 5 -152.5 -12.5 -147.5 -7.5 {name=A dir=inout sig_type=rreal}
T {@symname} -49.5 -6 0 0 0.3 0.3 {}
T {@name} 65 -32 0 0 0.2 0.2 {}
T {$ENAB} -146.25 -6.25 0 0 0.2 0.2 {}
T {$A} -146.25 -26.25 0 0 0.2 0.2 {}
T {$B} 146.25 -26.25 0 1 0.2 0.2 {}
]
C {lab_pin.sym} 510 -660 0 0 {name=l5 lab=SW embed=true}
C {real_capa.sym} 450 -540 0 0 {name=x3 cap=30.0 embed=true}
[
v {xschem version=2.9.7 file_version=1.2}
G {type=subcircuit
format="@name @pinlist @symname"
template="name=x1 cap=10.0"
generic_type="cap=real"
}
V {}
S {}
E {}
L 4 0 5 0 30 {}
L 4 0 -30 0 -5 {}
L 4 -10 -5 10 -5 {}
L 4 -10 5 10 5 {}
L 4 2.5 -22.5 7.5 -22.5 {}
L 4 5 -25 5 -20 {}
L 4 -5 30 5 30 {}
L 4 0 35 5 30 {}
L 4 -5 30 0 35 {}
B 5 -2.5 -32.5 2.5 -27.5 {name=USC sig_type=rreal verilog_type=wire dir=inout }
T {@symname} 14.5 -6 0 0 0.3 0.3 {}
T {@name} 15 -17 0 0 0.2 0.2 {}
T {USC} -5 -24 0 1 0.2 0.2 {}
T {@cap pF} 14.5 14 0 0 0.3 0.3 {}
]
C {real_capa.sym} 830 -540 0 0 {name=x1 cap=100.0 embed=true}
C {switch_rreal.sch} 1050 -670 0 0 {name=x2 del="2 ns" embed=true}
C {lab_pin.sym} 900 -660 0 0 {name=l2 lab=SW1 embed=true}
C {lab_pin.sym} 1240 -680 0 1 {name=l3 lab=SP sig_type=rrreal embed=true}
C {real_capa.sym} 1230 -540 0 0 {name=x6 cap=20.0 embed=true}
C {lab_wire.sym} 860 -680 0 1 {name=l6 lab=VXS sig_type=rrreal
embed=true}
[
v {xschem version=2.9.7 file_version=1.2}
G {type=label
format="*.alias @lab"
template="name=l1 sig_type=std_logic lab=xxx"}
V {}
S {}
E {}
B 5 -1.25 -1.25 1.25 1.25 {name=p dir=in}
T {@lab} -2.5 -1.25 2 0 0.27 0.27 {}
]
C {pump.sym} 250 -800 0 0 {name=x7 conduct="1.0/40000.0" val=3.0 embed=true}
C {lab_pin.sym} 150 -800 0 0 {name=l7 lab=ING1 embed=true}
C {switch_rreal.sym} 630 -790 0 0 {name=x8 del="2 ns" embed=true}
[
v {xschem version=2.9.7 file_version=1.2}
G {type=subcircuit
format="@name @pinlist @symname"
template="name=x1 del=\\"2 ns\\""
generic_type="del=time"}
V {}
S {}
E {}
L 4 -130 -20 130 -20 {}
L 4 -130 20 130 20 {}
L 4 -130 -20 -130 20 {}
L 4 130 -20 130 20 {}
L 4 -150 10 -130 10 {}
L 4 130 -10 150 -10 {}
L 4 -150 -10 -130 -10 {}
B 5 -152.5 7.5 -147.5 12.5 {name=ENAB dir=in }
B 5 147.5 -12.5 152.5 -7.5 {name=B sig_type=rreal dir=inout }
B 5 -152.5 -12.5 -147.5 -7.5 {name=A sig_type=rreal dir=inout }
T {@symname} -49.5 -6 0 0 0.3 0.3 {}
T {@name} 135 -32 0 0 0.2 0.2 {}
T {ENAB} -125 6 0 0 0.2 0.2 {}
T {B} 125 -14 0 1 0.2 0.2 {}
T {A} -125 -14 0 0 0.2 0.2 {}
]
C {lab_pin.sym} 480 -780 0 0 {name=l0 lab=SW2 embed=true}
C {lab_wire.sym} 400 -800 0 1 {name=l8 lab=VX2 sig_type=rrreal
embed=true}
C {real_capa.sym} 350 -880 0 0 {name=x9 cap=40.0 embed=true}
C {package_not_shown.sym} 830 -340 0 0 {
library ieee, std;
use std.textio.all;
package rrreal is
type rreal is
record
value : real;
conduct : real;
cap : real;
end record;
type rreal_vector is array (natural range <>) of rreal;
function resolved_real( r: rreal_vector ) return rreal;
procedure print(s : in string);
subtype rrreal is resolved_real rreal;
type rrreal_vector is array (natural range <>) of rrreal;
CONSTANT RREAL_X : rreal := rreal'(value=> 0.0, cap=>0.0, conduct=>-1.0);
CONSTANT RREAL_Z : rreal := rreal'(value=> 0.0, cap=>0.0, conduct=>0.0);
CONSTANT RREAL_0 : rreal := rreal'(value=> 0.0, cap=>0.0, conduct=>10.0);
CONSTANT REAL_Z : real := 20.0;
CONSTANT REAL_X : real := 20.0;
procedure transition(
signal sig: INOUT rreal;
constant endval: IN real;
constant del: IN time
);
procedure glitch(
signal sig: INOUT rreal;
constant lowval: IN real;
constant endval: IN real;
constant del: IN time
);
end rrreal; -- end package declaration
package body rrreal is
procedure print(s : in string) is
variable outbuf: line;
begin
write(outbuf, s);
writeline(output, outbuf);
end procedure;
-- function resolved_real( r:rreal_vector) return rreal is
-- VARIABLE result : rreal := RREAL_Z;
-- begin
-- IF (r'LENGTH = 1) THEN RETURN r(r'LOW);
-- ELSE
-- FOR i IN r'RANGE LOOP
-- result.cap := result.cap + r(i).cap ;
-- IF r(i).value /=REAL_Z THEN
-- IF result.value /=REAL_Z THEN
-- result.value := REAL_X ;
-- ELSE
-- result.value := r(i).value ;
-- END IF;
-- END IF ;
-- END LOOP;
-- END IF;
-- RETURN result;
-- end resolved_real;
function resolved_real( r:rreal_vector) return rreal is
VARIABLE result : rreal := RREAL_Z;
variable vcapshare : real := 0.0;
begin
IF (r'LENGTH = 1) THEN RETURN r(r'LOW);
ELSE
FOR i IN r'RANGE LOOP
if r(i).conduct = -1.0 then
result := RREAL_X;
exit;
end if;
-- only process initialized (valid) data
if r(i).value > -30.0 and r(i).value < 30.0 then
if r(i).cap > -1.0e12 and r(i).cap < 1.0e12 then
if r(i).conduct > -1.0e12 and r(i).conduct < 1.0e12 then
vcapshare := vcapshare + r(i).value * r(i).cap;
result.value := result.value + r(i).value * r(i).conduct;
result.cap := result.cap + r(i).cap ;
if(r(i).conduct > 0.0 ) then
-- result.conduct := result.conduct + 1.0/r(i).conduct ;
result.conduct := result.conduct + r(i).conduct ;
end if;
end if;
end if;
end if;
END LOOP;
END IF;
if result.conduct /= 0.0 then
result.value := result.value / result.conduct ; -- conductance
-- result.value := result.value * result.conduct ; -- resistance
-- result.conduct := 1.0 / result.conduct;
elsif result.cap >0.0 then
result.value := vcapshare / result.cap;
else
result.value:=0.0;
end if;
RETURN result;
end resolved_real;
procedure transition(
signal sig: INOUT rreal;
constant endval: IN real;
constant del: IN time) is
variable step: real;
variable startval: real;
variable del2: time;
begin
del2 := del;
if del2 = 0 fs then
del2 := 1 ns;
end if;
startval := sig.value;
step := (endval-startval);
if abs(endval-startval) < 0.01 then --do not propagate events if endval very close to startval
return;
end if;
-- sig.value <= endval after del;
sig.value <= startval,
startval+0.25*step after del2*0.1,
startval+0.45*step after del2*0.2,
startval+0.60*step after del2*0.3,
startval+0.72*step after del2*0.4,
startval+0.80*step after del2*0.5,
startval+0.86*step after del2*0.6,
startval+0.90*step after del2*0.7,
startval+0.94*step after del2*0.8,
startval+0.97*step after del2*0.9,
endval after del2;
end transition;
procedure glitch(
signal sig: INOUT rreal;
constant lowval: IN real;
constant endval: IN real;
constant del: IN time) is
variable step: real;
variable step2: real;
variable startval: real;
variable del2 : time;
begin
del2 := del;
if del2 = 0 fs then
del2 := 1 ns;
end if;
startval := sig.value;
step := (lowval-startval);
step2 := (lowval-endval);
if abs(lowval-startval) < 0.01 then --do not propagate events if endval very close to startval
return;
end if;
sig.value <=
-- startval,
-- startval+0.25*step after del*0.05,
-- startval+0.45*step after del*0.1,
-- startval+0.60*step after del*0.15,
-- startval+0.72*step after del*0.2,
-- startval+0.80*step after del*0.25,
-- startval+0.86*step after del*0.3,
-- startval+0.90*step after del*0.35,
-- startval+0.94*step after del*0.4,
-- startval+0.97*step after del*0.45,
-- lowval after del*0.5,
-- lowval-0.25*step2 after del*0.55,
-- lowval-0.45*step2 after del*0.6,
-- lowval-0.60*step2 after del*0.65,
-- lowval-0.72*step2 after del*0.7,
-- lowval-0.80*step2 after del*0.75,
-- lowval-0.86*step2 after del*0.8,
-- lowval-0.90*step2 after del*0.85,
-- lowval-0.94*step2 after del*0.9,
-- lowval-0.97*step2 after del*0.95,
-- endval after del;
lowval,
lowval-0.25*step2 after del2*0.1,
lowval-0.45*step2 after del2*0.2,
lowval-0.60*step2 after del2*0.3,
lowval-0.72*step2 after del2*0.4,
lowval-0.80*step2 after del2*0.5,
lowval-0.86*step2 after del2*0.6,
lowval-0.90*step2 after del2*0.7,
lowval-0.94*step2 after del2*0.8,
lowval-0.97*step2 after del2*0.9,
endval after del2;
end glitch;
end rrreal; -- end package body
-- embed=true}
[
v {xschem version=2.9.7 file_version=1.2}
G {type=package
template="
-- THIS IS A TEMPLATE, REPLACE WITH ACTUAL CODE OR REMOVE INSTANCE!!
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
package aaa is
type real_vector is array(natural range <>) of real;
constant dx : real := 0.001 ;
procedure assegna(
signal A : inout real;
signal A_OLD : in real;
A_VAL : in real
);
end aaa; -- end package declaration
package body aaa is
procedure assegna(
signal A : inout real;
signal A_OLD : in real;
A_VAL : in real ) is
constant tdelay: time := 0.01 ns;
begin
if (A /= A_VAL) then
A <= A_OLD+dx, A_VAL after tdelay;
end if;
end assegna;
end aaa; -- end package body
"}
V {}
S {}
E {}
L 4 0 -10 355 -10 {}
T {PACKAGE} 5 -25 0 0 0.3 0.3 {}
T {HIDDEN} 135 -5 0 0 0.3 0.3 {}
]
C {title.sym} 160 -40 0 0 {name=l9 author="Stefan Schippers" embed=true}
[
v {xschem version=2.9.7 file_version=1.2}
G {type=logo
template="name=l1 author=\\"Stefan Schippers\\""
verilog_ignore=true
vhdl_ignore=true
spice_ignore=true
tedax_ignore=true}
V {}
S {}
E {}
L 6 225 0 1020 0 {}
L 6 -160 0 -95 0 {}
T {@schname} 235 5 0 0 0.4 0.4 {}
T {@author} 235 -25 0 0 0.4 0.4 {}
T {@time_last_modified} 1020 -20 0 1 0.4 0.3 {}
T {SCHEM} 5 -25 0 0 1 1 {}
P 5 13 5 -30 -25 0 5 30 -15 30 -35 10 -55 30 -75 30 -45 0 -75 -30 -55 -30 -35 -10 -15 -30 5 -30 {fill=true}
]
C {arch_declarations.sym} 830 -280 0 0 {
signal V_VX, V_VX2, V_VXS, V_SP: real;
-- embed=true}
[
v {xschem version=2.9.7 file_version=1.2}
G {type=arch_declarations
template="
signal AAA: std_logic;
"}
V {}
S {}
E {}
L 4 -0 -10 355 -10 {}
T {ARCHITECTURE DECLARATIONS} 5 -25 0 0 0.3 0.3 {}
T {HIDDEN} 45 5 0 0 0.2 0.2 {}
]
C {lab_wire.sym} 430 -680 0 1 {name=l1 lab=VX sig_type=rrreal embed=true}