def _operation_delay_expression(expression: delay_model_pb2.DelayExpression, operation: delay_model_pb2.Operation) -> int: """Returns the value of a delay expression extracted from an operation.""" if expression.HasField('bin_op'): assert expression.HasField('lhs_expression') assert expression.HasField('rhs_expression') lhs_value = _operation_delay_expression(expression.lhs_expression, operation) rhs_value = _operation_delay_expression(expression.rhs_expression, operation) e = delay_model_pb2.DelayExpression.BinaryOperation return { e.ADD: lambda: lhs_value + rhs_value, e.DIVIDE: lambda: lhs_value / rhs_value, e.MAX: lambda: max(lhs_value, rhs_value), e.MIN: lambda: min(lhs_value, rhs_value), e.MULTIPLY: lambda: lhs_value * rhs_value, e.POWER: lambda: lhs_value**rhs_value, e.SUB: lambda: lhs_value - rhs_value, }[expression.bin_op]() if expression.HasField('factor'): return _operation_delay_factor(expression.factor, operation) assert expression.HasField('constant') return expression.constant
def _delay_expression_cpp_expression( expression: delay_model_pb2.DelayExpression, node_identifier: Text) -> Text: """Returns a C++ expression which computes a delay expression of an XLS Node*. Args: expression: The delay expression to extract. node_identifier: The identifier of the xls::Node* to extract the factor from. Returns: C++ expression computing the delay expression of a node. """ if expression.HasField('bin_op'): assert expression.HasField('lhs_expression') assert expression.HasField('rhs_expression') lhs_value = _delay_expression_cpp_expression(expression.lhs_expression, node_identifier) rhs_value = _delay_expression_cpp_expression(expression.rhs_expression, node_identifier) e = delay_model_pb2.DelayExpression.BinaryOperation return { e.ADD: lambda: '({} + {})'.format(lhs_value, rhs_value), e.DIVIDE: lambda: '({} / {})'.format(lhs_value, rhs_value), e.MAX: lambda: 'std::max({}, {})'.format(lhs_value, rhs_value), e.MIN: lambda: 'std::min({}, {})'.format(lhs_value, rhs_value), e.MULTIPLY: lambda: '({} * {})'.format(lhs_value, rhs_value), e.POWER: lambda: 'pow({}, {})'.format(lhs_value, rhs_value), e.SUB: lambda: '({} - {})'.format(lhs_value, rhs_value), }[expression.bin_op]() if expression.HasField('factor'): return 'static_cast<float>({})'.format( _delay_factor_cpp_expression(expression.factor, node_identifier)) assert expression.HasField('constant') return 'static_cast<float>({})'.format(expression.constant)
def _set_divide_expression(expr: delay_model_pb2.DelayExpression): expr.bin_op = delay_model_pb2.DelayExpression.BinaryOperation.DIVIDE
def _set_sub_expression(expr: delay_model_pb2.DelayExpression): expr.bin_op = delay_model_pb2.DelayExpression.BinaryOperation.SUB
def _set_constant_expression(expr: delay_model_pb2.DelayExpression, value: int): expr.constant = value
def _set_power_expression(expr: delay_model_pb2.DelayExpression): expr.bin_op = delay_model_pb2.DelayExpression.BinaryOperation.POWER
def _set_multiply_expression(expr: delay_model_pb2.DelayExpression): expr.bin_op = delay_model_pb2.DelayExpression.BinaryOperation.MULTIPLY