diff --git a/book/insnformats.tex b/book/insnformats.tex index c73ee65..a1169c7 100644 --- a/book/insnformats.tex +++ b/book/insnformats.tex @@ -280,11 +280,12 @@ % \textbf{#1}\\ {\large #1} } + + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% #1 the binary encoding -\newcommand\DrawInsnTypeBTikz[1]{ - \BeginTikzPicture +\newcommand\DrawInsnTypeB[1]{ \StrLen{#1}[\numchars] + \begin{scope}[shift={(0,.75)}] \DrawInsnBitstring{\numchars}{#1}{\hyperref[insnformat:btype]{B-type}} \DrawInsnBoxSeg{\numchars}{31}{25}{imm[12\textbar10:5]} \DrawInsnBoxSeg{\numchars}{24}{20}{rs2} @@ -296,8 +297,16 @@ % add some hint bits in for imm fields \draw {[rounded corners=\SignBoxCornerRadius] (1.35, -.6) -- (1.35, .6) -- (.65, .6) -- (.65, -.6) -- cycle}; % sign bit \draw (32-7-.5, -.75) -- (32-7-.5, .1); % imm[11] + \end{scope} - \DrawHexMarkers{\numchars} + \DrawHexMarkersRel{\numchars} +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% #1 the binary encoding +\newcommand\DrawInsnTypeBTikz[1]{ + \BeginTikzPicture + \DrawInsnTypeB{#1} \EndTikzPicture } @@ -309,9 +318,9 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % #1 the binary encoding -\newcommand\DrawInsnTypeUTikz[1]{ - \BeginTikzPicture +\newcommand\DrawInsnTypeU[1]{ \StrLen{#1}[\numchars] + \begin{scope}[shift={(0,.75)}] \DrawInsnBitstring{\numchars}{#1}{\hyperref[insnformat:utype]{U-type}} \DrawInsnBoxSeg{\numchars}{31}{12}{imm[31:12]} \DrawInsnBoxSeg{\numchars}{11}{7}{rd} @@ -319,8 +328,15 @@ % add some hint bits in for imm fields \draw {[rounded corners=\SignBoxCornerRadius] (1.35, -.6) -- (1.35, .6) -- (.65, .6) -- (.65, -.6) -- cycle}; % sign bit + \end{scope} - \DrawHexMarkers{\numchars} + \DrawHexMarkersRel{\numchars} +} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% #1 the binary encoding +\newcommand\DrawInsnTypeUTikz[1]{ + \BeginTikzPicture + \DrawInsnTypeU{#1} \EndTikzPicture } @@ -343,7 +359,7 @@ \end{scope} % add some hint bits in for imm fields - \draw {[rounded corners=\SignBoxCornerRadius] (1.35, .15) -- (1.35, 1.35) -- (.65, 1.36) -- (.65, .15) -- cycle}; % sign bit + \draw {[rounded corners=\SignBoxCornerRadius] (1.35, .15) -- (1.35, 1.35) -- (.65, 1.35) -- (.65, .15) -- cycle}; % sign bit \draw (32-19-.5, 0) -- (32-19.5, .85); % imm[19:12] \draw (32-20-.5, 0) -- (32-20.5, .85); % imm[11] \DrawHexMarkersRel{\numchars} @@ -378,6 +394,7 @@ % #1 the binary encoding \newcommand\DrawInsnTypeI[1]{ \StrLen{#1}[\numchars] + \begin{scope}[shift={(0,.75)}] \DrawInsnBitstring{\numchars}{#1}{\hyperref[insnformat:itype]{I-type}} \DrawInsnBoxSeg{\numchars}{31}{20}{imm[11:0]} \DrawInsnBoxSeg{\numchars}{19}{15}{rs1} @@ -387,13 +404,15 @@ % add some hint bits in for imm fields \draw {[rounded corners=\SignBoxCornerRadius] (1.35, -.6) -- (1.35, .6) -- (.65, .6) -- (.65, -.6) -- cycle}; % sign bit + \end{scope} + \DrawHexMarkersRel{\numchars} } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % #1 the binary encoding \newcommand\DrawInsnTypeITikz[1]{ \BeginTikzPicture \DrawInsnTypeI{#1} - \DrawHexMarkers{\numchars} +% \DrawHexMarkers{\numchars} \EndTikzPicture } \newcommand\DrawInsnTypeIPicture[2]{ @@ -403,9 +422,9 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % #1 the binary encoding -\newcommand\DrawInsnTypeSTikz[1]{ - \BeginTikzPicture +\newcommand\DrawInsnTypeS[1]{ \StrLen{#1}[\numchars] + \begin{scope}[shift={(0,.75)}] \DrawInsnBitstring{\numchars}{#1}{\hyperref[insnformat:stype]{S-type}} \DrawInsnBoxSeg{\numchars}{31}{25}{imm[11:5]} \DrawInsnBoxSeg{\numchars}{24}{20}{rs2} @@ -416,8 +435,15 @@ % add some hint bits in for imm fields \draw {[rounded corners=\SignBoxCornerRadius] (1.35, -.6) -- (1.35, .6) -- (.65, .6) -- (.65, -.6) -- cycle}; % sign bit + \end{scope} - \DrawHexMarkers{\numchars} + \DrawHexMarkersRel{\numchars} +} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% #1 the binary encoding +\newcommand\DrawInsnTypeSTikz[1]{ + \BeginTikzPicture + \DrawInsnTypeS{#1} \EndTikzPicture } @@ -1020,60 +1046,51 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % #1 MSB position -% #2 width +% #2 LSB position \newcommand\InsnBoxFieldWidthArrow[2]{ - \pgfmathsetmacro\result{int(31-#1)} % Calculate the left end position - \begin{scope}[shift={(\result,-.5)}] % Move to left end of arrow & below origin - \pgfmathsetmacro\result{#2*.5+.5} % the center position - \node at (\result,0) {\tiny#2}; % size below the box + \pgfmathsetmacro\leftpos{int(31-#1)} % Calculate the left end position + \pgfmathsetmacro\wid{int(#1-#2+1)} % calculate the width + \begin{scope}[shift={(\leftpos,-.5)}] % Move to left end of arrow & below origin + \pgfmathsetmacro\result{\wid*.5+.5} % the center position + \node at (\result,0) {\tiny\wid}; % size below the box - \ifthenelse{#2 > 9} + \ifthenelse{\wid > 9} { \pgfmathsetmacro\Inset{0.4} } { - \ifthenelse{#2 > 1} + \ifthenelse{\wid > 1} { \pgfmathsetmacro\Inset{0.25} } { \pgfmathsetmacro\Inset{0.15} } } - \draw[->] (\result+\Inset,0) -- (#2+.49,0); % arrow to the right + \draw[->] (\result+\Inset,0) -- (\wid+.49,0); % arrow to the right \draw[->] (\result-\Inset,0) -- (.51,0); % arrow to the left \end{scope} } -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \newcommand\DrawInsnOpJTypeDecoding{ \BeginTikzPicture -% \begin{scope}[shift={(0,1.5)}]\DrawInsnBoxCastleJtype\end{scope} -% \begin{scope}[shift={(0,0)}]\DrawInsnOpJType{1101111}{\hyperref[insn:jal]{jal}}\end{scope} - \begin{scope}[shift={(0,-1.5)}] -% \DrawInsnBoxRel{31}{12}{} -% \DrawInsnBoxRel{11}{7}{rd} -% \DrawInsnBoxRel{6}{0}{} -% \draw(33,.75) node[right]{jal}; -% \begin{scope}[shift={(31-6,0)}]\DrawBitstringX{1101111}\end{scope} -% \begin{scope}[shift={(31-31,0)}]\DrawBitstringX{abcdefghijklmnopqrst}\end{scope} - - \DrawInsnTypeJ{abcdefghijklmnopqrst001111101111} + \DrawInsnTypeJ{abcdefghjkmnpqrstuvw001111101111} \pgfmathsetmacro\ArrowNorth{\BitBoxArrowInset} \pgfmathsetmacro\ArrowSouth{-16-\BitBoxArrowInset} - \draw[blue,->](1,\ArrowNorth)to[out=270,in=90](1,\ArrowSouth); % 20 - \draw[blue,->](1,\ArrowNorth)to[out=270,in=90](2,\ArrowSouth); % sign extend - \draw[blue,->](1,\ArrowNorth)to[out=270,in=90](3,\ArrowSouth); % sign extend - \draw[blue,->](1,\ArrowNorth)to[out=270,in=90](4,\ArrowSouth); % sign extend - \draw[blue,->](1,\ArrowNorth)to[out=270,in=90](5,\ArrowSouth); % sign extend - \draw[blue,->](1,\ArrowNorth)to[out=270,in=90](6,\ArrowSouth); % sign extend - \draw[blue,->](1,\ArrowNorth)to[out=270,in=90](7,\ArrowSouth); % sign extend - \draw[blue,->](1,\ArrowNorth)to[out=270,in=90](8,\ArrowSouth); % sign extend - \draw[blue,->](1,\ArrowNorth)to[out=270,in=90](9,\ArrowSouth); % sign extend - \draw[blue,->](1,\ArrowNorth)to[out=270,in=90](10,\ArrowSouth); % sign extend - \draw[blue,->](1,\ArrowNorth)to[out=270,in=90](11,\ArrowSouth); % sign extend - \draw[blue,->](1,\ArrowNorth)to[out=270,in=90](12,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](1,\ArrowSouth); % 20 + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](2,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](3,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](4,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](5,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](6,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](7,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](8,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](9,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](10,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](11,\ArrowSouth); % sign extend + \draw[blue,->](1,\ArrowNorth)to[out=270,in=90](12,\ArrowSouth); % 20 \draw[blue,->](13,\ArrowNorth)to[out=270,in=90](13,\ArrowSouth); % 19 \draw[blue,->](14,\ArrowNorth)to[out=270,in=90](14,\ArrowSouth); % 18 \draw[blue,->](15,\ArrowNorth)to[out=270,in=90](15,\ArrowSouth); % 17 @@ -1096,15 +1113,18 @@ \draw[blue,->](10,\ArrowNorth)to[out=270,in=90](30,\ArrowSouth); % 2 \draw[blue,->](11,\ArrowNorth)to[out=270,in=90](31,\ArrowSouth); % 1 - \draw[blue,->](32,\ArrowSouth+1)to[out=270,in=90](32,\ArrowSouth); % 0 (special case) - \node at (32,\ArrowSouth+2) {0}; + \draw[red,->](34,\ArrowSouth+5)to[out=180,in=90](32,\ArrowSouth); % 0 (special case) + \node at (34.5,\ArrowSouth+5) {0}; +% \draw[blue,->](32,\ArrowSouth+1)to[out=270,in=90](32,\ArrowSouth); % 0 (special case) +% \node at (32,\ArrowSouth+2) {0}; \begin{scope}[shift={(0,0)}]\DrawHexMarkersRel{32}\end{scope} \end{scope} \begin{scope}[shift={(0,-19.75)}] \begin{scope}[shift={(0,1.5)}] - \DrawInsnBoxCastle{31}{20} + \DrawInsnBoxCastle{31}{21} + \DrawInsnBoxCastle{20}{20} \DrawInsnBoxCastle{19}{12} \DrawInsnBoxCastle{11}{11} \DrawInsnBoxCastle{10}{1} @@ -1112,19 +1132,301 @@ \end{scope} \DrawInsnBoxRel{31}{0}{} - \begin{scope}[shift={(0,0)}]\DrawBitstringX{aaaaaaaaaaaamnopqrstlbcdefghijk0}\end{scope} + \begin{scope}[shift={(0,0)}]\DrawBitstringX{aaaaaaaaaaaapqrstuvwnbcdefghjkm0}\end{scope} + \begin{scope}[shift={(0,0)}]\DrawHexMarkersRel{32}\end{scope} + + \InsnBoxFieldWidthArrow{31}{21} + \InsnBoxFieldWidthArrow{20}{20} + \InsnBoxFieldWidthArrow{19}{12} + \InsnBoxFieldWidthArrow{11}{11} + \InsnBoxFieldWidthArrow{10}{1} + \InsnBoxFieldWidthArrow{0}{0} + \end{scope} + + \EndTikzPicture +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newcommand\DrawInsnOpBTypeDecoding{ + \BeginTikzPicture + + \begin{scope}[shift={(0,-1.5)}] + + \DrawInsnTypeB{abcdefg0111100011000hjkmn1100011} + + \pgfmathsetmacro\ArrowNorth{\BitBoxArrowInset} + \pgfmathsetmacro\ArrowSouth{-16-\BitBoxArrowInset} + + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](1,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](2,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](3,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](4,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](5,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](6,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](7,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](8,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](9,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](10,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](11,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](12,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](13,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](14,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](15,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](16,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](17,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](18,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](19,\ArrowSouth); % sign extend + + \draw[blue,->](1,\ArrowNorth)to[out=270,in=90](20,\ArrowSouth); % 12 + + \draw[blue,->](25,\ArrowNorth)to[out=270,in=90](21,\ArrowSouth); % 11 + + \draw[blue,->](2,\ArrowNorth)to[out=270,in=90](22,\ArrowSouth); % 10 + \draw[blue,->](3,\ArrowNorth)to[out=270,in=90](23,\ArrowSouth); % 9 + \draw[blue,->](4,\ArrowNorth)to[out=270,in=90](24,\ArrowSouth); % 8 + \draw[blue,->](5,\ArrowNorth)to[out=270,in=90](25,\ArrowSouth); % 7 + \draw[blue,->](6,\ArrowNorth)to[out=270,in=90](26,\ArrowSouth); % 6 + \draw[blue,->](7,\ArrowNorth)to[out=270,in=90](27,\ArrowSouth); % 5 + + \draw[blue,->](21,\ArrowNorth)to[out=270,in=90](28,\ArrowSouth); % 4 + \draw[blue,->](22,\ArrowNorth)to[out=270,in=90](29,\ArrowSouth); % 3 + \draw[blue,->](23,\ArrowNorth)to[out=270,in=90](30,\ArrowSouth); % 2 + \draw[blue,->](24,\ArrowNorth)to[out=270,in=90](31,\ArrowSouth); % 1 + + \draw[red,->](34,\ArrowSouth+5)to[out=180,in=90](32,\ArrowSouth); % 0 (special case) + \node at (34.5,\ArrowSouth+5) {0}; +% \draw[blue,->](32,\ArrowSouth+1)to[out=270,in=90](32,\ArrowSouth); % 0 (special case) +% \node at (32,\ArrowSouth+2) {0}; + + \begin{scope}[shift={(0,0)}]\DrawHexMarkersRel{32}\end{scope} + \end{scope} + + \begin{scope}[shift={(0,-19.75)}] + \begin{scope}[shift={(0,1.5)}] + \DrawInsnBoxCastle{31}{13} + \DrawInsnBoxCastle{12}{12} + \DrawInsnBoxCastle{11}{11} + \DrawInsnBoxCastle{10}{5} + \DrawInsnBoxCastle{4}{1} + \DrawInsnBoxCastle{0}{0} + \end{scope} + \DrawInsnBoxRel{31}{0}{} + + \begin{scope}[shift={(0,0)}]\DrawBitstringX{aaaaaaaaaaaaaaaaaaaanbcdefghjkm0}\end{scope} + + \begin{scope}[shift={(0,0)}]\DrawHexMarkersRel{32}\end{scope} + + \InsnBoxFieldWidthArrow{31}{13} + \InsnBoxFieldWidthArrow{12}{12} + \InsnBoxFieldWidthArrow{11}{11} + \InsnBoxFieldWidthArrow{10}{5} + \InsnBoxFieldWidthArrow{4}{1} + \InsnBoxFieldWidthArrow{0}{0} + \end{scope} + + \EndTikzPicture +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newcommand\DrawInsnOpSTypeDecoding{ + \BeginTikzPicture + + \begin{scope}[shift={(0,-1.5)}] + + \DrawInsnTypeS{abcdefg0111100011000hjkmn0100011} + + \pgfmathsetmacro\ArrowNorth{\BitBoxArrowInset} + \pgfmathsetmacro\ArrowSouth{-16-\BitBoxArrowInset} + + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](1,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](2,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](3,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](4,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](5,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](6,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](7,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](8,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](9,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](10,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](11,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](12,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](13,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](14,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](15,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](16,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](17,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](18,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](19,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](20,\ArrowSouth); % sign extend + + \draw[blue,->](1,\ArrowNorth)to[out=270,in=90](21,\ArrowSouth); % 11 + \draw[blue,->](2,\ArrowNorth)to[out=270,in=90](22,\ArrowSouth); % 10 + \draw[blue,->](3,\ArrowNorth)to[out=270,in=90](23,\ArrowSouth); % 9 + \draw[blue,->](4,\ArrowNorth)to[out=270,in=90](24,\ArrowSouth); % 8 + \draw[blue,->](5,\ArrowNorth)to[out=270,in=90](25,\ArrowSouth); % 7 + \draw[blue,->](6,\ArrowNorth)to[out=270,in=90](26,\ArrowSouth); % 6 + \draw[blue,->](7,\ArrowNorth)to[out=270,in=90](27,\ArrowSouth); % 5 + + \draw[blue,->](21,\ArrowNorth)to[out=270,in=90](28,\ArrowSouth); % 4 + \draw[blue,->](22,\ArrowNorth)to[out=270,in=90](29,\ArrowSouth); % 3 + \draw[blue,->](23,\ArrowNorth)to[out=270,in=90](30,\ArrowSouth); % 2 + \draw[blue,->](24,\ArrowNorth)to[out=270,in=90](31,\ArrowSouth); % 1 + \draw[blue,->](25,\ArrowNorth)to[out=270,in=90](32,\ArrowSouth); % 0 + + \begin{scope}[shift={(0,0)}]\DrawHexMarkersRel{32}\end{scope} + \end{scope} + + \begin{scope}[shift={(0,-19.75)}] + \begin{scope}[shift={(0,1.5)}] + \DrawInsnBoxCastle{31}{12} + \DrawInsnBoxCastle{11}{5} + \DrawInsnBoxCastle{4}{0} + \end{scope} + \DrawInsnBoxRel{31}{0}{} + + \begin{scope}[shift={(0,0)}]\DrawBitstringX{aaaaaaaaaaaaaaaaaaaaabcdefghjkmn}\end{scope} + \begin{scope}[shift={(0,0)}]\DrawHexMarkersRel{32}\end{scope} \InsnBoxFieldWidthArrow{31}{12} -% \InsnBoxFieldWidthArrow{20}{1} - \InsnBoxFieldWidthArrow{19}{8} - \InsnBoxFieldWidthArrow{11}{1} - \InsnBoxFieldWidthArrow{10}{10} - \InsnBoxFieldWidthArrow{0}{1} + \InsnBoxFieldWidthArrow{11}{5} + \InsnBoxFieldWidthArrow{4}{0} \end{scope} + \EndTikzPicture +} +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newcommand\DrawInsnOpITypeDecoding{ + \BeginTikzPicture + \begin{scope}[shift={(0,-1.5)}] + + \DrawInsnTypeI{abcdefghjkmn00011000001110000011} + + \pgfmathsetmacro\ArrowNorth{\BitBoxArrowInset} + \pgfmathsetmacro\ArrowSouth{-16-\BitBoxArrowInset} + + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](1,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](2,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](3,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](4,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](5,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](6,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](7,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](8,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](9,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](10,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](11,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](12,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](13,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](14,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](15,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](16,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](17,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](18,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](19,\ArrowSouth); % sign extend + \draw[red,->](1,\ArrowNorth)to[out=270,in=90](20,\ArrowSouth); % sign extend + + \draw[blue,->](1,\ArrowNorth)to[out=270,in=90](21,\ArrowSouth); % 11 + \draw[blue,->](2,\ArrowNorth)to[out=270,in=90](22,\ArrowSouth); % 10 + \draw[blue,->](3,\ArrowNorth)to[out=270,in=90](23,\ArrowSouth); % 9 + \draw[blue,->](4,\ArrowNorth)to[out=270,in=90](24,\ArrowSouth); % 8 + \draw[blue,->](5,\ArrowNorth)to[out=270,in=90](25,\ArrowSouth); % 7 + \draw[blue,->](6,\ArrowNorth)to[out=270,in=90](26,\ArrowSouth); % 6 + \draw[blue,->](7,\ArrowNorth)to[out=270,in=90](27,\ArrowSouth); % 5 + \draw[blue,->](8,\ArrowNorth)to[out=270,in=90](28,\ArrowSouth); % 4 + \draw[blue,->](9,\ArrowNorth)to[out=270,in=90](29,\ArrowSouth); % 3 + \draw[blue,->](10,\ArrowNorth)to[out=270,in=90](30,\ArrowSouth); % 2 + \draw[blue,->](11,\ArrowNorth)to[out=270,in=90](31,\ArrowSouth); % 1 + \draw[blue,->](12,\ArrowNorth)to[out=270,in=90](32,\ArrowSouth); % 0 + + \begin{scope}[shift={(0,0)}]\DrawHexMarkersRel{32}\end{scope} + \end{scope} + + \begin{scope}[shift={(0,-19.75)}] + \begin{scope}[shift={(0,1.5)}] + \DrawInsnBoxCastle{31}{12} + \DrawInsnBoxCastle{11}{5} + \DrawInsnBoxCastle{4}{0} + \end{scope} + \DrawInsnBoxRel{31}{0}{} + + \begin{scope}[shift={(0,0)}]\DrawBitstringX{aaaaaaaaaaaaaaaaaaaaabcdefghjkmn}\end{scope} + + \begin{scope}[shift={(0,0)}]\DrawHexMarkersRel{32}\end{scope} + + \InsnBoxFieldWidthArrow{31}{12} + \InsnBoxFieldWidthArrow{11}{5} + \InsnBoxFieldWidthArrow{4}{0} + \end{scope} + + \EndTikzPicture +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +\newcommand\DrawInsnOpUTypeDecoding{ + \BeginTikzPicture + + \begin{scope}[shift={(0,-1.5)}] + + \DrawInsnTypeU{abcdefghjkmnpqrstuvw001010110111} + + \pgfmathsetmacro\ArrowNorth{\BitBoxArrowInset} + \pgfmathsetmacro\ArrowSouth{-16-\BitBoxArrowInset} + + \draw[blue,->](1,\ArrowNorth)to[out=270,in=90](1,\ArrowSouth); % + \draw[blue,->](2,\ArrowNorth)to[out=270,in=90](2,\ArrowSouth); % + \draw[blue,->](3,\ArrowNorth)to[out=270,in=90](3,\ArrowSouth); % + \draw[blue,->](4,\ArrowNorth)to[out=270,in=90](4,\ArrowSouth); % + \draw[blue,->](5,\ArrowNorth)to[out=270,in=90](5,\ArrowSouth); % + \draw[blue,->](6,\ArrowNorth)to[out=270,in=90](6,\ArrowSouth); % + \draw[blue,->](7,\ArrowNorth)to[out=270,in=90](7,\ArrowSouth); % + \draw[blue,->](8,\ArrowNorth)to[out=270,in=90](8,\ArrowSouth); % + \draw[blue,->](9,\ArrowNorth)to[out=270,in=90](9,\ArrowSouth); % + \draw[blue,->](10,\ArrowNorth)to[out=270,in=90](10,\ArrowSouth); % + \draw[blue,->](11,\ArrowNorth)to[out=270,in=90](11,\ArrowSouth); % + \draw[blue,->](12,\ArrowNorth)to[out=270,in=90](12,\ArrowSouth); % + \draw[blue,->](13,\ArrowNorth)to[out=270,in=90](13,\ArrowSouth); % + \draw[blue,->](14,\ArrowNorth)to[out=270,in=90](14,\ArrowSouth); % + \draw[blue,->](15,\ArrowNorth)to[out=270,in=90](15,\ArrowSouth); % + \draw[blue,->](16,\ArrowNorth)to[out=270,in=90](16,\ArrowSouth); % + \draw[blue,->](17,\ArrowNorth)to[out=270,in=90](17,\ArrowSouth); % + \draw[blue,->](18,\ArrowNorth)to[out=270,in=90](18,\ArrowSouth); % + \draw[blue,->](19,\ArrowNorth)to[out=270,in=90](19,\ArrowSouth); % + \draw[blue,->](20,\ArrowNorth)to[out=270,in=90](20,\ArrowSouth); % + + \draw[red,->](34,\ArrowSouth+5)to[out=180,in=90](21,\ArrowSouth); % + \draw[red,->](34,\ArrowSouth+5)to[out=180,in=90](22,\ArrowSouth); % + \draw[red,->](34,\ArrowSouth+5)to[out=180,in=90](23,\ArrowSouth); % + \draw[red,->](34,\ArrowSouth+5)to[out=180,in=90](24,\ArrowSouth); % + \draw[red,->](34,\ArrowSouth+5)to[out=180,in=90](25,\ArrowSouth); % + \draw[red,->](34,\ArrowSouth+5)to[out=180,in=90](26,\ArrowSouth); % + \draw[red,->](34,\ArrowSouth+5)to[out=180,in=90](27,\ArrowSouth); % + \draw[red,->](34,\ArrowSouth+5)to[out=180,in=90](28,\ArrowSouth); % + \draw[red,->](34,\ArrowSouth+5)to[out=180,in=90](29,\ArrowSouth); % + \draw[red,->](34,\ArrowSouth+5)to[out=180,in=90](30,\ArrowSouth); % + \draw[red,->](34,\ArrowSouth+5)to[out=180,in=90](31,\ArrowSouth); % + \draw[red,->](34,\ArrowSouth+5)to[out=180,in=90](32,\ArrowSouth); % 0 (special case) + \node at (34.5,\ArrowSouth+5) {0}; + + \begin{scope}[shift={(0,0)}]\DrawHexMarkersRel{32}\end{scope} + \end{scope} + + \begin{scope}[shift={(0,-19.75)}] + \begin{scope}[shift={(0,1.5)}] + \DrawInsnBoxCastle{31}{12} + \DrawInsnBoxCastle{11}{0} + \end{scope} + \DrawInsnBoxRel{31}{0}{} + + \begin{scope}[shift={(0,0)}]\DrawBitstringX{abcdefghjkmnpqrstuvw000000000000}\end{scope} + + \begin{scope}[shift={(0,0)}]\DrawHexMarkersRel{32}\end{scope} + + \InsnBoxFieldWidthArrow{31}{12} + \InsnBoxFieldWidthArrow{11}{0} + \end{scope} \EndTikzPicture } diff --git a/book/rv32/chapter.tex b/book/rv32/chapter.tex index 82c0ea2..5ea7749 100644 --- a/book/rv32/chapter.tex +++ b/book/rv32/chapter.tex @@ -298,10 +298,15 @@ using the {\em imm} operand for bits 31:12 and then sign-extending it to the left\footnote{When XLEN is larger than 32.} and zero-extending the LSBs as discussed in \autoref{extension:zr}. -If \Gls{xlen}=32 then the imm value in this example will be -converted as shown below. +If \Gls{xlen}=32 then the {\em imm} value example will extracted from the instruction +and converted as shown below. -\DrawBitBoxSignLeftZeroRightExtendedPicture{32}{11010110000000000011}{12} +\DrawInsnOpUTypeDecoding + +%If \Gls{xlen}=32 then the imm value in this example will be +%converted as shown below. +% +%\DrawBitBoxSignLeftZeroRightExtendedPicture{32}{11010110000000000011}{12} Notice that the 20-bits of the imm field are mapped in the same order and in the same relative position that they appear in the instruction when @@ -356,8 +361,8 @@ and the value in bit-position 20 will be replicated to sign-extend the value to \Gls{xlen} bits as discussed in \autoref{extension:slzr}. -If \Gls{xlen}=32 then the {\em imm} value in this example will be converted as -shown below. +If \Gls{xlen}=32 then the {\em imm} value example will extracted from the instruction +and converted as shown below. \DrawInsnOpJTypeDecoding @@ -395,16 +400,32 @@ representing the number of bit positions to shift: \label{insnformat:itype} \DrawInsnTypeITikz{00000000010000011000001110000011} +If \Gls{xlen}=32 then the {\em imm} value example will extracted from the instruction +and converted as shown below. + +\DrawInsnOpITypeDecoding + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{S Type} \label{insnformat:stype} \DrawInsnTypeSTikz{00000000111100011000100110100011} +If \Gls{xlen}=32 then the {\em imm} value example will extracted from the instruction +and converted as shown below. + +\DrawInsnOpSTypeDecoding + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \subsection{B Type} \label{insnformat:btype} \DrawInsnTypeBTikz{00000000111100011000100011100011} +If \Gls{xlen}=32 then the {\em imm} value example will extracted from the instruction +and converted as shown below. + +\DrawInsnOpBTypeDecoding + + %insnTypeF %insnTypeCSRR