diff options
| author | Keith Rothman <537074+litghost@users.noreply.github.com> | 2021-02-05 14:18:38 -0800 | 
|---|---|---|
| committer | Keith Rothman <537074+litghost@users.noreply.github.com> | 2021-02-17 12:03:16 -0800 | 
| commit | a7421399f776ed9aebfa7b940bbaf5f327244f17 (patch) | |
| tree | 710a1bafbb7a1429716a749294f0facf97252aa3 /common/constraints.impl.h | |
| parent | 782747cc0c8af192b6744e09e2e8db74a80cb530 (diff) | |
| download | nextpnr-a7421399f776ed9aebfa7b940bbaf5f327244f17.tar.gz nextpnr-a7421399f776ed9aebfa7b940bbaf5f327244f17.tar.bz2 nextpnr-a7421399f776ed9aebfa7b940bbaf5f327244f17.zip | |
Working on standing up initial constraints system.
Signed-off-by: Keith Rothman <537074+litghost@users.noreply.github.com>
Diffstat (limited to 'common/constraints.impl.h')
| -rw-r--r-- | common/constraints.impl.h | 109 | 
1 files changed, 109 insertions, 0 deletions
| diff --git a/common/constraints.impl.h b/common/constraints.impl.h new file mode 100644 index 00000000..9c978411 --- /dev/null +++ b/common/constraints.impl.h @@ -0,0 +1,109 @@ +/* + *  nextpnr -- Next Generation Place and Route + * + *  Copyright (C) 2021  The SymbiFlow Authors. + * + *  Permission to use, copy, modify, and/or distribute this software for any + *  purpose with or without fee is hereby granted, provided that the above + *  copyright notice and this permission notice appear in all copies. + * + *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#ifndef CONSTRAINTS_IMPL_H +#define CONSTRAINTS_IMPL_H + +#include "exclusive_state_groups.impl.h" + +NEXTPNR_NAMESPACE_BEGIN + +template <size_t StateCount, typename StateType, typename CountType> +template <typename ConstraintRange> +void Constraints<StateCount, StateType, CountType>::bindBel(TagState *tags, const ConstraintRange constraints) +{ +    for (const auto &constraint : constraints) { +        switch (constraint.constraint_type()) { +        case CONSTRAINT_TAG_IMPLIES: +            tags[constraint.tag()].add_implies(constraint.state()); +            break; +        case CONSTRAINT_TAG_REQUIRES: +            break; +        default: +            NPNR_ASSERT(false); +        } +    } +} + +template <size_t StateCount, typename StateType, typename CountType> +template <typename ConstraintRange> +void Constraints<StateCount, StateType, CountType>::unbindBel(TagState *tags, const ConstraintRange constraints) +{ +    for (const auto &constraint : constraints) { +        switch (constraint.constraint_type()) { +        case CONSTRAINT_TAG_IMPLIES: +            tags[constraint.tag()].remove_implies(constraint.state()); +            break; +        case CONSTRAINT_TAG_REQUIRES: +            break; +        default: +            NPNR_ASSERT(false); +        } +    } +} + +template <size_t StateCount, typename StateType, typename CountType> +template <typename ConstraintRange> +bool Constraints<StateCount, StateType, CountType>::isValidBelForCellType(const Context *ctx, uint32_t prototype, +                                                                          const TagState *tags, +                                                                          const ConstraintRange constraints, +                                                                          IdString object, IdString cell, BelId bel, +                                                                          bool explain_constraints) const +{ +    if (explain_constraints) { +        auto &state_definition = definitions.at(prototype); +        for (const auto &constraint : constraints) { +            switch (constraint.constraint_type()) { +            case CONSTRAINT_TAG_IMPLIES: +                tags[constraint.tag()].explain_implies(ctx, object, cell, state_definition.at(constraint.tag()), bel, +                                                       constraint.state()); +                break; +            case CONSTRAINT_TAG_REQUIRES: +                tags[constraint.tag()].explain_requires(ctx, object, cell, state_definition.at(constraint.tag()), bel, +                                                        constraint.states()); +                break; +            default: +                NPNR_ASSERT(false); +            } +        } +    } + +    for (const auto &constraint : constraints) { +        switch (constraint.constraint_type()) { +        case CONSTRAINT_TAG_IMPLIES: +            if (!tags[constraint.tag()].check_implies(constraint.state())) { +                return false; +            } +            break; +        case CONSTRAINT_TAG_REQUIRES: +            if (!tags[constraint.tag()].requires(constraint.states())) { +                return false; +            } +            break; +        default: +            NPNR_ASSERT(false); +        } +    } + +    return true; +} + +NEXTPNR_NAMESPACE_END + +#endif | 
