summaryrefslogtreecommitdiff
path: root/graphics/pgf/contrib/circuitikz/tex/pgfcirctripoles.tex
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/pgf/contrib/circuitikz/tex/pgfcirctripoles.tex')
-rw-r--r--graphics/pgf/contrib/circuitikz/tex/pgfcirctripoles.tex174
1 files changed, 165 insertions, 9 deletions
diff --git a/graphics/pgf/contrib/circuitikz/tex/pgfcirctripoles.tex b/graphics/pgf/contrib/circuitikz/tex/pgfcirctripoles.tex
index 95f001618e..8fb072ae71 100644
--- a/graphics/pgf/contrib/circuitikz/tex/pgfcirctripoles.tex
+++ b/graphics/pgf/contrib/circuitikz/tex/pgfcirctripoles.tex
@@ -1571,12 +1571,112 @@
%% Transistors
%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% definitions for transistor circles
+%
+\ctikzset{transistor circle/.is family}
+\ctikzset{transistor circle/relative thickness/.initial=1}
+\ctikzset{transistor circle/color/.initial=default}
+\ctikzset{transistor circle/dash/.initial=none}
+\ctikzset{transistor circle/scale circle radius/.initial=1}
+\ctikzset{transistor circle/default base in/.initial=0.9}
+\ctikzset{transistor circle/njfet base in/.initial=1.05}
+\ctikzset{transistor circle/pjfet base in/.initial=1.05}
+\ctikzset{transistor circle/isfet base in/.initial=0.65}
+
+\newif\ifpgf@circ@trcircle\pgf@circ@trcirclefalse
+\ctikzset{tr circle/.is if=pgf@circ@trcircle}
+\tikzset{tr circle/.is if=pgf@circ@trcircle}
+%
+% add a circle to the transistor:
+%
+\def\pgfcirc@transistorcircle{
+ \ifpgf@circ@trcircle
+ \pgfscope
+ \pgf@circ@setlinewidth{tripoles}{\pgflinewidth}
+ \pgfsetlinewidth{\ctikzvalof{transistor circle/relative thickness}\pgflinewidth}
+ \edef\@@none{none}\edef\@@default{default}
+ \edef\@@tmp{\ctikzvalof{transistor circle/color}}
+ \ifx\@@tmp\@@default\else
+ \pgfsetcolor{\@@tmp}
+ \fi
+ \edef\@@tmp{\ctikzvalof{transistor circle/dash}}
+ \ifx\@@tmp\@@none\else
+ \expandafter\pgfsetdash\expandafter{\@@tmp}{0cm}
+ \fi
+ % radius of the circle
+ % \pgfmathsetlength{\pgf@circ@res@temp}{((#2+\extrabodydiodelen)-(#1)+(#3)*(#3)/((#2+\extrabodydiodelen)-(#1)))/2}
+ % \pgfpathcircle{\pgfpoint{#1+\pgf@circ@res@temp}{0pt}}{\pgf@circ@res@temp}
+ \pgfpathcircle{\pgfpoint{\circleleft+\circleradius}{0pt}}{\circleradius}
+ \pgf@circ@draworfill
+ \endpgfscope
+ \fi
+}
\long\def\pgfcircdeclaretransistor#1#2#3{
\pgfdeclareshape{#1}
{
\savedmacro{\ctikzclass}{\edef\ctikzclass{transistors}}
\saveddimen{\scaledRlen}{\pgfmathsetlength{\pgf@x}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}}
+ \savedmacro{\circlebase}{
+ \pgfkeysifdefined{\circuitikzbasekey/transistor circle/#1 base in}%
+ {% yes, we have it
+ \edef\circlebase{\ctikzvalof{transistor circle/#1 base in}}%
+ }{% no, use default
+ \edef\circlebase{\ctikzvalof{transistor circle/default base in}}
+ }}
+ % \savedmacro{\thistypeoftr}{\edef\thistypeoftr{#1}}
+ \saveddimen{\extrabodydiodelen}{
+ \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}
+ \ifpgf@circuit@fet@bodydiode
+ % try to put the text to the right of the flyback diode
+ \pgfmathsetlength{\pgf@x}{(
+ \ctikzvalof{tripoles/#1/bodydiode distance}*
+ \ctikzvalof{tripoles/#1/width} +
+ \ctikzvalof{tripoles/#1/bodydiode scale}*
+ \ctikzvalof{bipoles/diode/height}/2
+ )*\pgf@circ@scaled@Rlen}
+ \else
+ \pgf@x=0pt\relax
+ \fi
+ }
+ \savedmacro{\scaecircleradius}{
+ \edef\scalecircleradius{\ctikzvalof{transistor circle/scale circle radius}}
+ }
+ \saveddimen{\circleradius}{
+ \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}
+ % repeat the extrabodydiodelen (grrr)
+ \ifpgf@circuit@fet@bodydiode
+ % try to put the text to the right of the flyback diode
+ \pgfmathsetlength{\pgf@circ@res@other}{(
+ \ctikzvalof{tripoles/#1/bodydiode distance}*
+ \ctikzvalof{tripoles/#1/width} +
+ \ctikzvalof{tripoles/#1/bodydiode scale}*
+ \ctikzvalof{bipoles/diode/height}/2
+ )*\pgf@circ@scaled@Rlen}
+ \else
+ \pgf@circ@res@other=0pt\relax
+ \fi
+ % left
+ \pgf@xa=-\ctikzvalof{tripoles/#1/width}\pgf@circ@scaled@Rlen
+ \pgf@xa=\circlebase\pgf@xa % this is the base point of the circle
+ % northeast
+ \pgf@yb=\ctikzvalof{tripoles/#1/height}\pgf@circ@scaled@Rlen % y of the left point of circle
+ \pgf@yb=.5\pgf@yb
+ \pgf@xb=\pgf@circ@res@other % this is the x of the right points of the circle
+ %
+ \pgf@yb=\ctikzvalof{tripoles/#1/bodydiode conn}\pgf@yb %this is #3 of the circle
+ % find the radius of the circle
+ \pgfmathsetlength{\pgf@x}{((\pgf@xb)-(\pgf@xa)+(\pgf@yb)*(\pgf@yb)/((\pgf@xb)-(\pgf@xa)))/2*\scalecircleradius}
+ }
+ \saveddimen{\circleleft}{
+ \pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}
+ \pgf@xa=-\ctikzvalof{tripoles/#1/width}\pgf@circ@scaled@Rlen
+ \pgf@x=\circlebase\pgf@xa
+ }
+ \anchor{circle center}{
+ \pgf@y=0pt\pgf@x=\circleleft\advance\pgf@x by\circleradius
+ }
\anchor{center}{
\pgfpointorigin
}
@@ -1600,14 +1700,12 @@
\pgfmathsetlength{\pgf@circ@scaled@Rlen}{\ctikzvalof{\ctikzclass/scale}\pgf@circ@Rlen}
\ifpgf@circuit@transisors@fixlabels
\ifpgf@circuit@fet@bodydiode
- % try to put the text to the right of the flyback diode
- \pgfmathsetlength{\pgf@circ@res@other}{(
- \ctikzvalof{tripoles/#1/bodydiode distance}*
- \ctikzvalof{tripoles/#1/width} +
- \ctikzvalof{tripoles/#1/bodydiode scale}*
- \ctikzvalof{bipoles/diode/height}/2
- )*\pgf@circ@scaled@Rlen}
- \advance\pgf@x by \pgf@circ@res@other
+ \advance \pgf@x by \extrabodydiodelen
+ \fi
+ \ifpgf@circ@trcircle
+ \left\pgf@xa=\pgf@x
+ \pgfmathsetlength{\pgf@x}{\circleleft+2*\circleradius}
+ % \advance \pgf@x by \circleradius
\fi
% add a bit of space to avoid central (substrate) terminal if drawn
\advance\pgf@x by 0.05\pgf@circ@scaled@Rlen\relax
@@ -1703,6 +1801,10 @@
\left
\pgf@x=\ctikzvalof{tripoles/#1/base width}\pgf@x
}
+ \anchor{circle base}{
+ \left
+ \pgf@x=\circlebase\pgf@x
+ }
\anchor{nogate}{
\left
\pgf@x=\ctikzvalof{tripoles/#1/gate width}\pgf@x
@@ -1744,6 +1846,33 @@
\pgf@y=\ctikzvalof{tripoles/#1/curr direction}\pgf@y
\pgf@y=\ctikzvalof{tripoles/#1/bodydiode conn}\pgf@y
}
+ \anchor{circle C}{
+ \left
+ \pgf@xa=\circlebase\pgf@x % this is #1 of the circle
+ \northeast
+ \pgf@xb=\pgf@x %this is #2 of the circle
+ \pgf@yb=\ctikzvalof{tripoles/#1/bodydiode conn}\pgf@y %this is #3 of the circle
+ % the base of the triangle is x_2 - x_1 - r
+ \pgfmathsetlength{\pgf@circ@res@other}{\pgf@xb-\pgf@xa-\circleradius}
+ % so let's go with the height
+ \pgfmathsetlength{\pgf@ya}{sqrt(abs(\circleradius*\circleradius-\pgf@circ@res@other*\pgf@circ@res@other))}
+ % finally, direction
+ \pgf@y=\ctikzvalof{tripoles/#1/curr direction}\pgf@ya
+ }
+ \anchor{circle E}{
+ \left
+ \pgf@xa=\circlebase\pgf@x % this is #1 of the circle
+ \northeast
+ \pgf@xb=\pgf@x %this is #2 of the circle
+ \pgf@yb=\ctikzvalof{tripoles/#1/bodydiode conn}\pgf@y %this is #3 of the circle
+ % the base of the triangle is x_2 - x_1 - r
+ \pgfmathsetlength{\pgf@circ@res@other}{\pgf@xb-\pgf@xa-\circleradius}
+ % so let's go with the height
+ \pgfmathsetlength{\pgf@ya}{sqrt(abs(\circleradius*\circleradius-\pgf@circ@res@other*\pgf@circ@res@other))}
+ % finally, direction
+ % finally, direction
+ \pgf@y=-\ctikzvalof{tripoles/#1/curr direction}\pgf@ya
+ }
\anchor{body E in}{
\northeast
\pgf@y=-\ctikzvalof{tripoles/#1/curr direction}\pgf@y
@@ -1853,6 +1982,10 @@
\pgf@y=-\ctikzvalof{tripoles/#1/base height}\pgf@y
}
}{
+
+ % add the circle if requested (before everything else, so we can fill it)
+ \pgfcirc@transistorcircle
+
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@right}
{\ctikzvalof{tripoles/#1/base height}\pgf@circ@res@up}}
@@ -2360,6 +2493,8 @@
}
}
{
+ % add the circle if requested (before everything else, so we can fill it)
+ \pgfcirc@transistorcircle
%draw upper connection
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@right}
@@ -2468,6 +2603,9 @@
\pgf@y=-\ctikzvalof{tripoles/nmos/gate height}\pgf@y
}
}{%
+ % add the circle if requested (before everything else, so we can fill it)
+ \pgfcirc@transistorcircle
+
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@right}
{\ctikzvalof{tripoles/nmos/gate height}\pgf@circ@res@up}}
@@ -2552,6 +2690,8 @@
\pgf@y=-\ctikzvalof{tripoles/pmos/gate height}\pgf@y
}
}{%
+ % add the circle if requested (before everything else, so we can fill it)
+ \pgfcirc@transistorcircle
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@right}
{\ctikzvalof{tripoles/pmos/gate height}\pgf@circ@res@up}}
@@ -2682,6 +2822,8 @@
}
}{%
% draw depletion channel
+ % add the circle if requested (before everything else, so we can fill it)
+ \pgfcirc@transistorcircle
\pgfscope
\pgfpathrectanglecorners
{\pgfpoint
@@ -2782,6 +2924,8 @@
\advance\pgf@x by -\pgf@circ@res@temp
}
}{%
+ % add the circle if requested (before everything else, so we can fill it)
+ \pgfcirc@transistorcircle
% draw depletion channel
\pgfscope
\pgfpathrectanglecorners
@@ -2893,6 +3037,8 @@
\pgf@y=-\ctikzvalof{tripoles/hemt/gate height}\pgf@y
}
}{%
+ % add the circle if requested (before everything else, so we can fill it)
+ \pgfcirc@transistorcircle
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@right}
{\ctikzvalof{tripoles/hemt/gate height}\pgf@circ@res@up}}
@@ -2928,6 +3074,9 @@
\long\def\drawfetcore#1{
\pgftransformationadjustments
+ % add the circle if requested (before everything else, so we can fill it)
+ \pgfcirc@transistorcircle
+
%top connection
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@right}
@@ -3192,6 +3341,8 @@
\pgf@y=-\ctikzvalof{tripoles/njfet/gate height 2}\pgf@y
}
}{%
+ % add the circle if requested (before everything else, so we can fill it)
+ \pgfcirc@transistorcircle
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@right}
{\ctikzvalof{tripoles/njfet/gate height 2}\pgf@circ@res@up}}
@@ -3257,6 +3408,8 @@
\pgf@y=-\ctikzvalof{tripoles/pjfet/gate height 2}\pgf@y
}
}{%
+ % add the circle if requested (before everything else, so we can fill it)
+ \pgfcirc@transistorcircle
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}}
\pgfpathlineto{\pgfpoint{\pgf@circ@res@right}
{\ctikzvalof{tripoles/pjfet/gate height 2}\pgf@circ@res@up}}
@@ -3311,7 +3464,10 @@
\pgfusepath{draw}
}
-\pgfdeclaretransistorwrapperaddbulk{isfet}{}{%
+\pgfdeclaretransistorwrapperaddbulk{isfet}{
+ }{%
+ % add the circle if requested (before everything else, so we can fill it)
+ \pgfcirc@transistorcircle
\pgfpathmoveto{\pgfpoint{\pgf@circ@res@right}{\pgf@circ@res@up+\pgfverticaltransformationadjustment*.5*\pgflinewidth}}
% DRAIN CONNECTION
\pgfpathlineto{\pgfpoint{\pgf@circ@res@right}