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}