Exemple #1
0
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
Exemple #2
0
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