@normalize_types<EOL><INDENT>def mul(self, o):<DEDENT>
if self.is_integer and o.is_integer:<EOL><INDENT>a, b = self.lower_bound, o.lower_bound<EOL>ret = StridedInterval(bits=self.bits,<EOL>stride=<NUM_LIT:0>,<EOL>lower_bound=a * b,<EOL>upper_bound=a * b<EOL>)<EOL>if a * b > (<NUM_LIT:2> ** self.bits - <NUM_LIT:1>):<EOL><INDENT>logger.warning('<STR_LIT>')<EOL><DEDENT>return ret.normalize()<EOL><DEDENT>else:<EOL><INDENT>si1_psplit = self._psplit()<EOL>si2_psplit = o._psplit()<EOL>all_resulting_intervals = list()<EOL>for si1 in si1_psplit:<EOL><INDENT>for si2 in si2_psplit:<EOL><INDENT>tmp_unsigned_mul = self._wrapped_unsigned_mul(si1, si2)<EOL>tmp_signed_mul = self._wrapped_signed_mul(si1, si2)<EOL>for tmp_meet in tmp_unsigned_mul._multi_valued_intersection(tmp_signed_mul):<EOL><INDENT>all_resulting_intervals.append(tmp_meet)<EOL><DEDENT><DEDENT><DEDENT><DEDENT>return StridedInterval.least_upper_bound(*all_resulting_intervals).normalize()<EOL>
Binary operation: multiplication

:param o: The other operand
:return: self * o