Есть ли причина, по которой вы не хотите просто определять несколько функций вместе с вашими пользовательскими типами?
В дополнение к определению новых функций (таких как ваш is_square, выше) вы можете переопределить существующие функции (такие как +, <и т. Д.), Если это имеет смысл для вашего кода. </p>
Обычно вы бы упаковывали свои пользовательские типы и функции для манипулирования ими в пакет, который затем использовали бы в своем коде. См., Например, стандартные пакеты VHDL math_real и numeric_std.