Commit 655fa773 authored by Theodor-Adrian Stana's avatar Theodor-Adrian Stana

doc: Add and change information for v2.1 gateware

parent 3b4a2796
......@@ -9,9 +9,9 @@
\noindent \rule{\textwidth}{.1cm}
\hfill Gateware v2.0
\hfill Gateware v2.1
\hfill March 26, 2014
\hfill April 8, 2014
\vspace*{3cm}
......
\subsection{Converter board registers}
\label{subsec:wbgen:reg}
\label{app:conv-regs}
Base address: 0xf{}f{}f{}f{}f{}f{}f{}f
Base address: 0x000
{
\rowcolors{2}{white}{gray!25}
\begin{longtable}{l l l p{.5\textwidth}}
......@@ -16,26 +16,30 @@ Base address: 0xf{}f{}f{}f{}f{}f{}f{}f
\hline
\endfoot
0x0 & 0x54424c4f & BIDR & Board ID Register\\
0x4 & 0xf{}f{}f{}f{}f{}f{}f{}f & SR & Status Register\\
0x8 & 0xf{}f{}f{}f{}f{}f{}f{}f & CR & Control Register\\
0xc & 0xf{}f{}f{}f{}f{}f{}f{}f & CH1PCR & Channel 1 Pulse Counter Register\\
0x10 & 0xf{}f{}f{}f{}f{}f{}f{}f & CH2PCR & Channel 2 Pulse Counter Register\\
0x14 & 0xf{}f{}f{}f{}f{}f{}f{}f & CH3PCR & Channel 3 Pulse Counter Register\\
0x18 & 0xf{}f{}f{}f{}f{}f{}f{}f & CH4PCR & Channel 4 Pulse Counter Register\\
0x1c & 0xf{}f{}f{}f{}f{}f{}f{}f & CH5PCR & Channel 5 Pulse Counter Register\\
0x20 & 0xf{}f{}f{}f{}f{}f{}f{}f & CH6PCR & Channel 6 Pulse Counter Register\\
0x24 & 0xf{}f{}f{}f{}f{}f{}f{}f & TVLR & Time Value Low Register\\
0x28 & 0xf{}f{}f{}f{}f{}f{}f{}f & TVHR & Time Value High Register\\
0x2c & 0xf{}f{}f{}f{}f{}f{}f{}f & TBMR & Tag Buffer Meta Register\\
0x30 & 0xf{}f{}f{}f{}f{}f{}f{}f & TBCYR & Tag Buffer Cycles Register\\
0x34 & 0xf{}f{}f{}f{}f{}f{}f{}f & TBTLR & Tag Buffer TAI Low Register\\
0x38 & 0xf{}f{}f{}f{}f{}f{}f{}f & TBTHR & Tag Buffer TAI High Register\\
0x3c & 0xf{}f{}f{}f{}f{}f{}f{}f & TBCSR & Tag Buffer Control and Status Register\\
0x4 & (1) & SR & Status Register\\
0x8 & 0x00000000 & CR & Control Register\\
0xc & 0x00000000 & CH1PCR & Channel 1 Pulse Counter Register\\
0x10 & 0x00000000 & CH2PCR & Channel 2 Pulse Counter Register\\
0x14 & 0x00000000 & CH3PCR & Channel 3 Pulse Counter Register\\
0x18 & 0x00000000 & CH4PCR & Channel 4 Pulse Counter Register\\
0x1c & 0x00000000 & CH5PCR & Channel 5 Pulse Counter Register\\
0x20 & 0x00000000 & CH6PCR & Channel 6 Pulse Counter Register\\
0x24 & 0x00000000 & TVLR & Time Value Low Register\\
0x28 & 0x00000000 & TVHR & Time Value High Register\\
0x2c & 0x00000000 & TBMR & Tag Buffer Meta Register\\
0x30 & 0x00000000 & TBCYR & Tag Buffer Cycles Register\\
0x34 & 0x00000000 & TBTLR & Tag Buffer TAI Low Register\\
0x38 & 0x00000000 & TBTHR & Tag Buffer TAI High Register\\
0x3c & 0x00020000 & TBCSR & Tag Buffer Control and Status Register\\
\end{longtable}
}
\noindent Note (1): The reset value of the SR cannot be specified, since it is based on the
gateware version, the state of the on-board switches and whether an RTM is plugged in or not.
\vspace{11pt}
\subsubsection{BIDR -- Board ID Register}
\label{app:conv-regs-bidr}
\vspace{11pt}
\noindent
......@@ -74,6 +78,7 @@ Reset value: 0x54424c4f
\end{itemize}
\vspace{11pt}
\subsubsection{SR -- Status Register}
\label{app:conv-regs-sr}
\vspace{11pt}
\noindent
......@@ -104,14 +109,14 @@ Reset value: 0x54424c4f
GWVERS
} [\emph{read-only}]: Gateware version
\\
Leftmost nibble hex value is major release decimal value \\ Rightmost nibble hex value is minor release decimal value \\ e.g. \\ 0x11 -- v1.1 \\ 0x1e -- v1.14 \\ 0x20 -- v2.0
Leftmost nibble hex value is major release decimal value \\ Rightmost nibble hex value is minor release decimal value \\ e.g. \\ 0x11 -- v1.1 \\ 0x2e -- v2.14
\end{small}
\item \begin{small}
{\bf
SWITCHES
} [\emph{read-only}]: Status of on-board switches
} [\emph{read-only}]: Status of on-board switches (see Section~\ref{sec:switches})
\\
0 -- switch is ON \\ 1 -- switch is OFF \\ bit 0 -- SW1.1 \\ bit 1 -- SW1.2 \\ ... \\ bit 4 -- SW2.1 \\ ... \\ bit 7 -- SW2.4
0 -- switch is ON \\ 1 -- switch is OFF
\end{small}
\item \begin{small}
{\bf
......@@ -123,7 +128,7 @@ RTM
\item \begin{small}
{\bf
I2C\_WDTO
} [\emph{read/write}]: I2C communication watchdog timeout error
} [\emph{read/write}]: Communication watchdog timer status
\\
1 -- timeout occured \\ 0 -- no timeout \\ This bit can be cleared by writing a '1' to it
\end{small}
......@@ -139,14 +144,14 @@ WRPRES
I2C\_ERR
} [\emph{read/write}]: I2C communication error
\\
1 -- attempted to address non-existing address \\ 0 -- idle
1 -- attempted to address non-existing address \\ 0 -- idle \\ This bit can be cleared by writing a '1' to it
\end{small}
\item \begin{small}
{\bf
PMISSE
} [\emph{read/write}]: Pulse missed error
\\
1 -- pulse arrived during pulse rejection phase \\ 0 -- idle
1 -- input pulse rejected to safeguard blocking output stage \\ 0 -- idle \\ This bit can be cleared by writing a '1' to it
\end{small}
\item \begin{small}
\textbf{Unimplemented bits}: write as '0', read undefined
......@@ -154,6 +159,7 @@ PMISSE
\end{itemize}
\vspace{11pt}
\subsubsection{CR -- Control Register}
\label{app:conv-regs-cr}
\vspace{11pt}
\noindent
......@@ -206,6 +212,7 @@ Write the following sequence to trigger a pulse: \\ 0xde --
\end{itemize}
\vspace{11pt}
\subsubsection{CH1PCR -- Channel 1 Pulse Counter Register}
\label{app:conv-regs-ch1pcr}
\vspace{11pt}
\noindent
......@@ -242,6 +249,7 @@ CH1PCR
\end{itemize}
\vspace{11pt}
\subsubsection{CH2PCR -- Channel 2 Pulse Counter Register}
\label{app:conv-regs-ch2pcr}
\vspace{11pt}
\noindent
......@@ -278,6 +286,7 @@ CH2PCR
\end{itemize}
\vspace{11pt}
\subsubsection{CH3PCR -- Channel 3 Pulse Counter Register}
\label{app:conv-regs-ch3pcr}
\vspace{11pt}
\noindent
......@@ -314,6 +323,7 @@ CH3PCR
\end{itemize}
\vspace{11pt}
\subsubsection{CH4PCR -- Channel 4 Pulse Counter Register}
\label{app:conv-regs-ch4pcr}
\vspace{11pt}
\noindent
......@@ -350,6 +360,7 @@ CH4PCR
\end{itemize}
\vspace{11pt}
\subsubsection{CH5PCR -- Channel 5 Pulse Counter Register}
\label{app:conv-regs-ch5pcr}
\vspace{11pt}
\noindent
......@@ -386,6 +397,7 @@ CH5PCR
\end{itemize}
\vspace{11pt}
\subsubsection{CH6PCR -- Channel 6 Pulse Counter Register}
\label{app:conv-regs-ch6pcr}
\vspace{11pt}
\noindent
......@@ -422,6 +434,7 @@ CH6PCR
\end{itemize}
\vspace{11pt}
\subsubsection{TVLR -- Time Value Low Register}
\label{app:conv-regs-tvlr}
\vspace{11pt}
\noindent
......@@ -460,6 +473,7 @@ Writing this field resets the internal cycles counter.
\end{itemize}
\vspace{11pt}
\subsubsection{TVHR -- Time Value High Register}
\label{app:conv-regs-tvhr}
\vspace{11pt}
\noindent
......@@ -498,6 +512,7 @@ Writing this field resets the internal cycles counter.
\end{itemize}
\vspace{11pt}
\subsubsection{TBMR -- Tag Buffer Meta Register}
\label{app:conv-regs-tbmr}
\vspace{11pt}
\noindent
......@@ -540,9 +555,13 @@ WRTAG
\item \begin{small}
\textbf{Unimplemented bits}: write as '0', read undefined
\end{small}
\item \begin{small}
\textbf{A read from this register advances the buffer read pointer, if the ring buffer is not empty}
\end{small}
\end{itemize}
\vspace{11pt}
\subsubsection{TBCYR -- Tag Buffer Cycles Register}
\label{app:conv-regs-tbcyr}
\vspace{11pt}
\noindent
......@@ -581,6 +600,7 @@ Value of the 8-ns cycles counter when time tag was taken.
\end{itemize}
\vspace{11pt}
\subsubsection{TBTLR -- Tag Buffer TAI Low Register}
\label{app:conv-regs-tbtlr}
\vspace{11pt}
\noindent
......@@ -619,8 +639,9 @@ Value of the TAI seconds counter bits 31..0 when time tag was taken.
\end{itemize}
\vspace{11pt}
\subsubsection{TBTHR -- Tag Buffer TAI High Register}
\label{app:conv-regs-tbthr}
\vspace{11pt}
%\vspace{11pt}
\noindent
\resizebox{\textwidth}{!}{
\begin{tabular}{>{\centering\arraybackslash}p{1.5cm} >{\centering\arraybackslash}p{1.5cm} >{\centering\arraybackslash}p{1.5cm} >{\centering\arraybackslash}p{1.5cm} >{\centering\arraybackslash}p{1.5cm} >{\centering\arraybackslash}p{1.5cm} >{\centering\arraybackslash}p{1.5cm} >{\centering\arraybackslash}p{1.5cm} }
......@@ -657,6 +678,7 @@ Value of the TAI seconds counter bits 39..32 when time tag was taken.
\end{itemize}
\vspace{11pt}
\subsubsection{TBCSR -- Tag Buffer Control and Status Register}
\label{app:conv-regs-tbcsr}
\vspace{11pt}
\noindent
......@@ -706,7 +728,7 @@ EMPTY
\item \begin{small}
{\bf
CLR
} [\emph{read/write}]: Clear tag buffer
} [\emph{write-only}]: Clear tag buffer
\\
1 -- clear\\ 0 -- no effect
\end{small}
......
......@@ -9,8 +9,8 @@
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="407.12796"
height="430.57178"
width="400.09671"
height="378.54895"
id="svg2"
version="1.1"
inkscape:version="0.48.3.1 r9886"
......@@ -139,7 +139,7 @@
inkscape:pageshadow="2"
inkscape:zoom="1.979899"
inkscape:cx="114.59102"
inkscape:cy="261.43892"
inkscape:cy="229.57576"
inkscape:document-units="px"
inkscape:current-layer="g3109"
showgrid="true"
......@@ -278,23 +278,23 @@
xml:space="preserve"
style="font-size:10px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
x="212.3093"
y="597.9649"
y="545.94208"
id="text3218"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan3220"
x="212.3093"
y="597.9649"
y="545.94208"
style="font-size:14px;font-weight:bold">(a)</tspan></text>
<text
sodipodi:linespacing="125%"
id="text3222"
y="597.9649"
y="545.94208"
x="433.26901"
style="font-size:10px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
xml:space="preserve"><tspan
style="font-size:14px;font-weight:bold"
y="597.9649"
y="545.94208"
x="433.26901"
id="tspan3224"
sodipodi:role="line">(b)</tspan></text>
......@@ -309,12 +309,12 @@
<text
sodipodi:linespacing="125%"
id="text4389-7"
y="560.02997"
y="508.00711"
x="363.52557"
style="font-size:10px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
xml:space="preserve"><tspan
style="font-weight:bold"
y="560.02997"
y="508.00711"
x="363.52557"
id="tspan4391-9"
sodipodi:role="line">end</tspan></text>
......@@ -411,23 +411,6 @@
x="389.97046"
sodipodi:role="line"
id="tspan4550">Status LEDs</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#TriangleOutL)"
d="m 371.04188,499.59413 0,45.66929"
id="path4554"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-size:10px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
x="389.97046"
y="527.49554"
id="text4556"
sodipodi:linespacing="125%"><tspan
id="tspan4560"
sodipodi:role="line"
x="389.97046"
y="527.49554">RTM detection</tspan></text>
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
......
......@@ -197,8 +197,8 @@
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.979899"
inkscape:cx="317.41381"
inkscape:cy="40.155048"
inkscape:cx="235.59684"
inkscape:cy="21.651564"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="true"
......@@ -527,18 +527,18 @@
<text
xml:space="preserve"
style="font-size:10px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
x="165.338"
y="361.04849"
x="162.95987"
y="366.73227"
id="text14796"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
x="165.338"
y="361.04849"
x="162.95987"
y="366.73227"
style="font-size:12px;font-weight:normal;text-align:end;text-anchor:end"
id="tspan4044">RTM det.</tspan><tspan
sodipodi:role="line"
x="165.338"
y="376.04849"
x="162.95987"
y="381.73227"
id="tspan14800"
style="font-size:12px;font-weight:normal;text-align:end;text-anchor:end">lines</tspan></text>
<g
......@@ -659,12 +659,6 @@
id="path3953"
d="m 165.26378,314.60064 22.5315,-0.0232"
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1;marker-start:url(#marker3106);marker-end:url(#marker3114)" />
<path
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1;marker-start:none;marker-end:url(#marker3114)"
d="m 165.26378,364.08584 22.5315,-0.0116"
id="path4037"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc" />
<g
id="g5729"
transform="translate(50.708936,-11.515724)">
......@@ -851,7 +845,7 @@
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path5045"
d="m 246.25984,370.27556 38.97638,-10e-6"
d="m 164.76378,370.27556 120.47244,-10e-6"
style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;marker-end:url(#marker3114)" />
<g
transform="translate(0,-97.440956)"
......@@ -881,34 +875,6 @@
x="404.66464"
sodipodi:role="line">module</tspan></text>
</g>
<g
id="g4090"
transform="translate(-2.8156828,55.421341)">
<rect
style="opacity:0.98999999;fill:#cccccc;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
id="rect4092"
width="54.921246"
height="23.031549"
x="194.15427"
y="297.13773" />
<text
sodipodi:linespacing="125%"
id="text4094"
y="306.51288"
x="221.45082"
style="font-size:10px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
xml:space="preserve"><tspan
id="tspan4096"
style="font-size:8px;font-weight:normal;text-align:center;text-anchor:middle"
y="306.51288"
x="221.45082"
sodipodi:role="line">RTM</tspan><tspan
id="tspan4098"
style="font-size:8px;font-weight:normal;text-align:center;text-anchor:middle"
y="316.51288"
x="221.45082"
sodipodi:role="line">detector</tspan></text>
</g>
<text
sodipodi:linespacing="125%"
id="text4102"
......
This diff is collapsed.
......@@ -66,8 +66,9 @@
14-02-2014 & 2.00 & Version 2.0 of gateware, with diagnostics support including: unique board ID
and temperature readout, input pulse counters, pulse time-tagging and
manual pulse triggering. \\
26-03-2014 & 2.10 & Version 2.1 of gateware, bringing down the max. allowed pulse frequency
to 1.6~kHz and changing the pulse timetag FIFO for a timetag buffer\\
08-04-2014 & 2.10 & Version 2.1 of gateware, bringing down the max. allowed input pulse frequency,
changing the ERR LED behaviour, adding system errors and changing the pulse
timetag FIFO for a timetag ring buffer \\
\hline
\end{tabular}
}
......@@ -314,46 +315,7 @@ FPGA architecture is not guaranteed to provide the same results. The \textit{res
module has an initial value set for the counter signal after power-up, which is guaranteed
by XST to be set after the FPGA's GSR signal is de-asserted.
By default, the reset time is set to 100~$ms$.
%==============================================================================
% SEC: RTM detection
%==============================================================================
\pagebreak
\section{RTM detection}
\label{sec:rtm-detect}
\centerline
{
\begin{tabular}{l l l}
\hline
\textbf{Entity} & \textit{rtm\_detector} & \\
\textbf{Ports} & \textit{rtmm\_i(2..0)} & RTM mainboard detection lines \\
& \textit{rtmp\_i(2..0)} & RTM piggyback detection lines \\
& \textit{rtmm\_ok\_o} & RTM mainboard present \\
& \textit{rtmp\_ok\_o} & RTM piggyback present \\
\textbf{Usage} & Light ERR status LED & \\
\hline
\end{tabular}
}
\vspace*{11pt}
RTM detection is described in \cite{rtm-det}. Since an RTMM/P missing would mean
all \textit{rtmm\_i}/\textit{rtmp\_i} lines are all-ones, the \textit{rtm\_detector}
module sets the \textit{rtmm\_ok} and \textit{rtmp\_ok} signals low if the
\textit{rtmm\_i} and \textit{rtmp\_i} input signals are respectively all-ones.
The \textit{rtmm\_ok} and \textit{rtmp\_ok} signals are NANDed together to light
the ERR status LED on the CONV-TTL-BLO. The status of the RTM detection lines
can also be read via their respective fields in the converter board status register
(SR -- see Appendix~\ref{app:conv-regs-sr}).
\begin{figure}[h]
\centerline{\includegraphics[width=.76\textwidth]{fig/rtm-detect}}
\caption{\textit{rtm\_detector} block in CONV-TTL-BLO gateware}
\label{fig:rtm-detect}
\end{figure}
By default, the reset time is set to 100~ms.
%==============================================================================
% SEC: Bicolor LEDs
......@@ -493,6 +455,7 @@ selection signals to these multiplexers are set throughout the logic.
& \textit{en\_i} & Pulse generator enable \\
& \textit{gf\_en\_n\_i} & Active-low glitch filter enable \\
& \textit{trig\_a\_i} & Pulse trigger \\
& \textit{pulse\_err\_p\_o} & Pulse error \\
& \textit{pulse\_o} & Pulse output \\
\textbf{Usage} & Output pulse & 1.2~$\mu$s pulses with min. period of 6~$\mu$s \\
& & and one-cycle wide glitch filter \\
......@@ -574,6 +537,13 @@ is in this rejection state, they are not replicated at the output. The pulse rej
phase lasts for \textit{g\_duty\_cycle\_div}*\textit{g\_pwidth}, yielding a maximum duty
cycle of 1/\textit{g\_duty\_cycle\_div} for input pulses.
Should a pulse rising-edge arrive anywhere within the generation or rejection phase
in the FSM, the \textit{pulse\_err\_p\_o} output is set high for one clock cycle. This
signal can be used to, e.g., count the number of pulses that were rejected on a board. In
the actual top-level design, however, missed pulse counting is not implemented, the
\textit{pulse\_err\_p\_o} output simply asserts the SR.PMISSE bit (see
Appendix~\ref{app:conv-regs-sr}).
Note that due to the fact that the counter starts counting up from zero and delays
in the glitch filter when it is enabled, the maximum value of the internal counter is not
\textit{g\_pwidth}. Instead, the counter counts up to a pair of VHDL constants defined
......@@ -905,7 +875,6 @@ The folder structure for the project is presented below.
\end{itemize}
\item conv\_pulse\_gen.vhd
\item reset\_gen.vhd
\item rtm\_detector.vhd
\end{itemize}
\item sim/
\item syn/
......@@ -1052,9 +1021,6 @@ top-level file.
Status LEDs & -- \textit{bicolor\_led\_ctrl} instantiation \newline
-- connecting the \textit{led\_state\_i} input of the
component to the relevant control signals \\
RTM detection & -- inverting the input signals from the RTM detection lines \newline
-- \textit{rtm\_detector} component instantiation \\
\end{longtable}
} % end rowcolors
......
......@@ -32,8 +32,7 @@ peripheral {
Rightmost nibble hex value is minor release decimal value \
e.g. \
0x11 -- v1.1 \
0x1e -- v1.14 \
0x20 -- v2.0";
0x2e -- v2.14";
prefix = "gwvers";
type = SLV;
size = 8;
......@@ -43,12 +42,7 @@ peripheral {
field {
name = "Status of on-board switches";
description = "0 -- switch is ON \
1 -- switch is OFF \
bit 0 -- SW1.1 \
... \
bit 4 -- SW2.1 \
... \
bit 7 -- SW2.4";
1 -- switch is OFF";
prefix = "switches";
type = SLV;
size = 8;
......@@ -89,7 +83,8 @@ peripheral {
field {
name = "I2C communication error";
description = "1 -- attempted to address non-existing address \
0 -- idle";
0 -- idle \
This bit can be cleared by writing a '1' to it";
prefix = "i2c_err";
type = BIT;
access_dev = READ_WRITE;
......@@ -99,7 +94,8 @@ peripheral {
field {
name = "Pulse missed error";
description = "1 -- pulse arrived during pulse rejection phase \
0 -- idle";
0 -- idle \
This bit can be cleared by writing a '1' to it";
prefix = "pmisse";
type = BIT;
access_dev = READ_WRITE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment