[otbn] Change how we describe valid ranges for PC-relative operands

It used to look something like this:

  Valid range: .-1048576 to .+1048574 in steps of 2

And is now expanded quite a lot to be super-explicit:

  Valid range: -1048576 to 1048574 in steps of 2. This is encoded
  PC-relative but appears as an absolute value in assembly. To write a
  raw value in an assembly file, write something in the range
  .-1048576 to .+1048574.

Signed-off-by: Rupert Swarbrick <rswarbrick@lowrisc.org>
diff --git a/hw/ip/otbn/util/shared/operand.py b/hw/ip/otbn/util/shared/operand.py
index 033bf96..97109a1 100644
--- a/hw/ip/otbn/util/shared/operand.py
+++ b/hw/ip/otbn/util/shared/operand.py
@@ -295,10 +295,9 @@
 
         return ImmOperandType(width, enc_offset, shift, signed, pc_rel)
 
-    def doc_rel_to_abs(self, value: int) -> str:
-        if not self.pc_rel:
-            return str(value)
-
+    @staticmethod
+    def _doc_rel_to_abs(value: int) -> str:
+        '''Turn X to . + X or . - X, as appropriate.'''
         if value < 0:
             return '.-{}'.format(-value)
         elif value == 0:
@@ -308,21 +307,27 @@
 
     def markdown_doc(self) -> Optional[str]:
         # Override from OperandType base class
-        rel_rng = self.get_doc_range()
-        if rel_rng is None:
+        rng = self.get_doc_range()
+        if rng is None:
             return None
 
-        rel_lo, rel_hi = rel_rng
+        lo, hi = rng
         if self.shift == 0:
             stp_msg = ''
         else:
             stp_msg = ' in steps of `{}`'.format(1 << self.shift)
 
-        abs_lo = self.doc_rel_to_abs(rel_lo)
-        abs_hi = self.doc_rel_to_abs(rel_hi)
+        rel_suffix = ''
+        if self.pc_rel:
+            rel_suffix = (' This is encoded PC-relative but appears '
+                          'as an absolute value in assembly. To write a raw '
+                          'value in an assembly file, write something in the '
+                          'range `{}` to `{}`.'
+                          .format(ImmOperandType._doc_rel_to_abs(lo),
+                                  ImmOperandType._doc_rel_to_abs(hi)))
 
-        return ('Valid range: `{} to {}`{}'
-                .format(abs_lo, abs_hi, stp_msg))
+        return ('Valid range: `{}` to `{}`{}.{}'
+                .format(lo, hi, stp_msg, rel_suffix))
 
     def describe_decode(self, bits_lst: List[str]) -> str:
         # The "most general" result is something like this: