/* * nextpnr -- Next Generation Place and Route * * Copyright (C) 2021 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 SITE_LUT_MAPPING_CACHE_H #define SITE_LUT_MAPPING_CACHE_H #include "idstring.h" #include "nextpnr_namespaces.h" #include "site_arch.h" NEXTPNR_NAMESPACE_BEGIN // Key structure used in site LUT mapping cache struct SiteLutMappingKey { // Maximum number of LUT cells per site static constexpr size_t MAX_LUT_CELLS = 8; // Maximum number of LUT inputs per cell static constexpr size_t MAX_LUT_INPUTS = 6; // LUT Cell data struct Cell { IdString type; // Cell type int32_t belIndex; // Bound BEL index // Port to net assignments. These are local net ids generated during // key creation. This is to abstract connections from actual design // net names. the Id 0 means unconnected. std::array conns; bool operator==(const Cell &other) const { return (type == other.type) && (belIndex == other.belIndex) && (conns == other.conns); } bool operator!=(const Cell &other) const { return (type != other.type) || (belIndex != other.belIndex) || (conns != other.conns); } }; int32_t tileType; // Tile type int32_t siteType; // Site type in that tile type size_t numCells; // LUT cell count std::array cells; // LUT cell data unsigned int hash_; // Precomputed hash // Creates a key from the given site state static SiteLutMappingKey create(const SiteInformation &siteInfo); // Returns size in bytes of the key size_t getSizeInBytes() const { return sizeof(SiteLutMappingKey); } // Precomputes hash of the key and stores it within void computeHash() { hash_ = mkhash(0, tileType); hash_ = mkhash(hash_, siteType); hash_ = mkhash(hash_, numCells); for (size_t j = 0; j < numCells; ++j) { const auto &cell = cells[j]; hash_ = mkhash(hash_, cell.type.index); hash_ = mkhash(hash_, cell.belIndex); for (size_t i = 0; i < MAX_LUT_INPUTS; ++i) { hash_ = mkhash(hash_, cell.conns[i]); } } } // Compares cell data of this and other key bool compareCells(const SiteLutMappingKey &other) const { if (numCells != other.numCells) { return false; } for (size_t i = 0; i < numCells; ++i) { if (cells[i] != other.cells[i]) { return false; } } return true; } bool operator==(const SiteLutMappingKey &other) const { return (hash_ == other.hash_) && (tileType == other.tileType) && (siteType == other.siteType) && compareCells(other); } bool operator!=(const SiteLutMappingKey &other) const { return (hash_ != other.hash_) || (tileType != other.tileType) || (siteType != other.siteType) || !compareCells(other); } unsigned int hash() const { return hash_; } }; // Site LUT mapping result data struct SiteLutMappingResult { // LUT cell data struct Cell { int32_t belIndex; // BEL in tile index LutCell lutCell; // LUT mapping data dict belPins; // Cell to BEL pin mapping }; bool isValid; // Validit
/* Copyright 2017 Joseph Wasson
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
#ifndef PROCESS_STENO_H
#define PROCESS_STENO_H

#include "quantum.h"

typedef enum { STENO_MODE_BOLT, STENO_MODE_GEMINI } steno_mode_t;

bool     process_steno(uint16_t keycode, keyrecord_t *record);
void     steno_init(void);
void     steno_set_mode(steno_mode_t mode);
uint8_t *steno_get_state(void);
uint8_t *steno_get_chord(void);

#endif