Compare commits

..

16 Commits

Author SHA1 Message Date
gullradriel 110a543ed3 save and restore region and or manual frequency values (#2340) 2024-11-05 14:56:38 +01:00
Benjamin Møller da5322765d Add about_simple updater from github (#2328)
* Generator for updating the about-page in PP from github.

* Fixing typo

* Rename generate_ui-about-simple.ccp.py to generate_ui-about-simple.cpp.py

Rename file, fix typo
2024-11-05 10:41:08 +08:00
gullradriel 8df05a57ea Disable ui_fsk_rx (#2337)
* removing ui_fsk_rx.cpp from targets

* removing unneeded ui_fsk_rx.hpp from includes

* deleting the now unused ui_fsk_rx.cpp and hpp files

---------

Co-authored-by: gullradriel <gullradriel@no-mail.com>
2024-11-04 08:28:03 +08:00
sommermorgentraum bea9f444c6 fine tune waveform and ook again (#2322) 2024-11-03 20:19:29 +01:00
jLynx abd6177303 H4M CPLD (#2335)
* Added CPLD code for H4M

* Added CPLD code for H4M

* Added CPLD code for H4M

* Added CPLD code for H4M

* Clean up

* Clean up
2024-11-03 11:25:43 +13:00
Totoo d6a9c74665 Auto start again (#2333)
* Extend autostart a bit

* @zxkmm 's sizeof fix
2024-11-02 22:15:33 +08:00
sommermorgentraum 5bb23b636e autostart fix 2 (#2331) 2024-11-02 10:43:42 +01:00
jLynx d5296c6ac3 H4M open source schematic (#2332)
* Create test20241102

* Delete hardware/test20241102

* Create H4 schematic files

H4 schematic files

* Delete hardware/portapack_h4/a

* Create 20241101

20241101

* Delete hardware/portapack_h4 directory

* Create 20241101

* Schematic Files for the H4M

The schematic files for the portapack H4M.

* Rename 20241101 to readme_h4m

* Update readme_h4m

---------

Co-authored-by: OpenSourceSDRLab <opensourcesdr@outlook.com>
2024-11-02 22:30:10 +13:00
Totoo c9863187d6 battery display imp (#2327) 2024-10-30 12:19:17 +01:00
sommermorgentraum 13e4f225ea bump hackrf fw bin (#2321) 2024-10-28 07:02:41 +13:00
Benjamin Møller 0df2c085a1 Fix output overflow at converting to hpp. Function is untouched. (#2320) 2024-10-24 17:43:18 +02:00
Benjamin Møller a4c2e155e5 Add generator and parser for bitmap.hpp (#2313)
* Combined the converter from <ico>.png to bitmap.hpp and reverse in one script: pp_png2hpp.py

* Minor change ficed variables from testing.

* Cleanup output for parser. Add description to readme.md

* Update pp_png2hpp.py

Added the suggested and much cleaner argparse code from zxkmm.
Added a icon-name handling, to convert one or a comma seperated subset of icons by name.

* Update pp_bitmap_parser.py

Updated the handler with dynamic in/outputs, in parallel to the pp_png2hpp.py script ... But I think I'll delete this one, after I decide how to handle the alpha (transparent) code.
2024-10-20 20:19:33 +08:00
Totoo c90f0944b1 I2cDev_PPmod periodic sensor query (#2315)
* Add more data tx from esp

* command enum rework. +1 for JT

* filter 0 query interval

* i2c timeouts and sanity check on ppmod
2024-10-20 00:03:47 +02:00
sommermorgentraum 7a38b04192 fix read data of display (#2312) 2024-10-19 15:31:49 +02:00
sommermorgentraum 9f84ccbe1f add color support for err message when compiling with ninja (#2311) 2024-10-19 15:30:43 +02:00
Totoo cb3774ad81 Increase sensitivity (#2309)
Increase sensitivity of Weather and SubghzD apps.
2024-10-17 10:22:01 +02:00
87 changed files with 47801 additions and 490 deletions
+4
View File
@@ -23,6 +23,10 @@ cmake_policy(SET CMP0005 NEW)
set(CMAKE_TOOLCHAIN_FILE ${CMAKE_CURRENT_LIST_DIR}/firmware/toolchain-arm-cortex-m.cmake)
set(CMAKE_COLOR_MAKEFILE ON)
add_compile_options(-fdiagnostics-color=always)
option(USE_CCACHE "Enable ccache, please keep an eye on this because sometimes it's not quite stable and generated unusable binary" OFF)
project(portapack-h1)
-1
View File
@@ -291,7 +291,6 @@ set(CPPSRC
apps/ui_fileman.cpp
apps/ui_flash_utility.cpp
apps/ui_freqman.cpp
apps/ui_fsk_rx.cpp
apps/ui_iq_trim.cpp
apps/ui_level.cpp
apps/ui_looking_glass_app.cpp
+26 -6
View File
@@ -94,21 +94,39 @@ APRSRxView::APRSRxView(NavigationView& nav, Rect parent_rect)
record_view.set_sampling_rate(24000);
options_region.on_change = [this](size_t, int32_t i) {
if (i == 0) {
field_frequency.on_change = [this](rf::Frequency f) { (void)f; };
if (i == 0) { // MAN Manual setting
field_frequency.set_value(aprs_rx_freq);
} else if (i == 1) { // NA - North America - is also the default
field_frequency.set_value(144390000);
} else if (i == 1) {
} else if (i == 2) { // EUR
field_frequency.set_value(144800000);
} else if (i == 2) {
} else if (i == 3) { // AUS
field_frequency.set_value(145175000);
} else if (i == 3) {
} else if (i == 4) { // NZ
field_frequency.set_value(144575000);
} else if (i == 4) {
} else if (i == 5) { // ISS
field_frequency.set_value(145825000);
}
options_region_id = i;
receiver_model.set_target_frequency(field_frequency.value()); // Retune
field_frequency.on_change = [this](rf::Frequency f) {
aprs_rx_freq = f;
options_region.set_selected_index(0, true);
};
};
field_frequency.set_step(100);
options_region.set_selected_index(0, true);
field_frequency.on_edit = [this]() {
auto freq_view = nav_.push<FrequencyKeypadView>(field_frequency.value());
freq_view->on_changed = [this](rf::Frequency f) {
aprs_rx_freq = f;
field_frequency.set_value(f);
};
};
// Note: setting the region is also going to sef field_frequency.on_change
options_region.set_selected_index(options_region_id, true);
logger = std::make_unique<APRSLogger>();
if (logger)
@@ -124,6 +142,8 @@ APRSRxView::APRSRxView(NavigationView& nav, Rect parent_rect)
void APRSRxView::on_freqchg(int64_t freq) {
field_frequency.set_value(freq);
aprs_rx_freq = freq;
options_region.set_selected_index(0, true);
}
void APRSRxView::on_packet(const APRSPacketMessage* message) {
+14 -9
View File
@@ -190,6 +190,8 @@ class APRSRxView : public View {
private:
void on_data(uint32_t value, bool is_data);
bool reset_console = false;
uint8_t options_region_id = 1; // default to North America
rf::Frequency aprs_rx_freq{144390000}; // default to North America frequency
NavigationView& nav_;
RxRadioState radio_state_{
@@ -198,7 +200,10 @@ class APRSRxView : public View {
3072000 /* sampling rate */
};
app_settings::SettingsManager settings_{
"rx_aprs", app_settings::Mode::RX};
"rx_aprs",
app_settings::Mode::RX,
{{"options_region_id"sv, &options_region_id},
{"aprs_rx_freq"sv, &aprs_rx_freq}}};
uint8_t console_color{0};
std::string str_log{""};
@@ -220,15 +225,15 @@ class APRSRxView : public View {
OptionsField options_region{
{0 * 8, 0 * 8},
3,
{{"NA ", 0},
{"EUR", 1},
{"AUS", 2},
{"NZ ", 3},
{"ISS", 4}}};
{{"MAN", 0},
{"NA ", 1},
{"EUR", 2},
{"AUS", 3},
{"NZ ", 4},
{"ISS", 5}}};
RxFrequencyField field_frequency{
{3 * 8, 0 * 16},
nav_};
FrequencyField field_frequency{
{3 * 8, 0 * 16}};
// DEBUG
RecordView record_view{
+15 -3
View File
@@ -75,7 +75,19 @@ void BattinfoView::update_result() {
text_current.hidden(false);
text_charge.hidden(false);
text_current.set(to_string_dec_int(current) + " mA");
text_charge.set(current >= 0 ? "Charging" : "Discharging");
if (current >= 25) // when >25mA it is charging in any scenario
text_charge.set("Charging");
else {
if (current > -25) { // between -25 and 25
if (voltage > 4060 || percent == 100) { // the voltage is high enough, so it is full, that's why no mA
text_charge.set("Full");
} else {
text_charge.set("Holding"); // not enough voltage, so should charge. maybe the batttery is off, or USB power is not enough
}
} else {
text_charge.set("Discharging"); // less then -25mA, so it is discharging
}
}
labels_opt.hidden(false);
text_ttef.hidden(false);
@@ -103,7 +115,7 @@ void BattinfoView::update_result() {
if ((valid_mask & battery::BatteryManagement::BATT_VALID_TTEF) == battery::BatteryManagement::BATT_VALID_TTEF) {
text_ttef.hidden(false);
float ttef = 0;
if (current <= 0) {
if (current <= 0) { // we keep this yet
ttef = battery::BatteryManagement::get_tte();
} else {
ttef = battery::BatteryManagement::get_ttf();
@@ -133,7 +145,7 @@ void BattinfoView::update_result() {
}
if (uichg) set_dirty();
// to update status bar too, send message in behalf of batt manager
BatteryStateMessage msg{valid_mask, percent, current >= 0, voltage};
BatteryStateMessage msg{valid_mask, percent, current >= 25, voltage};
EventDispatcher::send_message(msg);
}
+28 -3
View File
@@ -25,6 +25,9 @@
#include "baseband_api.hpp"
#include "string_format.hpp"
#define PADDING_LEFT 1
#define PADDING_RIGHT 1
using namespace portapack;
namespace ui {
@@ -154,12 +157,34 @@ void EncodersConfigView::on_show() {
}
void EncodersConfigView::draw_waveform() {
// padding reason:
// in real world the signal would always start with low level and became low level again after yout turn off the radio;
// the waveform_buffer only controls drawing, the real send logic that been sent is controlled by frame_fragments
// so just for out of looking things
size_t length = frame_fragments.length();
for (size_t n = 0; n < length; n++)
waveform_buffer[n] = (frame_fragments[n] == '0') ? 0 : 1;
// currently not needed since all the supported OOK protocol wont exceed 550 yet
if (length + (PADDING_LEFT + PADDING_RIGHT) >= WAVEFORM_BUFFER_SIZE) {
length = WAVEFORM_BUFFER_SIZE - (PADDING_LEFT + PADDING_RIGHT);
}
waveform.set_length(length);
// padding l
for (size_t i = 0; i < PADDING_LEFT; i++) {
waveform_buffer[i] = 0;
}
// real wf
for (size_t n = 0; n < length; n++) {
waveform_buffer[n + PADDING_LEFT] = (frame_fragments[n] == '0') ? 0 : 1;
}
// padding r
for (size_t i = length + PADDING_LEFT; i < WAVEFORM_BUFFER_SIZE; i++) {
waveform_buffer[i] = 0;
}
waveform.set_length(length + PADDING_LEFT + PADDING_RIGHT);
waveform.set_dirty();
}
+3 -1
View File
@@ -32,6 +32,8 @@
#include <memory>
#include <vector>
#define WAVEFORM_BUFFER_SIZE 550
using namespace encoders;
namespace ui {
@@ -56,7 +58,7 @@ class EncodersConfigView : public View {
std::string frame_fragments = "0";
private:
int16_t waveform_buffer[550];
int16_t waveform_buffer[WAVEFORM_BUFFER_SIZE];
const encoder_def_t* encoder_def{};
void draw_waveform();
-198
View File
@@ -1,198 +0,0 @@
/*
* Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc.
* Copyright (C) 2016 Furrtek
*
* This file is part of PortaPack.
*
* 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, 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; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#include "ui_fsk_rx.hpp"
#include "audio.hpp"
#include "baseband_api.hpp"
#include "portapack_persistent_memory.hpp"
#include "string_format.hpp"
#include "utility.hpp"
#include "file_path.hpp"
#include "ui_freqman.hpp"
using namespace portapack;
namespace pmem = portapack::persistent_memory;
void FskRxLogger::log_raw_data(const std::string& data, const uint32_t frequency) {
std::string entry = "Raw: F:" + to_string_dec_uint(frequency) + "Hz";
// // Raw hex dump of all the codewords
// for (size_t c = 0; c < 16; c++)
// entry += to_string_hex(packet[c], 8) + " ";
log_file.write_entry(data + entry);
}
void FskRxLogger::log_decoded(Timestamp timestamp, const std::string& text) {
log_file.write_entry(timestamp, text);
}
namespace ui {
//---------------------------------------------------------------------------------------------------------------
// Console View
//---------------------------------------------------------------------------------------------------------------
FskRxAppConsoleView::FskRxAppConsoleView(NavigationView& nav, Rect parent_rect)
: View(parent_rect), nav_{nav} {
add_child(&console);
};
void FskRxAppConsoleView::on_packet(uint32_t value, bool is_data) {
if (is_data) {
console.write(to_string_dec_uint(value) + " ");
}
}
void FskRxAppConsoleView::on_show() {
hidden(false);
}
void FskRxAppConsoleView::on_hide() {
hidden(true);
}
FskRxAppConsoleView::~FskRxAppConsoleView() {
}
//---------------------------------------------------------------------------------------------------------------
// Spectrum View
//---------------------------------------------------------------------------------------------------------------
FskRxAppView::FskRxAppView(NavigationView& nav, Rect parent_rect)
: View(parent_rect), nav_{nav} {
add_child(&waterfall);
hidden(true);
}
FskRxAppView::~FskRxAppView() {
}
void FskRxAppView::focus() {
}
void FskRxAppView::on_show() {
hidden(false);
waterfall.start();
}
void FskRxAppView::on_hide() {
hidden(true);
waterfall.stop();
}
//---------------------------------------------------------------------------------------------------------------
// Base View
//---------------------------------------------------------------------------------------------------------------
FskxRxMainView::FskxRxMainView(NavigationView& nav)
: nav_{nav} {
add_children({&tab_view,
&view_data,
&view_stream,
&labels,
&rssi,
&channel,
&field_rf_amp,
&field_lna,
&field_vga,
&field_frequency,
&deviation_frequency,
&record_view});
baseband::run_image(portapack::spi_flash::image_tag_fskrx);
// DEBUG
record_view.on_error = [&nav](std::string message) {
nav.display_modal("Error", message);
};
deviation_frequency.on_change = [this](rf::Frequency f) {
refresh_ui(f);
};
// Set initial sampling rate
/* Bandwidth of 2FSK is 2 * Deviation */
record_view.set_sampling_rate(initial_deviation * 2);
field_frequency.set_value(initial_target_frequency);
deviation_frequency.set_value(initial_deviation);
logger.append(logs_dir / u"FSKRX.TXT");
baseband::set_fsk(initial_deviation);
audio::output::start();
receiver_model.enable();
}
void FskxRxMainView::handle_decoded(Timestamp timestamp, const std::string& prefix) {
if (logging()) {
logger.log_decoded(timestamp, prefix);
}
}
void FskxRxMainView::refresh_ui(rf::Frequency deviationHz) {
/* Nyquist would imply a sample rate of 2x bandwidth, but because the ADC
* provides 2 values (I,Q), the sample_rate is equal to bandwidth here. */
/* Bandwidth of 2FSK is 2 * Deviation */
auto sample_rate = deviationHz * 2;
/* base_rate (bandwidth) is used for FFT calculation and display LCD, and also in recording writing SD Card rate. */
/* ex. sampling_rate values, 4Mhz, when recording 500 kHz (BW) and fs 8 Mhz, when selected 1 Mhz BW ... */
/* ex. recording 500kHz BW to .C16 file, base_rate clock 500kHz x2(I,Q) x 2 bytes (int signed) =2MB/sec rate SD Card. */
if (!view_stream.hidden()) {
view_stream.waterfall.stop();
}
// record_view determines the correct oversampling to apply and returns the actual sample rate.
// NB: record_view is what actually updates proc_capture baseband settings.
auto actual_sample_rate = record_view.set_sampling_rate(sample_rate);
// Update the radio model with the actual sampling rate.
receiver_model.set_sampling_rate(actual_sample_rate);
// Get suitable anti-aliasing BPF bandwidth for MAX2837 given the actual sample rate.
auto anti_alias_filter_bandwidth = filter_bandwidth_for_sampling_rate(actual_sample_rate);
receiver_model.set_baseband_bandwidth(anti_alias_filter_bandwidth);
if (!view_stream.hidden()) {
view_stream.waterfall.start();
}
}
void FskxRxMainView::focus() {
field_frequency.focus();
}
void FskxRxMainView::set_parent_rect(const Rect new_parent_rect) {
View::set_parent_rect(new_parent_rect);
ui::Rect waterfall_rect{0, 0, new_parent_rect.width(), new_parent_rect.height() - header_height};
view_stream.waterfall.set_parent_rect(waterfall_rect);
}
FskxRxMainView::~FskxRxMainView() {
audio::output::stop();
receiver_model.disable();
baseband::shutdown();
}
} /* namespace ui */
-177
View File
@@ -1,177 +0,0 @@
/*
* Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc.
* Copyright (C) 2018 Furrtek
* Copyright (C) 2023 gullradriel, Nilorea Studio Inc.
*
* This file is part of PortaPack.
*
* 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, 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; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
#ifndef __UI_FSK_RX_H__
#define __UI_FSK_RX_H__
#include "ui_widget.hpp"
#include "ui_freq_field.hpp"
#include "ui_receiver.hpp"
#include "ui_record_view.hpp"
#include "ui_rssi.hpp"
#include "ui_spectrum.hpp"
#include "ui_tabview.hpp"
#include "app_settings.hpp"
#include "log_file.hpp"
#include "radio_state.hpp"
#include "pocsag_app.hpp"
#include <functional>
class FskRxLogger {
public:
Optional<File::Error> append(const std::filesystem::path& filename) {
return log_file.append(filename);
}
void log_raw_data(const std::string& data, const uint32_t frequency);
void log_decoded(Timestamp timestamp, const std::string& text);
private:
LogFile log_file{};
};
namespace ui {
class FskRxAppConsoleView : public View {
public:
FskRxAppConsoleView(NavigationView& nav, Rect parent_rec);
~FskRxAppConsoleView();
std::string title() const override { return "FSK RX Data"; };
void on_packet(uint32_t value, bool is_data);
void on_show() override;
void on_hide() override;
private:
NavigationView& nav_;
Console console{
{0, 0, 240, 224}};
};
class FskRxAppView : public View {
public:
FskRxAppView(NavigationView& nav, Rect parent_rect);
~FskRxAppView();
void focus() override;
void on_show() override;
void on_hide() override;
spectrum::WaterfallView waterfall{};
std::string title() const override { return "FSK RX Stream"; };
private:
NavigationView& nav_;
RxRadioState radio_state_{};
};
class FskxRxMainView : public View {
public:
FskxRxMainView(NavigationView& nav);
~FskxRxMainView();
void focus() override;
void set_parent_rect(const Rect new_parent_rect) override;
std::string title() const override { return "FSK RX"; };
private:
static constexpr uint32_t initial_target_frequency = 902'075'000;
static constexpr ui::Dim header_height = (5 * 16);
uint32_t initial_deviation{3750};
bool logging() const { return false; };
bool logging_raw() const { return false; };
NavigationView& nav_;
Rect view_rect = {0, header_height, 240, 224};
FskRxAppView view_stream{nav_, view_rect};
FskRxAppConsoleView view_data{nav_, view_rect};
TabView tab_view{
{"Data", Theme::getInstance()->fg_yellow->foreground, &view_data},
{"Stream", Theme::getInstance()->fg_cyan->foreground, &view_stream}};
void refresh_ui(rf::Frequency f);
void on_packet(uint32_t value, bool is_data);
void handle_decoded(Timestamp timestamp, const std::string& prefix);
uint32_t last_address = 0;
FskRxLogger logger{};
uint16_t packet_count = 0;
RxFrequencyField field_frequency{
{0 * 8, 4 * 8},
nav_};
RFAmpField field_rf_amp{
{11 * 8, 2 * 16}};
LNAGainField field_lna{
{13 * 8, 2 * 16}};
VGAGainField field_vga{
{16 * 8, 2 * 16}};
RSSI rssi{
{19 * 8 - 4, 35, 6 * 8, 4}};
Channel channel{
{19 * 8 - 4, 40, 6 * 8, 4}};
Labels labels{
{{0 * 8, 3 * 16}, "Deviation:", Theme::getInstance()->fg_light->foreground},
};
FrequencyField deviation_frequency{
{10 * 8, 3 * 16},
{3750, 500000},
};
// DEBUG
RecordView record_view{
{0 * 8, 4 * 16, 30 * 8, 1 * 16},
u"FSKRX_????.C16",
u"FSKRX",
RecordView::FileType::RawS16,
16384,
3};
MessageHandlerRegistration message_handler_packet{
Message::ID::AFSKData,
[this](Message* const p) {
const auto message = static_cast<const AFSKDataMessage*>(p);
this->view_data.on_packet(message->value, message->is_data);
}};
};
} /* namespace ui */
#endif /*__POCSAG_APP_H__*/
+1 -1
View File
@@ -795,7 +795,7 @@ class SetTouchscreenThresholdView : public View {
* threshold range: 1023/1 to 1023/128 = 1023 to 8
*/
NumberField field_threshold{
{1 * 8 + sizeof("Threshold:") * 8 + 8, 11 * 16},
{1 * 8 + 11 * 8 + 8, 11 * 16},
4,
{1, 1023},
1,
@@ -213,6 +213,11 @@ const char* WeatherView::getWeatherSensorTypeName(FPROTO_WEATHER_SENSOR type) {
return "EmosE601x";
case FPW_SolightTE44:
return "SolightTE44";
case FPW_Bresser3CH:
case FPW_Bresser3CH_V1:
return "Bresser3CH";
case FPW_Vauno_EN8822:
return "Vauno EN8822";
case FPW_Invalid:
default:
return "Unknown";
@@ -532,6 +537,42 @@ WeatherRecentEntry WeatherView::process_data(const WeatherDataMessage* data) {
i16 |= 0xf000;
}
ret.temp = (float)i16 / 10.0;
break;
case FPW_Bresser3CH:
ret.id = (data->decode_data >> 28) & 0xff;
ret.channel = ((data->decode_data >> 27) & 0x01) | (((data->decode_data >> 26) & 0x01) << 1);
// ret.btn = ((data->decode_data >> 25) & 0x1);
ret.battery_low = ((data->decode_data >> 24) & 0x1);
i16 = (data->decode_data >> 12) & 0x0fff;
/* Handle signed data */
if (i16 & 0x0800) {
i16 |= 0xf000;
}
ret.temp = (float)i16 / 10.0;
ret.humidity = data->decode_data & 0xff;
break;
case FPW_Bresser3CH_V1:
ret.id = (data->decode_data >> 32) & 0xff;
ret.battery_low = ((data->decode_data >> 31) & 0x1);
// ret.btn = (data->decode_data >> 30) & 0x1;
ret.channel = (data->decode_data >> 28) & 0x3;
ret.temp = (data->decode_data >> 16) & 0xfff;
ret.temp = FProtoGeneral::locale_fahrenheit_to_celsius((float)(ret.temp - 900) / 10.0);
ret.humidity = (data->decode_data >> 8) & 0xff;
break;
case FPW_Vauno_EN8822:
ret.id = (data->decode_data >> 34) & 0xff;
ret.battery_low = (data->decode_data >> 33) & 0x01;
ret.channel = ((data->decode_data >> 30) & 0x03);
i16 = (data->decode_data >> 18) & 0x0fff;
/* Handle signed data */
if (i16 & 0x0800) {
i16 |= 0xf000;
}
ret.temp = (float)i16 / 10.0;
ret.humidity = (data->decode_data >> 11) & 0x7f;
break;
case FPW_Invalid:
default:
@@ -11,10 +11,32 @@ namespace ui {
/* static */ std::vector<DynamicBitmap<16, 16>> ExternalItemsMenuLoader::bitmaps;
// iterates over all ppma-s, and if it is runnable on the current system, it'll call the callback, and pass info.
/* static */ void ExternalItemsMenuLoader::load_all_external_items_callback(std::function<void(AppInfoConsole&)> callback) {
// iterates over all possible ext apps-s, and if it is runnable on the current system, it'll call the callback, and pass minimal info. used to print to console, and for autostart setting's app list. where the minimal info is enough
// please keep in sync with load_external_items
/* static */ void ExternalItemsMenuLoader::load_all_external_items_callback(std::function<void(AppInfoConsole&)> callback, bool module_included) {
if (!callback) return;
auto dev = (i2cdev::I2cDev_PPmod*)i2cdev::I2CDevManager::get_dev_by_model(I2C_DEVMDL::I2CDECMDL_PPMOD);
if (dev && module_included) {
auto device_info = dev->readDeviceInfo();
if (device_info.has_value()) {
for (uint32_t i = 0; i < device_info->application_count; i++) {
auto appInfo = dev->getStandaloneAppInfo(i);
if (appInfo.has_value() == false) {
continue;
}
if (appInfo->header_version > CURRENT_STANDALONE_APPLICATION_API_VERSION)
continue;
AppInfoConsole appInfoConsole = {reinterpret_cast<char*>(&appInfo->app_name[0]), reinterpret_cast<char*>(&appInfo->app_name[0]), appInfo->menu_location};
callback(appInfoConsole);
}
}
}
if (sd_card::status() != sd_card::Status::Mounted)
return;
@@ -36,18 +58,16 @@ namespace ui {
continue;
bool versionMatches = VERSION_MD5 == application_information.app_version;
if (!versionMatches) continue;
// here the app is startable and good.
std::string appshortname = filePath.filename().string();
if (appshortname.size() >= 5 && appshortname.substr(appshortname.size() - 5) == ".ppma") {
// Remove the ".ppma" suffix
appshortname = appshortname.substr(0, appshortname.size() - 5);
if (versionMatches) {
std::string appshortname = filePath.filename().string();
if (appshortname.size() >= 5 && appshortname.substr(appshortname.size() - 5) == ".ppma") {
// Remove the ".ppma" suffix
appshortname = appshortname.substr(0, appshortname.size() - 5);
}
AppInfoConsole appInfoConsole = {appshortname.c_str(), reinterpret_cast<char*>(&application_information.app_name[0]), application_information.menu_location};
callback(appInfoConsole);
}
AppInfoConsole info{
.appCallName = appshortname.c_str(),
.appFriendlyName = reinterpret_cast<char*>(&application_information.app_name[0]),
.appLocation = application_information.menu_location};
callback(info);
}
for (const auto& entry : std::filesystem::directory_iterator(apps_dir, u"*.ppmp")) {
@@ -64,21 +84,16 @@ namespace ui {
if (!readResult)
continue;
if (application_information.header_version < CURRENT_STANDALONE_APPLICATION_API_VERSION)
if (application_information.header_version > CURRENT_STANDALONE_APPLICATION_API_VERSION)
continue;
// here the app is startable and good.
std::string appshortname = filePath.filename().string();
if (appshortname.size() >= 5 && appshortname.substr(appshortname.size() - 5) == ".ppmp") {
// Remove the ".ppmp" suffix
appshortname = appshortname.substr(0, appshortname.size() - 5);
}
AppInfoConsole info{
.appCallName = appshortname.c_str(),
.appFriendlyName = reinterpret_cast<char*>(&application_information.app_name[0]),
.appLocation = application_information.menu_location};
callback(info);
AppInfoConsole appInfoConsole = {appshortname.c_str(), reinterpret_cast<char*>(&application_information.app_name[0]), application_information.menu_location};
callback(appInfoConsole);
}
}
@@ -60,7 +60,7 @@ class ExternalItemsMenuLoader {
static bool run_external_app(ui::NavigationView&, std::filesystem::path);
static bool run_standalone_app(ui::NavigationView&, std::filesystem::path);
static bool run_module_app(ui::NavigationView&, uint8_t*, size_t);
static void load_all_external_items_callback(std::function<void(AppInfoConsole&)> callback);
static void load_all_external_items_callback(std::function<void(AppInfoConsole&)> callback, bool module_included = false);
private:
static std::vector<DynamicBitmap<16, 16>> bitmaps;
+25 -16
View File
@@ -43,7 +43,6 @@
#include "ui_flash_utility.hpp"
#include "ui_font_fixed_8x16.hpp"
#include "ui_freqman.hpp"
#include "ui_fsk_rx.hpp"
#include "ui_iq_trim.hpp"
#include "ui_level.hpp"
#include "ui_looking_glass_app.hpp"
@@ -149,6 +148,7 @@ const NavigationView::AppList NavigationView::appList = {
{"search", "Search", RX, Color::yellow(), &bitmap_icon_search, new ViewFactory<SearchView>()},
{"subghzd", "SubGhzD", RX, Color::yellow(), &bitmap_icon_remote, new ViewFactory<SubGhzDView>()},
{"weather", "Weather", RX, Color::green(), &bitmap_icon_thermometer, new ViewFactory<WeatherView>()},
//{"fskrx", "FSK RX", RX, Color::yellow(), &bitmap_icon_remote, new ViewFactory<FskxRxMainView>()}, //for JT
//{"dmr", "DMR", RX, Color::dark_grey(), &bitmap_icon_dmr, new ViewFactory<NotImplementedView>()},
//{"sigfox", "SIGFOX", RX, Color::dark_grey(), &bitmap_icon_fox, new ViewFactory<NotImplementedView>()},
//{"lora", "LoRa", RX, Color::dark_grey(), &bitmap_icon_lora, new ViewFactory<NotImplementedView>()},
@@ -723,31 +723,40 @@ void NavigationView::handle_autostart() {
"nav"sv,
{{"autostart_app"sv, &autostart_app}}};
if (!autostart_app.empty()) {
bool app_started = false;
// try innerapp
bool started = false;
// inner app
if (StartAppByName(autostart_app.c_str())) {
app_started = true;
} else {
// try outside app
auto external_items = ExternalItemsMenuLoader::load_external_items(app_location_t::HOME, *this);
for (const auto& item : external_items) {
if (item.text == autostart_app) {
item.on_select();
app_started = true;
break;
started = true;
}
if (!started) {
// ppma
std::string appwithpath = "/" + apps_dir.string() + "/" + autostart_app + ".ppma";
std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> conv;
std::filesystem::path pth = conv.from_bytes(appwithpath.c_str());
if (ui::ExternalItemsMenuLoader::run_external_app(*this, pth)) {
started = true;
}
if (!started) {
// ppmp / standalone
appwithpath = "/" + apps_dir.string() + "/" + autostart_app + ".ppmp";
pth = conv.from_bytes(appwithpath.c_str());
if (ui::ExternalItemsMenuLoader::run_standalone_app(*this, pth)) {
started = true;
}
}
}
if (!app_started) {
if (!started) {
display_modal(
"Notice", "Autostart failed:\n" +
autostart_app +
"\nupdate sdcard content\n" +
"and check if .ppma exists");
}
}
} // autostart end
return;
}
/* Helpers **************************************************************/
+197
View File
@@ -0,0 +1,197 @@
#ifndef __FPROTO_Bresser3ch_H__
#define __FPROTO_Bresser3ch_H__
#include "weatherbase.hpp"
#define BRESSER_V0_DATA 36
#define BRESSER_V0_DATA_AND_TAIL 52
#define BRESSER_V1_DATA 40
typedef enum {
Bresser3chDecoderStepReset = 0,
Bresser3chDecoderStepV0SaveDuration,
Bresser3chDecoderStepV0CheckDuration,
Bresser3chDecoderStepV0TailCheckDuration,
Bresser3chDecoderStepV1PreambleDn,
Bresser3chDecoderStepV1PreambleUp,
Bresser3chDecoderStepV1SaveDuration,
Bresser3chDecoderStepV1CheckDuration,
} Bresser3chDecoderStepV1;
class FProtoWeatheBresser3CH : public FProtoWeatherBase {
public:
FProtoWeatheBresser3CH() {
sensorType = FPW_Bresser3CH;
}
void feed(bool level, uint32_t duration) {
switch (parser_step) {
case Bresser3chDecoderStepReset:
if (level && DURATION_DIFF(duration, te_short * 3) < te_delta) {
te_last = duration;
parser_step = Bresser3chDecoderStepV1PreambleDn;
decode_data = 0;
decode_count_bit = 0;
} else if ((!level) && duration >= te_long) {
parser_step = Bresser3chDecoderStepV0SaveDuration;
decode_data = 0;
decode_count_bit = 0;
}
break;
case Bresser3chDecoderStepV0SaveDuration:
if (level) {
te_last = duration;
if (decode_count_bit < BRESSER_V0_DATA) {
parser_step = Bresser3chDecoderStepV0CheckDuration;
} else {
parser_step = Bresser3chDecoderStepV0TailCheckDuration;
}
} else {
parser_step = Bresser3chDecoderStepReset;
}
break;
case Bresser3chDecoderStepV0CheckDuration:
if (!level) {
if (DURATION_DIFF(te_last, te_short) < te_delta) {
if (DURATION_DIFF(duration, te_short * 2) < te_delta) {
subghz_protocol_blocks_add_bit(0);
parser_step = Bresser3chDecoderStepV0SaveDuration;
} else if (
DURATION_DIFF(duration, te_short * 4) < te_delta) {
subghz_protocol_blocks_add_bit(1);
parser_step = Bresser3chDecoderStepV0SaveDuration;
} else
parser_step = Bresser3chDecoderStepReset;
} else
parser_step = Bresser3chDecoderStepReset;
} else
parser_step = Bresser3chDecoderStepReset;
break;
case Bresser3chDecoderStepV0TailCheckDuration:
if (!level) {
if (duration >= te_long) {
if (decode_count_bit == BRESSER_V0_DATA_AND_TAIL &&
ws_protocol_bresser_3ch_check_v0()) {
decode_count_bit = BRESSER_V0_DATA;
sensorType = FPW_Bresser3CH;
// ws_protocol_bresser_3ch_extract_data_v0();
if (callback) {
callback(this);
}
}
decode_data = 0;
decode_count_bit = 0;
parser_step = Bresser3chDecoderStepReset;
} else if (
decode_count_bit < BRESSER_V0_DATA_AND_TAIL &&
DURATION_DIFF(te_last, te_short) < te_delta &&
DURATION_DIFF(duration, te_short * 2) < te_delta) {
decode_count_bit++;
parser_step = Bresser3chDecoderStepV0SaveDuration;
} else
parser_step = Bresser3chDecoderStepReset;
} else
parser_step = Bresser3chDecoderStepReset;
break;
case Bresser3chDecoderStepV1PreambleDn:
if ((!level) && DURATION_DIFF(duration, te_short_v1 * 3) < te_delta) {
if (DURATION_DIFF(te_last, te_short_v1 * 12) < te_delta * 2) {
// End of sync after 4*750 (12*250) high values, start reading the message
parser_step = Bresser3chDecoderStepV1SaveDuration;
} else {
parser_step = Bresser3chDecoderStepV1PreambleUp;
}
} else {
parser_step = Bresser3chDecoderStepReset;
}
break;
case Bresser3chDecoderStepV1PreambleUp:
if (level && DURATION_DIFF(duration, te_short_v1 * 3) < te_delta) {
te_last = te_last + duration;
parser_step = Bresser3chDecoderStepV1PreambleDn;
} else {
parser_step = Bresser3chDecoderStepReset;
}
break;
case Bresser3chDecoderStepV1SaveDuration:
if (decode_count_bit == BRESSER_V1_DATA) {
if (ws_protocol_bresser_3ch_check_v1()) {
// ws_protocol_bresser_3ch_extract_data_v1(&instance->generic);
sensorType = FPW_Bresser3CH_V1;
if (callback) {
callback(this);
}
}
decode_data = 0;
decode_count_bit = 0;
parser_step = Bresser3chDecoderStepReset;
} else if (level) {
te_last = duration;
parser_step = Bresser3chDecoderStepV1CheckDuration;
} else {
parser_step = Bresser3chDecoderStepReset;
}
break;
case Bresser3chDecoderStepV1CheckDuration:
if (!level) {
if (DURATION_DIFF(te_last, te_short_v1) < te_delta && DURATION_DIFF(duration, te_long_v1) < te_delta) {
subghz_protocol_blocks_add_bit(0);
parser_step = Bresser3chDecoderStepV1SaveDuration;
} else if (
DURATION_DIFF(te_last, te_long_v1) < te_delta && DURATION_DIFF(duration, te_short_v1) < te_delta) {
subghz_protocol_blocks_add_bit(1);
parser_step = Bresser3chDecoderStepV1SaveDuration;
} else
parser_step = Bresser3chDecoderStepReset;
} else
parser_step = Bresser3chDecoderStepReset;
break;
}
}
protected:
uint32_t te_short = 475;
uint32_t te_long = 3900;
uint32_t te_delta = 150;
uint32_t te_short_v1 = 250;
uint32_t te_long_v1 = 500;
bool ws_protocol_bresser_3ch_check_v0() {
if (!decode_data) return false;
// No CRC, so better sanity checks here
if (((decode_data >> 8) & 0x0f) != 0x0f) return false; // separator not 0xf
if (((decode_data >> 28) & 0xff) == 0xff) return false; // ID only ones?
if (((decode_data >> 28) & 0xff) == 0x00) return false; // ID only zeroes?
if (((decode_data >> 25) & 0x0f) == 0x0f) return false; // flags only ones?
if (((decode_data >> 25) & 0x0f) == 0x00) return false; // flags only zeroes?
if (((decode_data >> 12) & 0x0fff) == 0x0fff)
return false; // temperature maxed out?
if ((decode_data & 0xff) < 20)
return false; // humidity percentage less than 20?
if ((decode_data & 0xff) > 95)
return false; // humidity percentage more than 95?
return true;
}
bool ws_protocol_bresser_3ch_check_v1() {
if (!decode_data) return false;
uint8_t sum = (((decode_data >> 32) & 0xff) +
((decode_data >> 24) & 0xff) +
((decode_data >> 16) & 0xff) +
((decode_data >> 8) & 0xff)) &
0xff;
return (decode_data & 0xff) == sum;
}
};
#endif
@@ -0,0 +1,88 @@
#ifndef __FPROTO_VAUNO_EN8822_H__
#define __FPROTO_VAUNO_EN8822_H__
#include "weatherbase.hpp"
typedef enum {
VaunoEN8822CDecoderStepReset = 0,
VaunoEN8822CDecoderStepSaveDuration,
VaunoEN8822CDecoderStepCheckDuration,
} VaunoEN8822CDecoderStep;
class FProtoWeatherVaunoEN8822 : public FProtoWeatherBase {
public:
FProtoWeatherVaunoEN8822() {
sensorType = FPW_Vauno_EN8822;
}
void feed(bool level, uint32_t duration) override {
switch (parser_step) {
case VaunoEN8822CDecoderStepReset:
if ((!level) && DURATION_DIFF(duration, te_long * 4) < te_delta) {
parser_step = VaunoEN8822CDecoderStepSaveDuration;
decode_data = 0;
decode_count_bit = 0;
}
break;
case VaunoEN8822CDecoderStepSaveDuration:
if (level) {
te_last = duration;
parser_step = VaunoEN8822CDecoderStepCheckDuration;
} else {
parser_step = VaunoEN8822CDecoderStepReset;
}
break;
case VaunoEN8822CDecoderStepCheckDuration:
if (!level) {
if (DURATION_DIFF(te_last, te_short) < te_delta) {
if (DURATION_DIFF(duration, te_long * 2) < te_delta) {
subghz_protocol_blocks_add_bit(1);
parser_step = VaunoEN8822CDecoderStepSaveDuration;
} else if (DURATION_DIFF(duration, te_long) < te_delta) {
subghz_protocol_blocks_add_bit(0);
parser_step = VaunoEN8822CDecoderStepSaveDuration;
} else if (DURATION_DIFF(duration, te_long * 4) < te_delta) {
parser_step = VaunoEN8822CDecoderStepReset;
if (decode_count_bit == min_count_bit_for_found && ws_protocol_vauno_en8822c_check()) {
// ws_protocol_vauno_en8822c_extract_data(&instance->generic);
if (callback) {
callback(this);
}
} else if (decode_count_bit == 1) {
parser_step = VaunoEN8822CDecoderStepSaveDuration;
}
decode_data = 0;
decode_count_bit = 0;
} else
parser_step = VaunoEN8822CDecoderStepReset;
} else
parser_step = VaunoEN8822CDecoderStepReset;
} else
parser_step = VaunoEN8822CDecoderStepReset;
break;
}
}
protected:
// timing values
uint32_t te_short = 500;
uint32_t te_long = 1940;
uint32_t te_delta = 150;
uint32_t min_count_bit_for_found = 42;
bool ws_protocol_vauno_en8822c_check() {
if (!decode_data) return false;
// The sum of all nibbles should match the last 6 bits
uint8_t sum = 0;
for (uint8_t i = 6; i <= 38; i += 4) {
sum += ((decode_data >> i) & 0x0f);
}
return sum != 0 && (sum & 0x3f) == (decode_data & 0x3f);
}
};
#endif
+6 -1
View File
@@ -29,6 +29,8 @@ So include here the .hpp, and add a new element to the protos vector in the cons
#include "w-acurite5in1.hpp"
#include "w-emose601x.hpp"
#include "w-solight_te44.hpp"
#include "w-bresser_3ch.hpp"
#include "w-vauno_en8822.hpp"
#include <vector>
#include <memory>
@@ -66,10 +68,13 @@ class WeatherProtos : public FProtoListGeneral {
protos[FPW_Acurite5in1] = new FProtoWeatherAcurite5in1();
protos[FPW_EmosE601x] = new FProtoWeatherEmosE601x();
protos[FPW_SolightTE44] = new FProtoWeatherSolightTE44();
protos[FPW_Bresser3CH] = new FProtoWeatheBresser3CH();
protos[FPW_Bresser3CH_V1] = nullptr; // done by FProtoWeatheBresser3CH
protos[FPW_Vauno_EN8822] = new FProtoWeatherVaunoEN8822();
// set callback for them
for (uint8_t i = 0; i < FPW_COUNT; ++i) {
protos[i]->setCallback(callbackTarget);
if (protos[i] != NULL) protos[i]->setCallback(callbackTarget);
}
}
@@ -39,6 +39,9 @@ enum FPROTO_WEATHER_SENSOR {
FPW_Acurite5in1 = 21,
FPW_EmosE601x = 22,
FPW_SolightTE44 = 23,
FPW_Bresser3CH = 24,
FPW_Bresser3CH_V1 = 25,
FPW_Vauno_EN8822 = 26,
FPW_COUNT // this must be the last
};
+59 -14
View File
@@ -38,32 +38,79 @@ void SubGhzDProcessor::execute(const buffer_c8_t& buffer) {
feed_channel_stats(decim_1_out);
for (size_t i = 0; i < decim_1_out.count; i++) {
threshold = (low_estimate + high_estimate) / 2;
int32_t const hysteresis = threshold / 8; // +-12%
int16_t re = decim_1_out.p[i].real();
int16_t im = decim_1_out.p[i].imag();
uint32_t mag = ((uint32_t)re * (uint32_t)re) + ((uint32_t)im * (uint32_t)im);
mag = (mag >> 12); // Decim samples are calculated with saturated gain . (we could also reduce that sat. param at configure time)
mag = (mag >> 10);
int32_t const ook_low_delta = mag - low_estimate;
bool meashl = currentHiLow;
if (sig_state == STATE_IDLE) {
if (mag > (threshold + hysteresis)) { // just become high
meashl = true;
sig_state = STATE_PULSE;
numg = 0;
} else {
meashl = false; // still low
low_estimate += ook_low_delta / OOK_EST_LOW_RATIO;
low_estimate += ((ook_low_delta > 0) ? 1 : -1); // Hack to compensate for lack of fixed-point scaling
// Calculate default OOK high level estimate
high_estimate = 1.35 * low_estimate; // Default is a ratio of low level
high_estimate = std::max(high_estimate, min_high_level);
high_estimate = std::min(high_estimate, (uint32_t)OOK_MAX_HIGH_LEVEL);
}
} else if (sig_state == STATE_PULSE) {
++numg;
if (numg > 100) numg = 100;
if (mag < (threshold - hysteresis)) {
// check if really a bad value
if (numg < 3) {
// susp
sig_state = STATE_GAP;
} else {
numg = 0;
sig_state = STATE_GAP_START;
}
meashl = false; // low
} else {
high_estimate += mag / OOK_EST_HIGH_RATIO - high_estimate / OOK_EST_HIGH_RATIO;
high_estimate = std::max(high_estimate, min_high_level);
high_estimate = std::min(high_estimate, (uint32_t)OOK_MAX_HIGH_LEVEL);
meashl = true; // still high
}
} else if (sig_state == STATE_GAP_START) {
++numg;
if (mag > (threshold + hysteresis)) { // New pulse?
sig_state = STATE_PULSE;
meashl = true;
} else if (numg >= 3) {
sig_state = STATE_GAP;
meashl = false; // gap
}
} else if (sig_state == STATE_GAP) {
++numg;
if (mag > (threshold + hysteresis)) { // New pulse?
numg = 0;
sig_state = STATE_PULSE;
meashl = true;
} else {
meashl = false;
}
}
bool meashl = (mag > threshold);
tm += mag;
if (meashl == currentHiLow && currentDuration < 30'000'000) // allow pass 'end' signal
{
currentDuration += nsPerDecSamp;
} else { // called on change, so send the last duration and dir.
if (currentDuration >= 30'000'000) sig_state = STATE_IDLE;
if (protoList) protoList->feed(currentHiLow, currentDuration / 1000);
currentDuration = nsPerDecSamp;
currentHiLow = meashl;
}
}
cnt += decim_1_out.count; // TODO , check if it is necessary that xdecim factor.
if (cnt > 90'000) {
threshold = (tm / cnt) / 2;
cnt = 0;
tm = 0;
if (threshold < 50) threshold = 50;
if (threshold > 1700) threshold = 1700;
}
}
void SubGhzDProcessor::on_message(const Message* const message) {
@@ -75,8 +122,6 @@ void SubGhzDProcessor::configure(const SubGhzFPRxConfigureMessage& message) {
// constexpr size_t decim_0_output_fs = baseband_fs / decim_0.decimation_factor; //unused
// constexpr size_t decim_1_output_fs = decim_0_output_fs / decim_1.decimation_factor; //unused
modulation = message.modulation; // TODO: add support for FM (currently AM only)
baseband_fs = message.sampling_rate;
baseband_thread.set_sampling_rate(baseband_fs);
nsPerDecSamp = 1'000'000'000 / baseband_fs * 8; // Scaled it due to less array buffer sampes due to /8 decimation. 250 nseg (4Mhz) * 8
+18 -6
View File
@@ -32,7 +32,14 @@
#include "message.hpp"
#include "dsp_decimate.hpp"
#pragma GCC push_options
#pragma GCC optimize("Os")
#include "fprotos/subghzdprotos.hpp"
#pragma GCC pop_options
#define OOK_EST_HIGH_RATIO 3 // Constant for slowness of OOK high level estimator
#define OOK_EST_LOW_RATIO 5 // Constant for slowness of OOK low level (noise) estimator (very slow)
#define OOK_MAX_HIGH_LEVEL 450000
class SubGhzDProcessor : public BasebandProcessor {
public:
@@ -40,9 +47,18 @@ class SubGhzDProcessor : public BasebandProcessor {
void on_message(const Message* const message) override;
private:
enum {
STATE_IDLE = 0,
STATE_PULSE = 1,
STATE_GAP_START = 2,
STATE_GAP = 3,
} sig_state = STATE_IDLE;
uint32_t low_estimate = 100;
uint32_t high_estimate = 12000;
uint32_t min_high_level = 10;
uint8_t numg = 0; // count of matched signals to filter spikes
size_t baseband_fs = 0; // will be set later by configure message
uint32_t nsPerDecSamp = 0;
uint8_t modulation = 0;
/* Array Buffer aux. used in decim0 and decim1 IQ c16 signed data ; (decim0 defines the max length of the array) */
std::array<complex16_t, 512> dst{}; // decim0 /4 , 2048/4 = 512 complex I,Q
@@ -55,14 +71,10 @@ class SubGhzDProcessor : public BasebandProcessor {
dsp::decimate::FIRC16xR16x16Decim2 decim_1{};
uint32_t currentDuration = 0;
uint32_t threshold = 0x0630; // will overwrite after the first iteration
uint32_t threshold = 0x0630;
bool currentHiLow = false;
bool configured{false};
// for threshold
uint32_t cnt = 0;
uint32_t tm = 0;
FProtoListGeneral* protoList = new SubGhzDProtos(); // holds all the protocols we can parse
void configure(const SubGhzFPRxConfigureMessage& message);
+59 -12
View File
@@ -39,32 +39,79 @@ void WeatherProcessor::execute(const buffer_c8_t& buffer) {
feed_channel_stats(decim_1_out);
for (size_t i = 0; i < decim_1_out.count; i++) {
threshold = (low_estimate + high_estimate) / 2;
int32_t const hysteresis = threshold / 8; // +-12%
int16_t re = decim_1_out.p[i].real();
int16_t im = decim_1_out.p[i].imag();
uint32_t mag = ((uint32_t)re * (uint32_t)re) + ((uint32_t)im * (uint32_t)im);
mag = (mag >> 12); // Decim samples are calculated with saturated gain . (we could also reduce that sat. param at configure time)
mag = (mag >> 10);
int32_t const ook_low_delta = mag - low_estimate;
bool meashl = currentHiLow;
if (sig_state == STATE_IDLE) {
if (mag > (threshold + hysteresis)) { // just become high
meashl = true;
sig_state = STATE_PULSE;
numg = 0;
} else {
meashl = false; // still low
low_estimate += ook_low_delta / OOK_EST_LOW_RATIO;
low_estimate += ((ook_low_delta > 0) ? 1 : -1); // Hack to compensate for lack of fixed-point scaling
// Calculate default OOK high level estimate
high_estimate = 1.35 * low_estimate; // Default is a ratio of low level
high_estimate = std::max(high_estimate, min_high_level);
high_estimate = std::min(high_estimate, (uint32_t)OOK_MAX_HIGH_LEVEL);
}
} else if (sig_state == STATE_PULSE) {
++numg;
if (numg > 100) numg = 100;
if (mag < (threshold - hysteresis)) {
// check if really a bad value
if (numg < 3) {
// susp
sig_state = STATE_GAP;
} else {
numg = 0;
sig_state = STATE_GAP_START;
}
meashl = false; // low
} else {
high_estimate += mag / OOK_EST_HIGH_RATIO - high_estimate / OOK_EST_HIGH_RATIO;
high_estimate = std::max(high_estimate, min_high_level);
high_estimate = std::min(high_estimate, (uint32_t)OOK_MAX_HIGH_LEVEL);
meashl = true; // still high
}
} else if (sig_state == STATE_GAP_START) {
++numg;
if (mag > (threshold + hysteresis)) { // New pulse?
sig_state = STATE_PULSE;
meashl = true;
} else if (numg >= 3) {
sig_state = STATE_GAP;
meashl = false; // gap
}
} else if (sig_state == STATE_GAP) {
++numg;
if (mag > (threshold + hysteresis)) { // New pulse?
numg = 0;
sig_state = STATE_PULSE;
meashl = true;
} else {
meashl = false;
}
}
bool meashl = (mag > threshold);
tm += mag;
if (meashl == currentHiLow && currentDuration < 30'000'000) // allow pass 'end' signal
{
currentDuration += nsPerDecSamp;
} else { // called on change, so send the last duration and dir.
if (currentDuration >= 30'000'000) sig_state = STATE_IDLE;
if (protoList) protoList->feed(currentHiLow, currentDuration / 1000);
currentDuration = nsPerDecSamp;
currentHiLow = meashl;
}
}
cnt += decim_1_out.count; // TODO , check if it is necessary that xdecim factor.
if (cnt > 90'000) {
threshold = (tm / cnt) / 2;
cnt = 0;
tm = 0;
if (threshold < 50) threshold = 50;
if (threshold > 1700) threshold = 1700;
}
}
void WeatherProcessor::on_message(const Message* const message) {
+15 -5
View File
@@ -26,6 +26,7 @@
#ifndef __PROC_WEATHER_H__
#define __PROC_WEATHER_H__
#include <algorithm>
#include "baseband_processor.hpp"
#include "baseband_thread.hpp"
#include "rssi_thread.hpp"
@@ -34,15 +35,28 @@
#include "fprotos/weatherprotos.hpp"
#define OOK_EST_HIGH_RATIO 3 // Constant for slowness of OOK high level estimator
#define OOK_EST_LOW_RATIO 5 // Constant for slowness of OOK low level (noise) estimator (very slow)
#define OOK_MAX_HIGH_LEVEL 450000
class WeatherProcessor : public BasebandProcessor {
public:
void execute(const buffer_c8_t& buffer) override;
void on_message(const Message* const message) override;
private:
enum {
STATE_IDLE = 0,
STATE_PULSE = 1,
STATE_GAP_START = 2,
STATE_GAP = 3,
} sig_state = STATE_IDLE;
uint32_t low_estimate = 100;
uint32_t high_estimate = 12000;
uint32_t min_high_level = 10;
size_t baseband_fs = 0; // will be set later by configure message.
uint32_t nsPerDecSamp = 0;
uint8_t numg = 0; // count of matched signals to filter spikes
/* Array Buffer aux. used in decim0 and decim1 IQ c16 signed data ; (decim0 defines the max length of the array) */
std::array<complex16_t, 512> dst{}; // decim0 /4 , 2048/4 = 512 complex I,Q
const buffer_c16_t dst_buffer{
@@ -58,10 +72,6 @@ class WeatherProcessor : public BasebandProcessor {
bool currentHiLow = false;
bool configured{false};
// for threshold
uint32_t cnt = 0;
uint32_t tm = 0;
FProtoListGeneral* protoList = new WeatherProtos(); // holds all the protocols we can parse
void configure(const SubGhzFPRxConfigureMessage& message);
void on_beep_message(const AudioBeepMessage& message);
+1 -1
View File
@@ -192,7 +192,7 @@ void I2cDev_MAX17055::update() {
getBatteryInfo(validity, batteryPercentage, voltage, current);
// send local message
BatteryStateMessage msg{validity, batteryPercentage, current >= 0, voltage};
BatteryStateMessage msg{validity, batteryPercentage, current >= 25, voltage};
EventDispatcher::send_message(msg);
}
+92 -2
View File
@@ -21,7 +21,6 @@
#include "i2cdev_ppmod.hpp"
#include "portapack.hpp"
#include <optional>
namespace i2cdev {
@@ -30,11 +29,95 @@ bool I2cDev_PPmod::init(uint8_t addr_) {
if (addr_ != I2CDEV_PPMOD_ADDR_1) return false;
addr = addr_;
model = I2CDECMDL_PPMOD;
query_interval = 10;
return true;
}
void I2cDev_PPmod::update() {
auto mask = get_features_mask();
if (mask & (uint64_t)SupportedFeatures::FEAT_GPS) {
auto data = get_gps_data();
if (data.has_value()) {
GPSPosDataMessage msg{data.value().latitude, data.value().longitude, (int32_t)data.value().altitude, (int32_t)data.value().speed, data.value().sats_in_use};
EventDispatcher::send_message(msg);
}
}
if (mask & (uint64_t)SupportedFeatures::FEAT_ORIENTATION) {
auto data = get_orientation_data();
if (data.has_value()) {
OrientationDataMessage msg{(uint16_t)data.value().angle, (int16_t)data.value().tilt};
EventDispatcher::send_message(msg);
}
}
if (mask & (uint64_t)SupportedFeatures::FEAT_ENVIRONMENT) {
auto data = get_environment_data();
if (data.has_value()) {
EnvironmentDataMessage msg{data.value().temperature, data.value().humidity, data.value().pressure};
EventDispatcher::send_message(msg);
}
}
if (mask & (uint64_t)SupportedFeatures::FEAT_LIGHT) {
auto data = get_light_data();
if (data.has_value()) {
LightDataMessage msg{data.value()};
EventDispatcher::send_message(msg);
}
}
}
std::optional<orientation_t> I2cDev_PPmod::get_orientation_data() {
Command cmd = Command::COMMAND_GETFEAT_DATA_ORIENTATION;
orientation_t data;
bool success = i2c_read((uint8_t*)&cmd, 2, (uint8_t*)&data, sizeof(orientation_t));
if (success == false) {
return std::nullopt;
}
return data;
}
std::optional<gpssmall_t> I2cDev_PPmod::get_gps_data() {
Command cmd = Command::COMMAND_GETFEAT_DATA_GPS;
gpssmall_t data;
bool success = i2c_read((uint8_t*)&cmd, 2, (uint8_t*)&data, sizeof(gpssmall_t));
if (success == false) {
return std::nullopt;
}
return data;
}
std::optional<environment_t> I2cDev_PPmod::get_environment_data() {
Command cmd = Command::COMMAND_GETFEAT_DATA_ENVIRONMENT;
environment_t data;
bool success = i2c_read((uint8_t*)&cmd, 2, (uint8_t*)&data, sizeof(environment_t));
if (success == false) {
return std::nullopt;
}
return data;
}
std::optional<uint16_t> I2cDev_PPmod::get_light_data() {
Command cmd = Command::COMMAND_GETFEAT_DATA_LIGHT;
uint16_t data;
bool success = i2c_read((uint8_t*)&cmd, 2, (uint8_t*)&data, sizeof(uint16_t));
if (success == false) {
return std::nullopt;
}
return data;
}
uint64_t I2cDev_PPmod::get_features_mask() {
uint64_t mask = 0;
Command cmd = Command::COMMAND_GETFEATURE_MASK;
bool success = i2c_read((uint8_t*)&cmd, 2, (uint8_t*)&mask, sizeof(mask));
if (success == false) {
return 0;
}
// sanity check
if (mask == UINT64_MAX) {
return 0;
}
return mask;
}
std::optional<I2cDev_PPmod::device_info> I2cDev_PPmod::readDeviceInfo() {
@@ -45,7 +128,10 @@ std::optional<I2cDev_PPmod::device_info> I2cDev_PPmod::readDeviceInfo() {
if (success == false) {
return std::nullopt;
}
// sanity check
if (info.application_count > 1000) {
return std::nullopt;
}
return info;
}
@@ -58,6 +144,10 @@ std::optional<I2cDev_PPmod::standalone_app_info> I2cDev_PPmod::getStandaloneAppI
if (success == false) {
return std::nullopt;
}
// sanity check
if (info.binary_size == UINT32_MAX) {
return std::nullopt;
}
return info;
}
+20 -4
View File
@@ -30,6 +30,8 @@
#include "standalone_app.hpp"
#include "i2cdevmanager.hpp"
#include "i2cdev_ppmod_helper.hpp"
namespace i2cdev {
class I2cDev_PPmod : public I2cDev {
@@ -38,13 +40,22 @@ class I2cDev_PPmod : public I2cDev {
COMMAND_NONE = 0,
// will respond with device_info
COMMAND_INFO = 0x18F0,
COMMAND_INFO = 1,
// will respond with info of application
COMMAND_APP_INFO = 0xA90B,
COMMAND_APP_INFO,
// will respond with application data
COMMAND_APP_TRANSFER = 0x4183,
COMMAND_APP_TRANSFER,
// Feature specific commands
COMMAND_GETFEATURE_MASK,
// Feature data getter commands
COMMAND_GETFEAT_DATA_GPS,
COMMAND_GETFEAT_DATA_ORIENTATION,
COMMAND_GETFEAT_DATA_ENVIRONMENT,
COMMAND_GETFEAT_DATA_LIGHT,
};
typedef struct {
@@ -66,9 +77,14 @@ class I2cDev_PPmod : public I2cDev {
bool init(uint8_t addr_) override;
void update() override;
std::optional<device_info> readDeviceInfo();
std::optional<standalone_app_info> getStandaloneAppInfo(uint32_t index);
std::vector<uint8_t> downloadStandaloneApp(uint32_t index, size_t offset);
uint64_t get_features_mask();
std::optional<device_info> readDeviceInfo();
std::optional<gpssmall_t> get_gps_data();
std::optional<orientation_t> get_orientation_data();
std::optional<environment_t> get_environment_data();
std::optional<uint16_t> get_light_data();
};
} /* namespace i2cdev */
+59
View File
@@ -0,0 +1,59 @@
#ifndef I2CDEV_PPMOD_HELPER_H
#define I2CDEV_PPMOD_HELPER_H
#include <cstdint>
enum class SupportedFeatures : uint64_t {
FEAT_NONE = 0,
FEAT_EXT_APP = 1 << 0,
FEAT_UART = 1 << 1,
FEAT_GPS = 1 << 2,
FEAT_ORIENTATION = 1 << 3,
FEAT_ENVIRONMENT = 1 << 4,
FEAT_LIGHT = 1 << 5,
FEAT_DISPLAY = 1 << 6
};
typedef struct
{
uint8_t hour; /*!< Hour */
uint8_t minute; /*!< Minute */
uint8_t second; /*!< Second */
uint16_t thousand; /*!< Thousand */
} gps_time_t;
typedef struct
{
uint8_t day; /*!< Day (start from 1) */
uint8_t month; /*!< Month (start from 1) */
uint16_t year; /*!< Year (start from 2000) */
} gps_date_t;
typedef struct
{
float latitude; /*!< Latitude (degrees) */
float longitude; /*!< Longitude (degrees) */
float altitude; /*!< Altitude (meters) */
uint8_t sats_in_use; /*!< Number of satellites in use */
uint8_t sats_in_view; /*!< Number of satellites in view */
float speed; /*!< Ground speed, unit: m/s */
gps_date_t date; /*!< Fix date */
gps_time_t tim; /*!< time in UTC */
} gpssmall_t;
typedef struct
{
float angle;
float tilt;
} orientation_t;
typedef struct
{
float temperature;
float humidity;
float pressure;
} environment_t;
// light is uint16_t
#endif
+9 -4
View File
@@ -131,8 +131,13 @@ void I2cDev::got_success() {
bool I2cDev::i2c_read(uint8_t* reg, uint8_t reg_size, uint8_t* data, uint8_t bytes) {
if (bytes == 0) return false;
if (reg_size > 0 && reg) i2cbus.transmit(addr, reg, reg_size);
bool ret = i2cbus.receive(addr, data, bytes);
bool ret = true;
if (reg_size > 0 && reg) ret = i2cbus.transmit(addr, reg, reg_size, 150);
if (!ret) {
got_error();
return false;
}
ret = i2cbus.receive(addr, data, bytes, 150);
if (!ret)
got_error();
else
@@ -153,7 +158,7 @@ bool I2cDev::i2c_write(uint8_t* reg, uint8_t reg_size, uint8_t* data, uint8_t by
// Copy the data into the buffer after the register data
memcpy(buffer + reg_size, data, bytes);
// Transmit the combined data
bool result = i2cbus.transmit(addr, buffer, total_size);
bool result = i2cbus.transmit(addr, buffer, total_size, 150);
// Clean up the dynamically allocated buffer
delete[] buffer;
if (!result)
@@ -304,7 +309,7 @@ msg_t I2CDevManager::timer_fn(void* arg) {
force_scan = false;
}
for (size_t i = 0; i < devlist.size(); i++) {
if (devlist[i].addr != 0 && devlist[i].dev) {
if (devlist[i].addr != 0 && devlist[i].dev && devlist[i].dev->query_interval != 0) {
if ((curr_timer % devlist[i].dev->query_interval) == 0) { // only if it is device's interval
devlist[i].dev->update(); // updates it's data, and broadcasts it. if there is any error it will handle in it, and later we can remove it
}
+5 -1
View File
@@ -416,8 +416,12 @@ class IO {
const auto value_low = data_read();
uint32_t original_value = (value_high << 8) | value_low;
if (get_is_inverted()) return original_value;
if (get_dark_cover()) {
original_value = DARKENED_PIXEL(original_value, get_brightness());
// this is read data, so if the fake brightness is enabled AKA get_dark_cover() == true,
// then shift to back side AKA UNDARKENED_PIXEL, to prevent read shifted darkern info
original_value = UNDARKENED_PIXEL(original_value, get_brightness());
}
return original_value;
}
+2 -2
View File
@@ -2681,9 +2681,9 @@ void Waveform::paint(Painter& painter) {
x = prev_x + x_inc;
h /= 2;
prev_y = y_offset + h + (*(data_start++) * y_scale);
prev_y = y_offset + h - (*(data_start++) * y_scale);
for (n = 1; n < length_; n++) {
y = y_offset + h + (*(data_start++) * y_scale);
y = y_offset + h - (*(data_start++) * y_scale);
display.draw_line({prev_x, prev_y}, {(Coord)x, y}, color_);
prev_x = x;
+25 -1
View File
@@ -1 +1,25 @@
bitmap is for icons, it's colorless and headless; splash and modal isn't using bitmap
bitmap is for icons, it's colorless and headless; splash and modal isn't
using bitmap
## Bitmap helper folder
The folder `bitmap_tools` contains scripts to convert icons in png format to
the PortaPack readable format in `bitmap.hpp`.
### Convert a folder contains one or more icon.png to one bitmap.hpp
The `make_bitmap.py` is the traditional helper, well tested. The folder with
the icons is given as argument and generates the `./bitmap.hpp`. This file
needs to be copied to `mayhem-firmware/firmware/application/`.
The icon size needs to be a multiple of 8. The generated icon is black/white.
### Convert bitmap array to icon.png
The `bitmap_arr_reverse_decode.py` takes an array from the bitmap.hpp and
convert it back to a png.
### Convert both ways
The `pp_png2hpp.py` is based on the privious scripts, as all in one solution.
With the `--hpp bitmap.hpp` file and the `--graphics /folder_to/png_icons/`
arguments, theis script will generate a `bitmap.hpp`.
Add the `--reverse` argument to generate png icons from the given `bitmap.hpp`.
Especially the reverse function got a parser, to automatic get the filename
and size of the image.
+77
View File
@@ -0,0 +1,77 @@
#!/usr/bin/env python3
## Note: This helper was just a POC for pp_png3hpp.py to test the regex.
import argparse
import numpy as np
import re
from PIL import Image
def parse_bitmaphpp(bitmaphpp_file, icon_name):
ico_pattern = re.compile(r"static constexpr uint8_t bitmap_(.*)_data\[\] = {\n((?:\s+(?:.*)\n)+)};\nstatic constexpr Bitmap bitmap_.*\{\n\s+\{(.*)\},", re.MULTILINE)
ico_data = []
# read file to buffer, to find multiline regex
readfile = open(bitmaphpp_file,'r')
buff = readfile.read()
readfile.close()
if icon_name == 'all':
for match in ico_pattern.finditer(buff):
ico_data.append([match.group(1), match.group(2), match.group(3)])
else:
for match in ico_pattern.finditer(buff):
if match.group(1) in icon_name:
ico_data.append([match.group(1), match.group(2), match.group(3)])
return (ico_data)
def convert_hpp(icon_name,bitmap_array,iconsize_str):
iconsize = iconsize_str.split(", ")
bitmap_size = (int(iconsize[0]),int(iconsize[1]))
bitmap_data=[]
image_data = np.zeros((bitmap_size[1], bitmap_size[0]), dtype=np.uint8)
#print(bitmap_array)
for value in bitmap_array.split(",\n"):
if (value):
#print(int(value, 0))
bitmap_data.append(int(value, 0))
print(f"Count {len(bitmap_data)} Size: {bitmap_size[0]}x{bitmap_size[1]} ({bitmap_size[0]*bitmap_size[1]})")
for y in range(bitmap_size[1]):
for x in range(bitmap_size[0]):
byte_index = (y * bitmap_size[0] + x) // 8
bit_index = x % 8
# bit_index = 7 - (x % 8)
pixel_value = (bitmap_data[byte_index] >> bit_index) & 1
image_data[y, x] = pixel_value * 255
image = Image.fromarray(image_data, 'L')
imagea = image.copy()
imagea.putalpha(image)
imagea.save(icon_name+".png")
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("hpp", help="Path for bitmap.hpp")
parser.add_argument("--icon", help="Name of the icon from bitmap.hpp, Use 'All' for all icons in file", default = 'titlebar_image')
args = parser.parse_args()
if args.icon:
icon_name = args.icon
else:
icon_name = 'titlebar_image'
print("parse", icon_name)
icons = parse_bitmaphpp(args.hpp, icon_name)
for icon in icons:
convert_hpp(icon[0],icon[1],icon[2])
+239
View File
@@ -0,0 +1,239 @@
#!/usr/bin/env python3
# Convert png icons to bitmap.hpp inspired by
# make_bitmap.py - Copyright (C) 2016 Furrtek
# Convert bitmap.hpp to icons inspired by
# bitmap_arr_reverse_decode.py - Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc.
# bitmap_arr_reverse_decode.py - Copyleft (ɔ) 2024 zxkmm with the GPL license
# Copysomething (c) 2024 LupusE with the license, needed by the PortaPack project
#
# 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, 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; see the file COPYING. If not, write to
# the Free Software Foundation, Inc., 51 Franklin Street,
# Boston, MA 02110-1301, USA.
#
import argparse
import numpy as np
import re
import sys
import os
from PIL import Image
### Convert a directory of icons in png format to one bitmap.hpp file.
######################################################################
def pp_bitmaphpp_header():
return ("""/*
* Copyright (C) 2015 Jared Boone, ShareBrained Technology, Inc.
* Copyright (C) 2016 Furrtek
*
* This file is part of PortaPack.
*
* 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, 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; see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street,
* Boston, MA 02110-1301, USA.
*/
// This file was generated by make_bitmap.py
#ifndef __BITMAP_HPP__
#define __BITMAP_HPP__
#include \"ui.hpp\"
namespace ui {
""")
def convert_png(file):
bmp_data = []
data = 0
rgb_im = Image.open(file).convert('RGBA')
if rgb_im.size[0] % 8 or rgb_im.size[1] % 8:
print((file + ": Size is not a multiple of 8. Image is not included in bitmap.hpp."))
sys.exit(-1)
name = os.path.basename(file).split(".")[0].lower()
bmp_data.append(f"\nstatic constexpr uint8_t bitmap_{name}_data[] = {{\n")
for i in range(rgb_im.size[1]):
for j in range(rgb_im.size[0]):
r, g, b, a = rgb_im.getpixel((j, i))
data >>= 1
if r > 127 and g > 127 and b > 127 and a > 127:
data += 128
if j % 8 == 7:
bmp_data.append(" 0x%0.2X,\n" % data)
data = 0
bmp_data.append(f"""}};
static constexpr Bitmap bitmap_{name}{{
{{{str(rgb_im.size[0])}, {str(rgb_im.size[1])}}},
bitmap_{name}_data}};
""")
out_bmpdata = ''.join(map(str, bmp_data))
return (out_bmpdata)
def pp_bitmaphpp_data(pngicons_path):
count = 0
bitmaphpp_data = []
for file in os.listdir(pngicons_path):
if os.path.isfile(pngicons_path + file) and file.endswith(".png"):
bitmaphpp_data.append(convert_png(pngicons_path + file))
count += 1
return bitmaphpp_data
def pp_bitmaphpp_footer():
return("""
} /* namespace ui */
#endif /*__BITMAP_HPP__*/
""")
def pp_write_bitmaphpp(pngicons_path, hpp_outpath):
bitmaphpp_file = []
bitmaphpp_file.append(pp_bitmaphpp_header())
bitmaphpp_file.append("".join(str(x) for x in pp_bitmaphpp_data(pngicons_path)))
bitmaphpp_file.append(pp_bitmaphpp_footer())
out_file = "".join(str(x) for x in bitmaphpp_file)
with open(hpp_outpath, "w", encoding="utf-8") as fd:
fd.writelines(out_file)
print("Find your bitmap.hpp at", hpp_outpath)
### Convert from a bitmap.hpp file one or all icons in png.
###########################################################
def parse_bitmaphpp(bitmaphpp_file,icon_name):
ico_pattern = re.compile(r"static constexpr uint8_t bitmap_(.*)_data\[\] = {\n((?:\s+(?:.*)\n)+)};\nstatic constexpr Bitmap bitmap_.*\{\n\s+\{(.*)\},", re.MULTILINE)
ico_data = []
# read file to buffer, to find multiline regex
readfile = open(bitmaphpp_file,'r')
buff = readfile.read()
readfile.close()
if icon_name == 'all':
for match in ico_pattern.finditer(buff):
ico_data.append([match.group(1), match.group(2), match.group(3)])
else:
for match in ico_pattern.finditer(buff):
if match.group(1) in icon_name:
ico_data.append([match.group(1), match.group(2), match.group(3)])
return (ico_data)
def convert_hpp(icon_name,bitmap_array,iconsize_str,png_outdir):
iconsize = iconsize_str.split(", ")
bitmap_size = (int(iconsize[0]),int(iconsize[1]))
bitmap_data=[]
image_data = np.zeros((bitmap_size[1], bitmap_size[0]), dtype=np.uint8)
for value in bitmap_array.split(",\n"):
if (value):
bitmap_data.append(int(value, 0))
for y in range(bitmap_size[1]):
for x in range(bitmap_size[0]):
byte_index = (y * bitmap_size[0] + x) // 8
bit_index = x % 8
# bit_index = 7 - (x % 8)
pixel_value = (bitmap_data[byte_index] >> bit_index) & 1
image_data[y, x] = pixel_value * 255
image = Image.fromarray(image_data, 'L')
icon_out = os.path.join(png_outdir,icon_name+".png")
image.save(icon_out)
### Processing
##############
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("hpp", help="Path of the bitmap.hpp")
parser.add_argument("graphics", help="Path of <icon>.png files to convert", default=os.path.join(os.getcwd(),"graphics"))
parser.add_argument("--icon","-i", help="Name of the icon to convert in reverse. Use 'all' to convert all. More names can be comma seperated.")
parser.add_argument("--reverse","-r", help="Convert icon from bitmap.hpp to <name>.png", action="store_true")
args = parser.parse_args()
if args.reverse:
print("Reverse: Converting from hpp to png")
# filter hpp arg is a file
hpp_file_path = args.hpp
if not os.path.isfile(hpp_file_path):
print(f"Error: {hpp_file_path} is not a valid file.")
sys.exit(1)
# filter graph arg is a path
if args.graphics:
graphics_path = os.path.join(args.graphics, '')
else:
graphics_path = os.path.join(os.getcwd(),"graphics", '')
if not os.path.exists(graphics_path):
os.makedirs(graphics_path) # create if not exist
# define icons to convert
if args.icon:
icon_name = args.icon
else:
icon_name = 'titlebar_image'
icons = parse_bitmaphpp(hpp_file_path, icon_name)
for icon in icons:
print("Converting icon", icon[0])
convert_hpp(icon[0], icon[1], icon[2], graphics_path)
sys.exit()
else:
print("Converting from png to hpp")
if args.graphics:
graphics_path = os.path.join(args.graphics, '')
else:
graphics_path = os.path.join(os.getcwd(),"graphics", '')
print("From path", graphics_path, "to file", args.hpp)
pp_write_bitmaphpp(graphics_path, args.hpp)
sys.exit()
@@ -0,0 +1,184 @@
#!/usr/bin/env python3
# Copysomething (c) 2024 LupusE with the license, needed by the PortaPack project
#
# 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, 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; see the file COPYING. If not, write to
# the Free Software Foundation, Inc., 51 Franklin Street,
# Boston, MA 02110-1301, USA.
#
import argparse
import json
import os
import re
import requests
import sys
cppheader = """#include "ui_about_simple.hpp"
namespace ui {
// Information: a line starting with a '#' will be yellow coloured
const std::"""
cppfooter = """
AboutView::AboutView(NavigationView& nav) {
add_children({&menu_view,
&button_ok});
button_ok.on_select = [&nav](Button&) {
nav.pop();
};
menu_view.on_left = [this]() {
button_ok.focus();
};
menu_view.on_right = [this]() {
button_ok.focus();
};
for (const std::string& authors_line : authors_list) {
// if it's starting with #, it's a title and we have to substract the '#' and paint yellow
if (authors_line.size() > 0) {
if (authors_line[0] == '#') {
menu_view.add_item(
{authors_line.substr(1, authors_line.size() - 1),
ui::Theme::getInstance()->fg_yellow->foreground,
nullptr,
nullptr});
} else {
menu_view.add_item(
{authors_line,
Theme::getInstance()->bg_darkest->foreground,
nullptr,
nullptr});
}
}
}
}
void AboutView::focus() {
menu_view.focus();
// put focus on last text line to make it more obvious that list is scrollable
menu_view.set_highlighted(10);
}
} /* namespace ui */
"""
def get_contributors(url):
contributors_list = [] ## Raw list of contributor names
logins = json.loads(requests.get(url).text)
try:
print(f"Could not reach URL - Error: {logins['status']} Messsage: {logins['message']}")
## Status f.ex. 404 / message f.ex. "Not Found" or "API rate limit exceeded for...".
sys.exit()
except:
pass
for gh_user in logins:
clean_ghuser = re.sub('[^a-zA-Z0-9-]', '.', gh_user['login']) ## replace non printable character with .
contributors_list.append(clean_ghuser)
contributor_id = 0
contrib_format = [] ## Formated list of contributors, max 30 char per line
for contributor in contributors_list:
contributor_id +=1
contrib_format.append(contributor)
line_len = len(",".join(contrib_format).split("\n")[-1])
if contributor_id < len(contributors_list) and line_len+len(contributors_list[contributor_id]) >=30:
contrib_format.append("\n")
return(",".join(contrib_format).replace("\n,","\n")) # replace to erase first , in followup lines
def generate_content(projects):
project_contrib = []
project_contrib.append("string authors_list[] = {\n")
project_contrib.append(" \"# * List of contributors * \",\n")
for project in projects:
project_contrib.append(" \" \",\n")
project_contrib.append(f" \"#{project[0]}:\",\n")
url = f"https://api.github.com/repos/{project[1]}/{project[2]}/contributors?per_page={project[3]}"
contrib_mayhem = get_contributors(url).split("\n")
for line in contrib_mayhem:
project_contrib.append(f" \"{line}\",\n")
project_contrib.append(" \" \"};\n")
return("".join(project_contrib))
def pp_create_ui_about_simple_cpp(cpp_file, cppheader, cppcontent, cppfooter):
uiaboutsimplecpp_file = []
uiaboutsimplecpp_file.append(cppheader)
uiaboutsimplecpp_file.append(cppcontent)
uiaboutsimplecpp_file.append(cppfooter)
with open(cpp_file, "w", encoding="utf-8") as file:
file.writelines(uiaboutsimplecpp_file)
print("Find your ui_simple_about.cpp at", cpp_file)
def pp_change_ui_about_simple_cpp(cpp_file, cppcontent):
content = []
content_pattern = re.compile(r"string authors_list\[\] = {\n(?:\s+(?:.*,\n)+\s+.*};\n)", re.MULTILINE)
# Read original file
with open(cpp_file, 'r') as file:
filedata = file.read()
# Replace regex content with generated list
for match in content_pattern.finditer(filedata):
content.append(match[0])
filedata = filedata.replace(content[0], cppcontent)
# Write new file
with open(cpp_file, 'w') as file:
file.write(filedata)
projects = []
## Format: Project title, Github name, Github repo, Amount of contributors
projects.append(["Mayhem-Firmware","portapack-mayhem","mayhem-firmware","50"])
projects.append(["Havoc","furrtek","portapack-havoc","50"])
projects.append(["PortaPack","sharebrained","portapack-hackrf","50"])
projects.append(["HackRF","mossmann","hackrf","15"])
## processing
#############
if __name__ == '__main__':
parser = argparse.ArgumentParser(
description="This tool updates the ui_about_simple.cpp from PortaPack firmware from Github contributors. If no file is given, the file will be generated.",
)
parser.add_argument("--cpp", help="Path of the source ui_about_simple.cpp to update.", default="ui_about_simple.cpp")
parser.add_argument("--new","-n", help="Generate a new file")
args = parser.parse_args()
if args.cpp:
cpp_file = os.path.join(os.getcwd(),args.cpp)
else:
cpp_file = os.path.join(os.getcwd(),"ui_about_simple.cpp")
cppcontent = generate_content(projects)
if args.new or not os.path.isfile(args.cpp):
pp_create_ui_about_simple_cpp(cpp_file, cppheader, cppcontent, cppfooter)
else:
pp_change_ui_about_simple_cpp(cpp_file, cppcontent)
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
+14
View File
@@ -0,0 +1,14 @@
**/*.qws
**/*.chg
**/smart.log
**/db/
**/incremental_db/
**/output_files/*.done
**/output_files/*.smsg
**/output_files/*.summary
**/output_files/*.jdi
**/output_files/*.pin
**/output_files/*.pof
**/output_files/*.rpt
**/output_files/*.sld
**/simulation/
@@ -0,0 +1,109 @@
#
# Copyright (C) 2017 Jared Boone, ShareBrained Technology, Inc.
# Copyright (C) 2024 jLynx.net https://github.com/jLynx
#
# This file is part of PortaPack.
#
# 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, 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; see the file COPYING. If not, write to
# the Free Software Foundation, Inc., 51 Franklin Street,
# Boston, MA 02110-1301, USA.
# Makefile based on Altera Quartus documentation example, topic
# "About Using Quartus II from the Command Line"
###################################################################
# Project Configuration:
#
# Specify the name of the design (project) and Quartus II Settings
# File (.qsf) and the list of source files used.
###################################################################
PROJECT=portapack_h4m_cpld
SOURCE_FILES=top.vhd
ASSIGNMENT_FILES=$(PROJECT).qpf $(PROJECT).qsf $(PROJECT).sdc
OUTPUT_DIR=output_files
###################################################################
# Main Targets
#
# all: build everything
# clean: remove output files and database
###################################################################
all: smart.log $(OUTPUT_DIR)/$(PROJECT).asm.rpt $(OUTPUT_DIR)/$(PROJECT).sta.rpt
clean:
rm -rf *.chg *.qws smart.log db/ incremental_db/ $(OUTPUT_DIR)/
map: smart.log $(OUTPUT_DIR)/$(PROJECT).map.rpt
fit: smart.log $(OUTPUT_DIR)/$(PROJECT).fit.rpt
asm: smart.log $(OUTPUT_DIR)/$(PROJECT).asm.rpt
sta: smart.log $(OUTPUT_DIR)/$(PROJECT).sta.rpt
smart: smart.log
###################################################################
# Executable Configuration
###################################################################
MAP_ARGS=
FIT_ARGS=
ASM_ARGS=
STA_ARGS=
###################################################################
# Target implementations
###################################################################
STAMP = echo done >
$(OUTPUT_DIR)/$(PROJECT).map.rpt: $(SOURCE_FILES)
quartus_map $(MAP_ARGS) $(PROJECT)
$(STAMP) fit.chg
$(OUTPUT_DIR)/$(PROJECT).fit.rpt: fit.chg $(OUTPUT_DIR)/$(PROJECT).map.rpt
quartus_fit $(FIT_ARGS) $(PROJECT)
$(STAMP) asm.chg
$(STAMP) sta.chg
$(OUTPUT_DIR)/$(PROJECT).asm.rpt: asm.chg $(OUTPUT_DIR)/$(PROJECT).fit.rpt
quartus_asm $(ASM_ARGS) $(PROJECT)
$(OUTPUT_DIR)/$(PROJECT).sta.rpt: sta.chg $(OUTPUT_DIR)/$(PROJECT).fit.rpt
quartus_sta $(STA_ARGS) $(PROJECT)
smart.log: $(ASSIGNMENT_FILES) $(OUTPUT_DIR)
quartus_sh --determine_smart_action $(PROJECT) > smart.log
###################################################################
# Project initialization
###################################################################
$(OUTPUT_DIR):
mkdir $(OUTPUT_DIR)
$(ASSIGNMENT_FILES): $(OUTPUT_DIR)
quartus_sh --prepare $(PROJECT)
fit.chg:
$(STAMP) fit.chg
sta.chg:
$(STAMP) sta.chg
asm.chg:
$(STAMP) asm.chg
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,30 @@
# -------------------------------------------------------------------------- #
#
# Copyright (C) 1991-2014 Altera Corporation
# Your use of Altera Corporation's design tools, logic functions
# and other software and tools, and its AMPP partner logic
# functions, and any output files from any of the foregoing
# (including device programming or simulation files), and any
# associated documentation or information are expressly subject
# to the terms and conditions of the Altera Program License
# Subscription Agreement, Altera MegaCore Function License
# Agreement, or other applicable license agreement, including,
# without limitation, that your use is for the sole purpose of
# programming logic devices manufactured by Altera and sold by
# Altera or its authorized distributors. Please refer to the
# applicable agreement for further details.
#
# -------------------------------------------------------------------------- #
#
# Quartus II 32-bit
# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition
# Date created = 21:24:55 April 29, 2014
#
# -------------------------------------------------------------------------- #
QUARTUS_VERSION = "13.1"
DATE = "21:24:55 April 29, 2014"
# Revisions
PROJECT_REVISION = "portapack_h4m_cpld"
@@ -0,0 +1,352 @@
# -------------------------------------------------------------------------- #
#
# Copyright (C) 1991-2014 Altera Corporation
# Your use of Altera Corporation's design tools, logic functions
# and other software and tools, and its AMPP partner logic
# functions, and any output files from any of the foregoing
# (including device programming or simulation files), and any
# associated documentation or information are expressly subject
# to the terms and conditions of the Altera Program License
# Subscription Agreement, Altera MegaCore Function License
# Agreement, or other applicable license agreement, including,
# without limitation, that your use is for the sole purpose of
# programming logic devices manufactured by Altera and sold by
# Altera or its authorized distributors. Please refer to the
# applicable agreement for further details.
#
# -------------------------------------------------------------------------- #
#
# Quartus II 32-bit
# Version 13.1.4 Build 182 03/12/2014 SJ Web Edition
# Date created = 21:24:55 April 29, 2014
#
# -------------------------------------------------------------------------- #
#
# Notes:
#
# 1) The default values for assignments are stored in the file:
# portapack_h4m_cpld_assignment_defaults.qdf
# If this file doesn't exist, see file:
# assignment_defaults.qdf
#
# 2) Altera recommends that you do not modify this file. This
# file is updated automatically by the Quartus II software
# and any changes you make may be lost or overwritten.
#
# -------------------------------------------------------------------------- #
set_global_assignment -name FAMILY "MAX II"
set_global_assignment -name DEVICE EPM240T100C5
set_global_assignment -name TOP_LEVEL_ENTITY top
set_global_assignment -name ORIGINAL_QUARTUS_VERSION 13.1
set_global_assignment -name PROJECT_CREATION_TIME_DATE "21:24:55 APRIL 29, 2014"
set_global_assignment -name LAST_QUARTUS_VERSION "22.1std.1 Lite Edition"
set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files
set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0
set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85
set_global_assignment -name DEVICE_FILTER_PIN_COUNT 100
set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR "-1"
set_global_assignment -name EDA_SIMULATION_TOOL "Questa Intel FPGA (VHDL)"
set_global_assignment -name EDA_NETLIST_WRITER_OUTPUT_DIR simulation/modelsim -section_id eda_simulation
set_global_assignment -name EDA_OUTPUT_DATA_FORMAT VHDL -section_id eda_simulation
set_global_assignment -name VHDL_INPUT_VERSION VHDL_2008
set_global_assignment -name VHDL_SHOW_LMF_MAPPING_MESSAGES OFF
set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD "3.3V SCHMITT TRIGGER INPUT" -to SW_D
set_instance_assignment -name IO_STANDARD "3.3V SCHMITT TRIGGER INPUT" -to SW_L
set_instance_assignment -name IO_STANDARD "3.3V SCHMITT TRIGGER INPUT" -to SW_R
set_instance_assignment -name IO_STANDARD "3.3V SCHMITT TRIGGER INPUT" -to SW_ROT_A
set_instance_assignment -name IO_STANDARD "3.3V SCHMITT TRIGGER INPUT" -to SW_ROT_B
set_instance_assignment -name IO_STANDARD "3.3V SCHMITT TRIGGER INPUT" -to SW_SEL
set_instance_assignment -name IO_STANDARD "3.3V SCHMITT TRIGGER INPUT" -to SW_U
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to TP_D
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to TP_L
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to TP_R
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to TP_U
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[15]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[14]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[13]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[12]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[11]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[10]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[9]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[8]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[7]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[6]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[5]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[4]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[3]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[2]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[1]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[0]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_RDX
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_RS
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_TE
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_WRX
set_global_assignment -name EDA_TEST_BENCH_ENABLE_STATUS TEST_BENCH_MODE -section_id eda_simulation
set_global_assignment -name EDA_NATIVELINK_SIMULATION_TEST_BENCH top_tb -section_id eda_simulation
set_global_assignment -name EDA_TEST_BENCH_NAME top_tb -section_id eda_simulation
set_global_assignment -name EDA_DESIGN_INSTANCE_NAME uut -section_id top_tb
set_global_assignment -name EDA_TEST_BENCH_MODULE_NAME top_tb -section_id top_tb
set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "NO HEAT SINK WITH STILL AIR"
set_global_assignment -name EDA_TEST_BENCH_RUN_SIM_FOR "500 ns" -section_id top_tb
set_global_assignment -name EDA_TEST_BENCH_FILE top_tb.vhd -section_id top_tb
set_global_assignment -name EDA_BOARD_DESIGN_BOUNDARY_SCAN_TOOL "BSDL (Boundary Scan)"
set_global_assignment -name EDA_NETLIST_WRITER_OUTPUT_DIR /home/jboone/src/portapack/portapack_hackrf/hardware/portapack_h2/cpld -section_id eda_board_design_boundary_scan
set_global_assignment -name EDA_BOARD_BOUNDARY_SCAN_OPERATION POST_CONFIG -section_id eda_board_design_boundary_scan
set_global_assignment -name AUTO_RESTART_CONFIGURATION OFF
set_global_assignment -name ENABLE_CONFIGURATION_PINS OFF
set_global_assignment -name ENABLE_NCE_PIN OFF
set_global_assignment -name ENABLE_BOOT_SEL_PIN OFF
set_global_assignment -name USE_CONFIGURATION_DEVICE ON
set_global_assignment -name GENERATE_RBF_FILE OFF
set_global_assignment -name GENERATE_SVF_FILE ON
set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED WITH BUS-HOLD"
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_RESETX
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_ADDR
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[7]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[6]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[5]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[4]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[3]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[2]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[1]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[0]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_DIR
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SW_D
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SW_L
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SW_R
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SW_U
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SW_ROT_B
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SW_SEL
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to SW_ROT_A
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[15]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[14]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[13]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[12]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[11]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[10]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[9]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[8]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[7]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[6]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[5]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[4]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[3]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[2]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[1]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[0]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_RDX
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_RESETX
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_RS
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_TE
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_WRX
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_ADDR
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[7]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[6]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[5]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[4]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[3]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[2]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[1]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[0]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_DIR
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_D
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_L
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_R
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_ROT_A
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_ROT_B
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_SEL
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_U
set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to TP_D
set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to TP_L
set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to TP_R
set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to TP_U
set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[15]
set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[14]
set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[13]
set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[12]
set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[11]
set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[10]
set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[9]
set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[8]
set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[7]
set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[6]
set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[5]
set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[4]
set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[3]
set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[2]
set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[1]
set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_DB[0]
set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_RDX
set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_RESETX
set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_RS
set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_TE
set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_WRX
set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_ADDR
set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[7]
set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[6]
set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[5]
set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[4]
set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[3]
set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[2]
set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[1]
set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_D[0]
set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_DIR
set_instance_assignment -name SLOW_SLEW_RATE ON -to SW_D
set_instance_assignment -name SLOW_SLEW_RATE ON -to SW_L
set_instance_assignment -name SLOW_SLEW_RATE ON -to SW_R
set_instance_assignment -name SLOW_SLEW_RATE ON -to SW_ROT_A
set_instance_assignment -name SLOW_SLEW_RATE ON -to SW_ROT_B
set_instance_assignment -name SLOW_SLEW_RATE ON -to SW_SEL
set_instance_assignment -name SLOW_SLEW_RATE ON -to SW_U
set_instance_assignment -name SLOW_SLEW_RATE ON -to TP_D
set_instance_assignment -name SLOW_SLEW_RATE ON -to TP_L
set_instance_assignment -name SLOW_SLEW_RATE ON -to TP_R
set_instance_assignment -name SLOW_SLEW_RATE ON -to TP_U
set_global_assignment -name ENABLE_DEVICE_WIDE_RESET OFF
set_global_assignment -name IOBANK_VCCIO 3.3V -section_id 2
set_global_assignment -name IOBANK_VCCIO 3.3V -section_id 1
set_instance_assignment -name PCI_IO OFF -to MCU_DIR
set_global_assignment -name ALLOW_LVTTL_LVCMOS_INPUT_LEVELS_TO_OVERDRIVE_INPUT_BUFFER ON
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_BACKLIGHT
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_BACKLIGHT
set_instance_assignment -name SLOW_SLEW_RATE ON -to LCD_BACKLIGHT
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to AUDIO_RESETX
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to AUDIO_RESETX
set_instance_assignment -name SLOW_SLEW_RATE ON -to AUDIO_RESETX
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_LCD_RDX
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_LCD_RDX
set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_LCD_RDX
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_LCD_WRX
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_LCD_WRX
set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_LCD_WRX
set_instance_assignment -name PCI_IO OFF -to MCU_LCD_WRX
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_IO_STBX
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_IO_STBX
set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_IO_STBX
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to TP_R
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to TP_D
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to TP_L
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to TP_U
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_LCD_TE
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_LCD_TE
set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_LCD_TE
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_P2_8
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_P2_8
set_instance_assignment -name SLOW_SLEW_RATE ON -to MCU_P2_8
set_instance_assignment -name PCI_IO OFF -to MCU_P2_8
set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[15]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[14]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[13]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[12]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[11]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[10]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[9]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[8]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[7]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[6]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[5]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[4]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[3]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[2]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[1]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to LCD_DB[0]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_D[7]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_D[6]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_D[5]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_D[4]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_D[3]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_D[2]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_D[1]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_D[0]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_ADDR
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_DIR
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_IO_STBX
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to MCU_LCD_RDX
set_instance_assignment -name WEAK_PULL_UP_RESISTOR OFF -to MCU_LCD_WRX
set_instance_assignment -name WEAK_PULL_UP_RESISTOR OFF -to MCU_P2_8
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to GPS_TIMEPULSE
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to GPS_TIMEPULSE
set_instance_assignment -name SLOW_SLEW_RATE ON -to GPS_TIMEPULSE
set_instance_assignment -name PCI_IO OFF -to GPS_TIMEPULSE
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to GPS_TIMEPULSE
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to GPS_TX_READY
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to GPS_TX_READY
set_instance_assignment -name SLOW_SLEW_RATE ON -to GPS_TX_READY
set_instance_assignment -name PCI_IO OFF -to GPS_TX_READY
set_instance_assignment -name WEAK_PULL_UP_RESISTOR ON -to GPS_TX_READY
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to REF_EN
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to REF_EN
set_instance_assignment -name SLOW_SLEW_RATE ON -to REF_EN
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to GPS_RESETX
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to GPS_RESETX
set_instance_assignment -name SLOW_SLEW_RATE ON -to GPS_RESETX
set_location_assignment PIN_58 -to REF_EN
set_location_assignment PIN_72 -to MCU_DIR
set_location_assignment PIN_41 -to MCU_IO_STBX
set_location_assignment PIN_40 -to MCU_LCD_TE
set_location_assignment PIN_43 -to MCU_P2_8
set_location_assignment PIN_71 -to MCU_LCD_WRX
set_location_assignment PIN_42 -to MCU_ADDR
set_location_assignment PIN_39 -to MCU_LCD_RDX
set_location_assignment PIN_35 -to MCU_D[0]
set_location_assignment PIN_33 -to MCU_D[2]
set_location_assignment PIN_28 -to MCU_D[4]
set_location_assignment PIN_27 -to MCU_D[6]
set_location_assignment PIN_8 -to TP_U
set_location_assignment PIN_7 -to TP_L
set_location_assignment PIN_6 -to TP_D
set_location_assignment PIN_5 -to TP_R
set_location_assignment PIN_26 -to MCU_D[7]
set_location_assignment PIN_29 -to MCU_D[5]
set_location_assignment PIN_30 -to MCU_D[3]
set_location_assignment PIN_36 -to MCU_D[1]
set_location_assignment PIN_73 -to GPS_RESETX
set_location_assignment PIN_75 -to GPS_TX_READY
set_location_assignment PIN_74 -to GPS_TIMEPULSE
set_location_assignment PIN_34 -to SW_U
set_location_assignment PIN_37 -to SW_L
set_location_assignment PIN_17 -to SW_SEL
set_location_assignment PIN_12 -to SW_R
set_location_assignment PIN_14 -to SW_D
set_location_assignment PIN_15 -to SW_ROT_A
set_location_assignment PIN_16 -to SW_ROT_B
set_location_assignment PIN_99 -to LCD_DB[0]
set_location_assignment PIN_98 -to LCD_DB[1]
set_location_assignment PIN_97 -to LCD_DB[2]
set_location_assignment PIN_96 -to LCD_DB[3]
set_location_assignment PIN_95 -to LCD_DB[4]
set_location_assignment PIN_92 -to LCD_DB[5]
set_location_assignment PIN_91 -to LCD_DB[6]
set_location_assignment PIN_90 -to LCD_DB[7]
set_location_assignment PIN_89 -to LCD_DB[8]
set_location_assignment PIN_88 -to LCD_DB[9]
set_location_assignment PIN_87 -to LCD_DB[10]
set_location_assignment PIN_86 -to LCD_DB[11]
set_location_assignment PIN_85 -to LCD_DB[12]
set_location_assignment PIN_84 -to LCD_DB[13]
set_location_assignment PIN_83 -to LCD_DB[14]
set_location_assignment PIN_82 -to LCD_DB[15]
set_location_assignment PIN_100 -to LCD_RESETX
set_location_assignment PIN_1 -to LCD_RDX
set_location_assignment PIN_3 -to LCD_RS
set_location_assignment PIN_2 -to LCD_WRX
set_location_assignment PIN_76 -to LCD_BACKLIGHT
set_location_assignment PIN_4 -to LCD_TE
set_global_assignment -name ENABLE_OCT_DONE OFF
set_location_assignment PIN_38 -to DEVICE_RESET_V
set_location_assignment PIN_44 -to DEVICE_RESET
set_global_assignment -name SDC_FILE portapack_h4m_cpld.sdc
set_global_assignment -name VHDL_FILE top.vhd
set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SYSOFF
set_location_assignment PIN_47 -to SYSOFF
set_instance_assignment -name WEAK_PULL_UP_RESISTOR OFF -to SYSOFF
@@ -0,0 +1,116 @@
## Generated SDC file "portapack_hackrf_one_cpld.sdc"
## Copyright (C) 1991-2014 Altera Corporation
## Your use of Altera Corporation's design tools, logic functions
## and other software and tools, and its AMPP partner logic
## functions, and any output files from any of the foregoing
## (including device programming or simulation files), and any
## associated documentation or information are expressly subject
## to the terms and conditions of the Altera Program License
## Subscription Agreement, Altera MegaCore Function License
## Agreement, or other applicable license agreement, including,
## without limitation, that your use is for the sole purpose of
## programming logic devices manufactured by Altera and sold by
## Altera or its authorized distributors. Please refer to the
## applicable agreement for further details.
## VENDOR "Altera"
## PROGRAM "Quartus II"
## VERSION "Version 13.1.4 Build 182 03/12/2014 SJ Web Edition"
## DATE "Sat May 3 10:22:18 2014"
##
## DEVICE "5M40ZE64C5"
##
# RS = 0, D = DB[15:8]
# wait max(tast = 0 ns, CPLD setup = ?)
# WR = 0, D = DB[7:0]
# wait max(CPLD )
#**************************************************************
# Time Information
#**************************************************************
set_time_format -unit ns -decimal_places 3
set mcu_clk_period 4.9
set lcd_data_wr_setup 10.0
set lcd_data_wr_hold 10.0
#**************************************************************
# Create Clock
#**************************************************************
create_clock -name {MCU_LCD_WRX} -period 66.000 -waveform { 0.000 33.000 } [get_ports {MCU_LCD_WRX}]
#create_clock -name strobe_virt -period 66.000
#**************************************************************
# Create Generated Clock
#**************************************************************
#**************************************************************
# Set Clock Latency
#**************************************************************
#**************************************************************
# Set Clock Uncertainty
#**************************************************************
#**************************************************************
# Set Input Delay
#**************************************************************
#set_input_delay -clock strobe_virt [get_ports {D[*]}]
#**************************************************************
# Set Output Delay
#**************************************************************
#**************************************************************
# Set Clock Groups
#**************************************************************
#**************************************************************
# Set False Path
#**************************************************************
#set_false_path -from [get_clocks {MCU_IO_STBX}] -to [get_ports {TP_D TP_L TP_R TP_U}]
#set_false_path -from [get_ports {SW_D SW_L SW_R SW_ROT_A SW_ROT_B SW_SEL SW_U}] -to [get_ports {MCU_D[*]}]
#**************************************************************
# Set Multicycle Path
#**************************************************************
#**************************************************************
# Set Maximum Delay
#**************************************************************
#**************************************************************
# Set Minimum Delay
#**************************************************************
#**************************************************************
# Set Input Transition
#**************************************************************
@@ -0,0 +1 @@
dft_skip_oct_vccn_check = on
@@ -0,0 +1,207 @@
--
-- Copyright (C) 2012 Jared Boone, ShareBrained Technology, Inc.
-- Copyright (C) 2024 jLynx.net https://github.com/jLynx
--
-- This file is part of PortaPack.
--
-- 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, 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; see the file COPYING. If not, write to
-- the Free Software Foundation, Inc., 51 Franklin Street,
-- Boston, MA 02110-1301, USA.
library ieee;
use ieee.std_logic_1164.all;
entity top is
port (
MCU_D : inout std_logic_vector(7 downto 0);
MCU_DIR : in std_logic;
MCU_IO_STBX : in std_logic;
MCU_LCD_WRX : in std_logic;
MCU_ADDR : in std_logic;
MCU_LCD_TE : out std_logic;
MCU_P2_8 : in std_logic;
MCU_LCD_RDX : in std_logic;
TP_U : out std_logic;
TP_D : out std_logic;
TP_L : out std_logic;
TP_R : out std_logic;
SW_SEL : in std_logic;
SW_ROT_A : in std_logic;
SW_ROT_B : in std_logic;
SW_U : in std_logic;
SW_D : in std_logic;
SW_L : in std_logic;
SW_R : in std_logic;
LCD_RESETX : out std_logic;
LCD_RS : out std_logic;
LCD_WRX : out std_logic;
LCD_RDX : out std_logic;
LCD_DB : inout std_logic_vector(15 downto 0);
LCD_TE : in std_logic;
LCD_BACKLIGHT : out std_logic;
SYSOFF : out std_logic;
AUDIO_RESETX : out std_logic;
REF_EN : out std_logic;
GPS_RESETX : out std_logic;
GPS_TX_READY : in std_logic;
GPS_TIMEPULSE : in std_logic;
DEVICE_RESET : in std_logic;
DEVICE_RESET_V : in std_logic
);
end top;
architecture rtl of top is
signal switches : std_logic_vector(7 downto 0);
type data_direction_t is (from_mcu, to_mcu);
signal data_dir : data_direction_t;
signal mcu_data_out_lcd : std_logic_vector(7 downto 0);
signal mcu_data_out_io : std_logic_vector(7 downto 0);
signal mcu_data_out : std_logic_vector(7 downto 0);
signal mcu_data_in : std_logic_vector(7 downto 0);
signal lcd_data_in : std_logic_vector(15 downto 0);
signal lcd_data_in_mux : std_logic_vector(7 downto 0);
signal lcd_data_out : std_logic_vector(15 downto 0);
signal lcd_data_in_q : std_logic_vector(7 downto 0) := (others => '0');
signal lcd_data_out_q : std_logic_vector(7 downto 0) := (others => '0');
signal tp_q : std_logic_vector(7 downto 0) := (others => '0');
signal lcd_reset_q : std_logic := '1';
signal lcd_backlight_q : std_logic := '0';
signal sysoff_q : std_logic := '0';
signal audio_reset_q : std_logic := '1';
signal ref_en_q : std_logic := '0';
signal device_reset_q : std_logic := '1';
signal dir_read : boolean;
signal dir_write : boolean;
signal lcd_read_strobe : boolean;
signal lcd_write_strobe : boolean;
signal lcd_write : boolean;
signal io_strobe : boolean;
signal io_read_strobe : boolean;
signal io_write_strobe : boolean;
signal reset_flag: boolean := false;
signal reset_sync: std_logic := '1';
signal counter: integer range 0 to 25000000 := 0; -- Adjust the count value for desired delay (e.g., 1 second with a 25 MHz clock)
constant COUNTER_MAX: integer := 25000000; -- Adjust this value to match the counter range
begin
-- I/O data
switches <= LCD_TE & not SW_ROT_B & not SW_ROT_A & not SW_SEL & not SW_U & not SW_D & not SW_L & not SW_R;
TP_U <= tp_q(3) when tp_q(7) = '1' else 'Z';
TP_D <= tp_q(2) when tp_q(6) = '1' else 'Z';
TP_L <= tp_q(1) when tp_q(5) = '1' else 'Z';
TP_R <= tp_q(0) when tp_q(4) = '1' else 'Z';
LCD_BACKLIGHT <= lcd_backlight_q;
SYSOFF <= sysoff_q;
MCU_LCD_TE <= LCD_TE;
-- State management
data_dir <= to_mcu when MCU_DIR = '1' else from_mcu;
dir_read <= (data_dir = to_mcu);
dir_write <= (data_dir = from_mcu);
io_strobe <= (MCU_IO_STBX = '0');
io_read_strobe <= io_strobe and dir_read;
lcd_read_strobe <= (MCU_LCD_RDX = '0');
lcd_write <= not lcd_read_strobe;
-- LCD interface
LCD_RS <= MCU_ADDR;
LCD_RDX <= MCU_LCD_RDX;
LCD_WRX <= MCU_LCD_WRX;
lcd_data_out <= lcd_data_out_q & mcu_data_in;
lcd_data_in <= LCD_DB;
LCD_DB <= lcd_data_out when lcd_write else (others => 'Z');
-- Reference clock
REF_EN <= ref_en_q;
-- Peripheral reset control
LCD_RESETX <= not lcd_reset_q;
AUDIO_RESETX <= not audio_reset_q;
GPS_RESETX <= '1';
-- MCU interface
mcu_data_out_lcd <= lcd_data_in(15 downto 8) when lcd_read_strobe else lcd_data_in_q;
mcu_data_out_io <= switches;
mcu_data_out <= mcu_data_out_io when io_read_strobe else mcu_data_out_lcd;
mcu_data_in <= MCU_D;
MCU_D <= mcu_data_out when dir_read else (others => 'Z');
-- Synchronous behaviors:
-- LCD write: Capture LCD high byte on LCD_WRX falling edge.
process(MCU_LCD_WRX, mcu_data_in)
begin
if falling_edge(MCU_LCD_WRX) then
lcd_data_out_q <= mcu_data_in;
end if;
end process;
-- LCD read: Capture LCD low byte on LCD_RD falling edge.
process(MCU_LCD_RDX, lcd_data_in)
begin
if rising_edge(MCU_LCD_RDX) then
lcd_data_in_q <= lcd_data_in(7 downto 0);
end if;
end process;
-- I/O write (to resistive touch panel): Capture data from
-- MCU and hold on TP pins until further notice.
process(MCU_IO_STBX, dir_write, mcu_data_in, MCU_ADDR)
begin
if rising_edge(MCU_IO_STBX) and dir_write then
if MCU_ADDR = '0' then
tp_q <= mcu_data_in;
else
lcd_reset_q <= mcu_data_in(0);
audio_reset_q <= mcu_data_in(1);
ref_en_q <= mcu_data_in(6);
lcd_backlight_q <= mcu_data_in(7);
sysoff_q <= mcu_data_in(2);
end if;
end if;
end process;
end rtl;
+58
View File
@@ -0,0 +1,58 @@
# Project Setup Guide
## Prerequisites
- Intel Quartus Prime
- Supra-2023.02.b0-7773ca8a-win64-all
## Installation Steps
1. **Project Setup**
- Create a new AG256SL100 project in Quartus Prime
- (Alternatively, copy an existing project)
2. **Code Implementation**
- Implement your code in the project
- Compile the project to verify there are no errors
- Ensure successful compilation before proceeding
3. **Supra Configuration**
- Launch Supra.exe
- Navigate to: File → Project → Open Project
- Select the H4M project when prompted
- Select Tools → Migrate → Next
4. **Additional Setup**
- Follow the on-screen prompts
- You will need to:
- Open a second Quartus project
- Execute a provided script
5. **Programming**
- In Supra, go to: Tools → Program
- Click "Query device ID"
- Verify the returned ID is: 0x00025610
6. **File Selection**
- Select the programming file (if not automatically loaded)
- Use the .prg file from the Supra src folder (non-SRAM version)
7. **Programming Process**
- Click "Program" to begin
- Note: The counter shows elapsed seconds, not progress percentage
- Programming is complete when "USB driver disconnected" message appears
## Troubleshooting
If you encounter any issues, ensure:
- All prerequisites are properly installed
- Project configurations are correct
- Device connections are secure
@@ -0,0 +1,62 @@
[GuiMigrateSetupPage]
fromDir=../AG256SL100
design=portapack_h4m_cpld
device=AG256SL100
veFile=
ipFiles=
backwardCompatible=false
modeGroup=false
modeQuartus=true
modeSynplicity=false
modeNative=false
[GuiMigrateRunPage]
isMC=false
count=
jobs=
seed=
retry=0
fitting=0
fitter=0
effort=0
holdx=0
skew=0
skope=0
preset=0
adjust=0
target=0
tuning=0
corner=0
flow=0
orgPlace=false
quartusSdc=false
probeForce=false
probeState=@ByteArray(\0\0\0\xff\0\0\0\0\0\0\0\x1\0\0\0\x1\0\0\0\x2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x2m\0\0\0\x2\0\x1\x1\x1\0\0\0\0\0\0\0\0\0\0\0\0\x64\0\0\0K\0\0\0\x4\0\0\0\0\0\0\0\x2\0\0\x1\xc2\0\0\0\x1\0\0\0\0\0\0\0\xab\0\0\0\x1\0\0\0\0)
probeCount=5
probe0From=
probe0Pad=
probe1From=
probe1Pad=
probe2From=
probe2Pad=
probe3From=
probe3Pad=
probe4From=
probe4Pad=
[GuiProgramScreen]
hardwareId=0
blasterSpeed=70
prgFile=portapack_h4m_cpld.prg
eraseBox=false
cable=0
runAction=program
eraseChip=true
eraseFrom=
eraseTo=
binFile=
readFrom=
readTo=
[MainWindow]
recentFile.0=
@@ -0,0 +1,114 @@
if {![info exist MODE ]} {set MODE QUARTUS}
if {![info exists QUARTUS_SDC]} {set QUARTUS_SDC true}
if {![info exists CORNER]} {set CORNER ""}
if {![info exist COUNT]} {set COUNT 6}
if {![info exist JOBS ]} {set JOBS 1}
if {![info exist SEEDS ]} {set SEEDS {0 0 0 0 666 888 }}
if {![info exist EFFORTS ]} {set EFFORTS {highest highest highest highest high high }}
if {![info exist FITTERS ]} {set FITTERS {hybrid hybrid hybrid hybrid hybrid hybrid }}
if {![info exist FITTINGS]} {set FITTINGS {timing_more timing_more timing_more timing timing basic }}
if {![info exist SKEWS ]} {set SKEWS {advanced advanced advanced advanced aggressive basic }}
if {![info exist HOLDXS ]} {set HOLDXS {default default default default default default}}
set bc_config "./bc_config.txt"
if { [file exists $bc_config] } {
alta::tcl_highlight "Using MC config $bc_config.\n"
source "$bc_config"
}
#######################################################################
proc get_rand_value { values } {
if {[llength $values] == 0} { return {} }
return [lindex $values [expr {int(rand()*10000)%[llength $values]}]]
}
set results "bc_results"
set summary "bc_summary.txt"
file delete -force $results; file mkdir $results
file delete $summary; print -nonewline "" >! $summary
set is_parallel [expr $JOBS > 1]
set is_color ""; set is_gui ""; set is_quiet ""
if { $is_parallel } {
set is_gui "--quiet"
} else {
if { [alta::tcl_is_color] } { set is_color "--color" }
if { [alta::tcl_is_gui ] } { set is_gui "--gui" }
}
#######################################################################
set progs {}
set titles {}
for {set id 1} {$id <= $COUNT} {incr id} {
set result_dir "$results/$id"
file mkdir $result_dir
set seed [get_rand_value $SEEDS ]
set effort [get_rand_value $EFFORTS ]
set skew [get_rand_value $SKEWS ]
set fitter [get_rand_value $FITTERS ]
set fitting [get_rand_value $FITTINGS]
set holdx [get_rand_value $HOLDXS ]
set prog [list [info nameofexec] $is_quiet $is_color $is_gui -B --batch --mode $MODE]
alta::lconcat prog [list -X "set QUARTUS_SDC $QUARTUS_SDC"]
if { $CORNER != "" } {
alta::lconcat prog [list -X "set CORNER $CORNER"]
}
alta::lconcat prog [list -X "set RESULT_DIR $result_dir"]
if { $seed != "" } {
alta::lconcat prog [list -X "set SEED $seed"]
}
if { $effort != "" } {
alta::lconcat prog [list -X "set EFFORT $effort"]
}
if { $fitter != "" } {
alta::lconcat prog [list -X "set FITTER $fitter"]
}
if { $fitting != "" } {
alta::lconcat prog [list -X "set FITTING $fitting"]
}
if { $skew != "" } {
alta::lconcat prog [list -X "set SKEW $skew"]
}
if { $holdx != "" } {
alta::lconcat prog [list -X "set HOLDX $holdx"]
}
#alta::lconcat prog [list -F af_run.tcl]
lappend progs $prog
lappend titles "#$id $result_dir"
}
#######################################################################
if { $is_parallel } {
set bg_progs {}
foreach bg_prog $progs {
lappend bg_progs [lappend bg_prog $is_quiet]
}
bg_exec_queue $titles $bg_progs $JOBS
}
#######################################################################
for {set id 1} {$id <= $COUNT} {incr id} {
set result_dir "$results/$id"
set prog [lindex $progs [expr $id-1]]
set title [lindex $titles [expr $id-1]]
if { ! $is_parallel } {
puts $title
puts $prog
eval exec -ignorestderr $prog >&@ stdout
}
print "***************************************************************************\n" >> $summary
print "$title\n" >> $summary
cat "$result_dir/alta_db/fmax.rpt" >> $summary
cat "$result_dir/alta_db/xfer.rpt" >> $summary
print "" >> $summary
}
alta::tcl_highlight "Check $summary for result.\n"
@@ -0,0 +1,50 @@
set AGM_SUPRA true
set DESIGN "portapack_h4m_cpld"
set IPLIST {alta_bram alta_bram9k alta_sram alta_wram alta_pll alta_pllx alta_pllv alta_pllve alta_boot alta_osc alta_mult alta_multm alta_ufm alta_ufms alta_ufml alta_i2c alta_spi alta_irda alta_mcu alta_mcu_m3 alta_saradc alta_adc alta_dac alta_cmp }
lappend IPLIST alta_rv32
proc set_alta_partition {inst tag} {
set full_name [get_name_info -observable_type pre_synthesis -info full_path $inst]
set inst_name [get_name_info -observable_type pre_synthesis -info short_full_path $inst]
set base_name [get_name_info -observable_type pre_synthesis -info instance_name $inst]
set section_id [string map { [ _ ] _ . _ | _} $inst_name]
eval "set_global_assignment -name PARTITION_COLOR 52377 -section_id $section_id -tag $tag"
eval "set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id $section_id -tag $tag"
eval "set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id $section_id -tag $tag"
eval "set_instance_assignment -name PARTITION_HIERARCHY $section_id -to $full_name -section_id $section_id -tag $tag"
}
load_package flow
if { $DESIGN == "" } {
set DESIGN $::quartus(args)
}
project_open $DESIGN
set tag alta_auto
if { [llength $IPLIST] > 0 } {
# A Quartus bug saves PARTITION_HIERARCHY assignments without tag. Use section_id to remove them.
set asgn_col [get_all_global_assignments -name PARTITION_NETLIST_TYPE -tag $tag]
foreach_in_collection part $asgn_col {
set section_id [lindex $part 0]
eval "remove_all_instance_assignments -name PARTITION_HIERARCHY -section_id $section_id"
}
eval "remove_all_global_assignments -name PARTITION_COLOR -tag $tag"
eval "remove_all_global_assignments -name PARTITION_NETLIST_TYPE -tag $tag"
eval "remove_all_global_assignments -name PARTITION_FITTER_PRESERVATION_LEVEL -tag $tag"
catch { execute_module -tool map }
foreach ip $IPLIST {
foreach_in_collection inst [get_names -node_type hierarchy -observable_type pre_synthesis -filter "$ip:*"] {
set_alta_partition $inst $tag
}
foreach_in_collection inst [get_names -node_type hierarchy -observable_type pre_synthesis -filter "*|$ip:*"] {
set_alta_partition $inst $tag
}
}
}
eval "set_global_assignment -name EDA_MAINTAIN_DESIGN_HIERARCHY PARTITION_ONLY -section_id eda_simulation"
project_close
exit
@@ -0,0 +1,79 @@
map -import
if { [info exists DESIGN] && ! [info exists TOP_MODULE] } {
set TOP_MODULE "$DESIGN"
}
if { ! [info exists DESIGN] } {
set DESIGN "portapack_h4m_cpld"
}
if { ! [info exists TOP_MODULE] } {
set TOP_MODULE "top"
}
set verilogs { }
if { [ llength $verilogs ] == 0 } {
set verilogs "A:/Users/jLynx/Documents/Code/C/portapack-mayhem/hardware/portapack_h4m/CPLD/AG256SL100/${DESIGN}.v"
}
foreach verilog $verilogs {
read_verilog "$verilog"
}
read_verilog -sv -lib +/agm/rodina/cells_sim.v
read_verilog -sv -lib +/agm/common/m9k_bb.v
read_verilog -sv -lib +/agm/common/altpll_bb.v
hierarchy -check -top ${TOP_MODULE}
synth -run coarse -top ${DESIGN}
map proc
opt_expr
opt_clean
check
opt
wreduce
alumacc
share
opt
fsm
opt -fast
memory -nomap
opt_clean
memory_bram -rules +/agm/common/brams.txt
techmap -map +/agm/common/brams_map.v
opt -fast -mux_undef -undriven -fine -full
memory_map
opt -undriven -fine
techmap -autoproc -map +/techmap.v -map +/agm/rodina/arith_map.v
dffsr2dff
dff2dffe -direct-match \$_DFF_*
opt -full
techmap -map +/agm/rodina/cells_map.v
agm_dffeas
opt -full
clean -purge
setundef -undriven -zero
abc -markgroups -dff
opt_expr -mux_undef -undriven -full
opt_merge
opt_rmdff
opt_clean
abc -lut 4
clean
techmap -map +/agm/rodina/cells_map.v
dffinit -ff dffeas Q INIT
clean -purge
hierarchy -check
check -noinit
write_verilog -bitblasted -attr2comment -defparam -decimal -renameprefix syn_ ${DESIGN}.vqm
# exec sed -i "/\\\\\\\$paramod/s/\[$=\\]/_/g" ${DESIGN}.vqm
@@ -0,0 +1,50 @@
set AGM_SUPRA true
set RETRY 0
set DESIGN "portapack_h4m_cpld"
if { [is_project_open] } {
export_assignments
}
set is_compatible false
if { $is_compatible } {
cd A:/Users/jLynx/Documents/Code/C/portapack-mayhem/hardware/portapack_h4m/CPLD/AG256SL100
qexec "[file join $::quartus(binpath) quartus_eda] $DESIGN --simulation --tool=modelsim --format=verilog"
} else {
set FITTER_EFFORTS {"STANDARD FIT" "STANDARD FIT" "FAST FIT" "FAST FIT" "FAST FIT"}
set SEEDS [list [expr int(rand()*100)] \
[expr int(rand()*100)] \
[expr int(rand()*100)] \
[expr int(rand()*100)] \
[expr int(rand()*100)]]
set PLACEMENT_EFFORTS [list [expr rand()*5+0.1] \
[expr rand()*5+0.1] \
[expr rand()*5+0.1] \
[expr rand()*5+0.1] \
[expr rand()*5+0.1]]
set ROUTER_EFFORTS [list [expr rand()*5+0.25] \
[expr rand()*5+0.25] \
[expr rand()*5+0.25] \
[expr rand()*5+0.25] \
[expr rand()*5+0.25]]
qexec "[file join $::quartus(binpath) quartus_sh] -t af_ip.tcl"
load_package flow
project_open $DESIGN
set RETRY [expr $RETRY<[llength $FITTER_EFFORTS]?$RETRY:[llength $FITTER_EFFORTS]]
for {set nn -1} {$nn < $RETRY} {incr nn} {
if {$nn >= 0} {
set_global_assignment -name FITTER_EFFORT \"[lindex $FITTER_EFFORTS $nn]\"
set_global_assignment -name SEED [lindex $SEEDS $nn]
set_global_assignment -name PLACEMENT_EFFORT_MULTIPLIER [lindex $PLACEMENT_EFFORTS $nn]
set_global_assignment -name ROUTER_EFFORT_MULTIPLIER [lindex $ROUTER_EFFORTS $nn]
}
set code [catch {execute_flow -compile} msg]
if { $code == 0 } { break }
}
}
@@ -0,0 +1,340 @@
set ALTA_SUPRA true
set sh_continue_on_error false
set sh_echo_on_source true
set sh_quiet_on_source true
set cc_critical_as_fatal true
set rt_incremental_route true
set ta_report_auto 1
set ta_report_auto_constraints $ta_report_auto
if { ! [info exists RESULT_DIR] } {
set RESULT_DIR "."
} elseif { ! [info exists alta_work] } {
set alta_work "${RESULT_DIR}/alta_db"
}
if { ! [info exists DEVICE] } {
set DEVICE "AG256SL100"
}
if { [info exists DESIGN] && ! [info exists TOP_MODULE] } {
set TOP_MODULE "$DESIGN"
}
if { ! [info exists DESIGN] } {
set DESIGN "portapack_h4m_cpld"
}
if { ! [info exists TOP_MODULE] } {
set TOP_MODULE "top"
}
if { ! [info exists IP_FILES] } {
set IP_FILES {}
}
if { ! [info exists VE_FILE] } {
set VE_FILE ""
}
if { ! [info exists TIMING_DERATE] } {
set TIMING_DERATE {1.000000 1.000000}
}
if { [info exists NO_ROUTE] && $NO_ROUTE } {
set no_route "-no_route"
} else {
set no_route ""
}
if { ! [info exists RETRY] } { set RETRY 0 }
if { ! [info exists SEED ] } { set SEED 666 }
set seed_rand ""
if { $SEED == 0 } { set seed_rand "-seed_rand" }
if { [info exists QUARTUS_SDC] } {
set sdc_remove_quartus_column_name $QUARTUS_SDC
}
if { ! [info exists ORG_PLACE] } { set ORG_PLACE false }
if { ! [info exists MODE] } { set MODE "QUARTUS" }
if { ! [info exists FLOW] } { set FLOW "ALL" }
if { $FLOW == "PROBE" } {
if { ! [info exists PROBE_FORCE] } { set PROBE_FORCE false }
if { ! [info exists PREFIX] } { set PREFIX "probe_" }
}
if { ! [info exists PREFIX] } {
set RESULT $DESIGN
} else {
set RESULT $PREFIX$DESIGN
}
if { $FLOW == "GEN" || $FLOW == "PACK" || $FLOW == "LOAD" } { set no_route "-no_route" }
set RUN "run"
if { $FLOW == "CHECK" } {
set RUN "check"
} elseif { $FLOW == "PROBE" } {
set RUN "probe"
} elseif { $FLOW == "GEN" } {
set RUN "gen"
}
if { ! [info exists alta_logs] } {
set alta_logs "${RESULT_DIR}/alta_logs"
}
file mkdir $alta_logs
alta::begin_log_cmd "$alta_logs/${RUN}.log" "$alta_logs/${RUN}.err"
alta::tcl_whisper "Cmd : [alta::prog_path] [alta::prog_version]([alta::prog_subversion])\n"
alta::tcl_whisper "Args : [string map {\{ \" \} \"} $tcl_cmd_args]\n"
set_seed_rand $SEED
set ar_timing_derate ${TIMING_DERATE}
date_time
if { [file exists "./${DESIGN}.pre.asf"] } {
alta::tcl_highlight "Using pre-ASF file ${DESIGN}.pre.asf.\n"
source "./${DESIGN}.pre.asf"
}
set LOAD_DB false
set LOAD_PLACE false
set LOAD_ROUTE false
if { $FLOW == "LOAD" || $FLOW == "CHECK" || $FLOW == "PROBE" } {
set LOAD_DB true
set LOAD_PLACE true
set LOAD_ROUTE true
} elseif { $FLOW == "R" || $FLOW == "ROUTE" } {
set LOAD_DB true
set LOAD_PLACE true
}
set ORIGINAL_QSF "A:/Users/jLynx/Documents/Code/C/portapack-mayhem/hardware/portapack_h4m/CPLD/AG256SL100/./portapack_h4m_cpld.qsf"
set ORIGINAL_PIN "A:/Users/jLynx/Documents/Code/C/portapack-mayhem/hardware/portapack_h4m/CPLD/AG256SL100/output_files/portapack_h4m_cpld.pin"
#################################################################################
while (1) {
if { [info exists CORNER] } { set_mode -corner $CORNER; }
eval "load_architect ${no_route} -type ${DEVICE} 1 1 1000 1000"
foreach ip_file $IP_FILES { read_ip $ip_file; }
if { $FLOW == "GEN" } {
if { ! [info exists CONFIG_BITS] } {
set CONFIG_BITS "${RESULT_DIR}/${DESIGN}.bin"
}
if { [llength $CONFIG_BITS] > 1 } {
if { ! [info exists BOOT_BINARY] } {
set BOOT_BINARY "${RESULT_DIR}/${DESIGN}_boot.bin"
}
if { ! [info exists CONFIG_ADDRESSES] } {
set CONFIG_ADDRESSES ""
}
generate_binary -master $BOOT_BINARY -inputs $CONFIG_BITS -address $CONFIG_ADDRESSES
} else {
set CONFIG_ROOT [file rootname [lindex $CONFIG_BITS 0]]
set SLAVE_RBF "${CONFIG_ROOT}_slave.rbf"
set MASTER_BINARY "${CONFIG_ROOT}_master.bin"
if { [file exists [lindex $CONFIG_BITS 0]] } {
generate_binary -slave $SLAVE_RBF -inputs [lindex $CONFIG_BITS 0] -reverse
generate_binary -master $MASTER_BINARY -inputs [lindex $CONFIG_BITS 0]
}
if { ! [info exists BOOT_BINARY] } {
set BOOT_BINARY $MASTER_BINARY
}
}
set PRG_FILE [file rootname $BOOT_BINARY].prg
set AS_FILE [file rootname $BOOT_BINARY]_as.prg
generate_programming_file $BOOT_BINARY -erase $ERASE \
-program $PROGRAM -verify $VERIFY -offset $OFFSET \
-prg $PRG_FILE -as $AS_FILE
break
}
if { $LOAD_DB } {
load_db -top ${TOP_MODULE}
set sdc "./${DESIGN}.adc"
if { ! [file exists $sdc] } { set sdc "./${DESIGN}.sdc"; }
if { [file exists $sdc] } { read_sdc $sdc; }
} elseif { $MODE == "QUARTUS" } {
set verilog ${DESIGN}.vo
set is_migrated false
if { ! [file exists $verilog] } {
set verilog "./simulation/modelsim/${DESIGN}.vo"
set is_migrated true
}
if { ! [file exists $verilog] } {
error "Can not find design verilog file $verilog"
}
alta::tcl_highlight "Using design verilog file $verilog.\n"
set ret [read_design -top ${TOP_MODULE} -ve $VE_FILE -qsf $ORIGINAL_QSF $verilog -hierachy 1]
if { !$ret } { exit -1; }
set sdc "./${DESIGN}.adc"
if { ! [file exists $sdc] } { set sdc "./${DESIGN}.sdc"; }
if { ! [file exists $sdc] } {
alta::tcl_warn "Can not find design SDC file $sdc"
} else {
alta::tcl_highlight "Using design SDC file $sdc.\n"
read_sdc $sdc
}
} elseif { $MODE == "SYNPLICITY" || $MODE == "NATIVE" } {
set db_gclk_assignment_level 2
set verilog ${DESIGN}.vqm
set is_migrated false
if { ! [file exists $verilog] } {
error "Can not find design verilog file $verilog"
}
set sdc "./${DESIGN}.adc"
if { ! [file exists $sdc] } { set sdc "./${DESIGN}.sdc"; }
alta::tcl_highlight "Using design verilog file $verilog.\n"
if { ! [file exists $sdc] } {
alta::tcl_warn "Can not find design SDC file $sdc"
set ret [read_design_and_pack -sdc $sdc -top ${TOP_MODULE} $verilog]
} else {
alta::tcl_highlight "Using design SDC file $sdc.\n"
set ret [read_design_and_pack -top ${TOP_MODULE} $verilog]
}
if { !$ret } { exit -1; }
} else {
error "Unsupported mode $MODE"
}
if { $FLOW == "PACK" } { break }
if { [info exists FITTING] } {
if { $FITTING == "Auto" } { set FITTING auto; }
set_mode -fitting $FITTING
}
if { [info exists FITTER] } {
if { $FITTER == "Auto" } {
if { $MODE == "QUARTUS" } { set FITTER hybrid; } else { set FITTER full; }
}
if { $MODE == "SYNPLICITY" || $MODE == "NATIVE" } { set FITTER full; }
set_mode -fitter $FITTER
}
if { [info exists EFFORT] } { set_mode -effort $EFFORT; }
if { [info exists SKEW ] } { set_mode -skew $SKEW ; }
if { [info exists SKOPE ] } { set_mode -skope $SKOPE ; }
if { [info exists HOLDX ] } { set_mode -holdx $HOLDX; }
if { [info exists TUNING] } { set_mode -tuning $TUNING; }
if { [info exists TARGET] } { set_mode -target $TARGET; }
if { [info exists PRESET] } { set_mode -preset $PRESET; }
if { [info exists ADJUST] } { set pl_criticality_wadjust $ADJUST; }
set alta_aqf $::alta_work/alta.aqf
if { $LOAD_DB } {
# Empty
} elseif { true } {
if { [file exists $VE_FILE] } {
set ORIGINAL_PIN ""
} elseif { ! [file exists $ORIGINAL_PIN] } {
if { $is_migrated } {
error "Can not find design PIN file $ORIGINAL_PIN, please compile design first"
}
set ORIGINAL_PIN ""
}
if { [file exists $ORIGINAL_QSF] } {
alta::convert_quartus_settings_cmd $ORIGINAL_QSF $ORIGINAL_PIN $alta_aqf
} elseif { $is_migrated } {
error "Can not find design exported QSF file $ORIGINAL_QSF, please export assigments first"
}
}
if { [file exists "$alta_aqf"] } {
alta::tcl_highlight "Using AQF file $alta_aqf.\n"
source "$alta_aqf"
}
if { [file exists "./${DESIGN}.asf"] } {
alta::tcl_highlight "Using ASF file ${DESIGN}.asf.\n"
source "./${DESIGN}.asf"
}
if { $FLOW == "PROBE" } {
set ret [place_pseudo -user_io -place_io -place_pll -place_gclk]
if { !$ret } { exit -1 }
set force ""
if { [info exists PROBE_FORCE] && $PROBE_FORCE } { set force "-force" }
eval "probe_design -froms {${PROBE_FROMS}} -tos {${PROBE_TOS}} ${force}"
} elseif { $FLOW == "CHECK" } {
set ret [place_pseudo -user_io -place_io -place_pll -place_gclk]
if { !$ret } { exit -1 }
if { [file exists "./${DESIGN}.chk"] } {
alta::tcl_highlight "Using CHK file ${DESIGN}.chk.\n"
source "./${DESIGN}.chk"
place_design -dry
check_design -rule led_guide
} else {
error "Can not find design CHECK file ${DESIGN}.chk"
}
} else {
set ret [place_pseudo -user_io -place_io -place_pll -place_gclk -warn_io]
if { !$ret } { exit -1 }
set org_place ""
set load_place ""
set load_route ""
set quiet ""
if { $ORG_PLACE } { set org_place "-org_place" ; }
if { $LOAD_PLACE } { set load_place "-load_place"; }
if { $LOAD_ROUTE } { set load_route "-load_route"; }
eval "place_and_route_design $org_place $load_place $load_route \
-retry $RETRY $seed_rand $quiet"
}
date_time
if { $FLOW != "CHECK" } {
if { $FLOW != "PROBE" } {
#report_timing -verbose 1 -file $::alta_work/timing.rpt.gz
report_timing -verbose 2 -setup -file $::alta_work/setup.rpt.gz
report_timing -verbose 2 -setup -brief -file $::alta_work/setup_summary.rpt.gz
report_timing -verbose 2 -hold -file $::alta_work/hold.rpt.gz
report_timing -verbose 2 -hold -brief -file $::alta_work/hold_summary.rpt.gz
set ta_report_auto_constraints 0
report_timing -fmax -file $::alta_work/fmax.rpt
report_timing -xfer -file $::alta_work/xfer.rpt
set ta_report_auto_constraints $ta_report_auto
#set ta_coverage_limit "0.95 0.90"
set ta_dump_uncovered 1
report_timing -verbose 1 -coverage >! $::alta_work/coverage.rpt.gz
#unset ta_coverage_limit
unset ta_dump_uncovered
if { ! [info exists rt_report_timing_fast] } {
set rt_report_timing_fast false
}
if { $rt_report_timing_fast } {
set_timing_corner fast
route_delay -quiet
report_timing -verbose 2 -setup -file $::alta_work/setup_fast.rpt.gz
report_timing -verbose 2 -setup -brief -file $::alta_work/setup_fast_summary.rpt.gz
report_timing -verbose 2 -hold -file $::alta_work/hold_fast.rpt.gz
report_timing -verbose 2 -hold -brief -file $::alta_work/hold_fast_summary.rpt.gz
set ta_report_auto_constraints 0
report_timing -fmax -file $::alta_work/fmax_fast.rpt
report_timing -xfer -file $::alta_work/xfer_fast.rpt
set ta_report_auto_constraints $ta_report_auto
}
write_routed_design "${RESULT_DIR}/${RESULT}_routed.v"
}
bitgen normal -prg "${RESULT_DIR}/${RESULT}.prg" -bin "${RESULT_DIR}/${RESULT}.bin"
bitgen sram -prg "${RESULT_DIR}/${RESULT}_sram.prg"
bitgen download -bin "${RESULT_DIR}/${RESULT}.bin" -svf "${RESULT_DIR}/${RESULT}_download.svf"
generate_binary -slave "${RESULT_DIR}/${RESULT}_slave.rbf" \
-inputs "${RESULT_DIR}/${RESULT}.bin" -reverse
generate_binary -master "${RESULT_DIR}/${RESULT}_master.bin" \
-inputs "${RESULT_DIR}/${RESULT}.bin"
generate_programming_file "${RESULT_DIR}/${RESULT}_master.bin" -prg "${RESULT_DIR}/${RESULT}_master.prg" \
-as "${RESULT_DIR}/${RESULT}_master_as.prg" -hybrid "${RESULT_DIR}/${RESULT}_hybrid.prg"
}
break
}
if { [file exists "./${DESIGN}.post.asf"] } {
alta::tcl_highlight "Using post-ASF file ${DESIGN}.post.asf.\n"
source "./${DESIGN}.post.asf"
}
date_time
exit
@@ -0,0 +1,266 @@
set_global_assignment -name DEVICE_IO_STANDARD "3.3-V LVCMOS"
set_global_assignment -name RESERVE_ALL_UNUSED_PINS "AS INPUT TRI-STATED WITH BUS-HOLD"
set_global_assignment -name ENABLE_DEVICE_WIDE_RESET "OFF"
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to SW_D
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to SW_L
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to SW_R
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to SW_U
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to SW_ROT_B
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to SW_SEL
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to SW_ROT_A
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[15]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[14]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[13]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[12]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[11]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[10]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[9]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[8]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[7]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[6]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[5]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[4]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[3]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[2]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[1]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_DB[0]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_RDX
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_RESETX
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_RS
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_TE
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_WRX
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_ADDR
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_D[7]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_D[6]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_D[5]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_D[4]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_D[3]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_D[2]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_D[1]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_D[0]
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_DIR
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to SW_D
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to SW_L
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to SW_R
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to SW_ROT_A
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to SW_ROT_B
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to SW_SEL
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to SW_U
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to TP_D
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to TP_L
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to TP_R
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to TP_U
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to LCD_BACKLIGHT
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to AUDIO_RESETX
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_LCD_RDX
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_LCD_WRX
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_IO_STBX
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to TP_R
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to TP_D
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to TP_L
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to TP_U
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_LCD_TE
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to MCU_P2_8
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[15]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[14]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[13]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[12]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[11]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[10]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[9]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[8]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[7]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[6]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[5]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[4]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[3]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[2]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[1]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to LCD_DB[0]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_D[7]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_D[6]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_D[5]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_D[4]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_D[3]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_D[2]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_D[1]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_D[0]
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_ADDR
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_DIR
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_IO_STBX
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to MCU_LCD_RDX
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "OFF" -to MCU_LCD_WRX
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "OFF" -to MCU_P2_8
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to GPS_TIMEPULSE
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to GPS_TIMEPULSE
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to GPS_TX_READY
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "ON" -to GPS_TX_READY
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to REF_EN
set_instance_assignment -name SLOW_SLEW_RATE "ON" -to GPS_RESETX
set_instance_assignment -name WEAK_PULL_UP_RESISTOR "OFF" -to SYSOFF
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to AUDIO_RESETX
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to DEVICE_RESET
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to DEVICE_RESET_V
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to GPS_RESETX
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to GPS_TIMEPULSE
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to GPS_TX_READY
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_BACKLIGHT
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[0]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[10]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[11]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[12]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[13]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[14]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[15]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[1]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[2]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[3]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[4]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[5]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[6]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[7]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[8]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_DB[9]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_RDX
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_RESETX
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_RS
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_TE
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to LCD_WRX
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_ADDR
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_DIR
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[0]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[1]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[2]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[3]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[4]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[5]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[6]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_D[7]
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_IO_STBX
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_LCD_RDX
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_LCD_TE
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_LCD_WRX
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to MCU_P2_8
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to REF_EN
set_instance_assignment -name IO_STANDARD "3.3V Schmitt Trigger Input" -to SW_D
set_instance_assignment -name IO_STANDARD "3.3V Schmitt Trigger Input" -to SW_L
set_instance_assignment -name IO_STANDARD "3.3V Schmitt Trigger Input" -to SW_R
set_instance_assignment -name IO_STANDARD "3.3V Schmitt Trigger Input" -to SW_ROT_A
set_instance_assignment -name IO_STANDARD "3.3V Schmitt Trigger Input" -to SW_ROT_B
set_instance_assignment -name IO_STANDARD "3.3V Schmitt Trigger Input" -to SW_SEL
set_instance_assignment -name IO_STANDARD "3.3V Schmitt Trigger Input" -to SW_U
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to SYSOFF
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to TP_D
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to TP_L
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to TP_R
set_instance_assignment -name IO_STANDARD "3.3-V LVCMOS" -to TP_U
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to AUDIO_RESETX
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to GPS_RESETX
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to GPS_TIMEPULSE
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to GPS_TX_READY
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_BACKLIGHT
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[0]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[10]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[11]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[12]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[13]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[14]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[15]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[1]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[2]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[3]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[4]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[5]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[6]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[7]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[8]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_DB[9]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_RDX
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_RESETX
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_RS
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_TE
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to LCD_WRX
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_ADDR
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_DIR
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[0]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[1]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[2]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[3]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[4]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[5]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[6]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_D[7]
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_IO_STBX
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_LCD_RDX
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_LCD_TE
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_LCD_WRX
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to MCU_P2_8
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to REF_EN
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_D
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_L
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_R
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_ROT_A
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_ROT_B
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_SEL
set_instance_assignment -name CURRENT_STRENGTH_NEW "MINIMUM CURRENT" -to SW_U
set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to SYSOFF
set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to TP_D
set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to TP_L
set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to TP_R
set_instance_assignment -name CURRENT_STRENGTH_NEW "MAXIMUM CURRENT" -to TP_U
set_location_assignment PIN_57 -to AUDIO_RESETX
set_location_assignment PIN_44 -to DEVICE_RESET
set_location_assignment PIN_38 -to DEVICE_RESET_V
set_location_assignment PIN_73 -to GPS_RESETX
set_location_assignment PIN_74 -to GPS_TIMEPULSE
set_location_assignment PIN_75 -to GPS_TX_READY
set_location_assignment PIN_76 -to LCD_BACKLIGHT
set_location_assignment PIN_99 -to LCD_DB[0]
set_location_assignment PIN_87 -to LCD_DB[10]
set_location_assignment PIN_86 -to LCD_DB[11]
set_location_assignment PIN_85 -to LCD_DB[12]
set_location_assignment PIN_84 -to LCD_DB[13]
set_location_assignment PIN_83 -to LCD_DB[14]
set_location_assignment PIN_82 -to LCD_DB[15]
set_location_assignment PIN_98 -to LCD_DB[1]
set_location_assignment PIN_97 -to LCD_DB[2]
set_location_assignment PIN_96 -to LCD_DB[3]
set_location_assignment PIN_95 -to LCD_DB[4]
set_location_assignment PIN_92 -to LCD_DB[5]
set_location_assignment PIN_91 -to LCD_DB[6]
set_location_assignment PIN_90 -to LCD_DB[7]
set_location_assignment PIN_89 -to LCD_DB[8]
set_location_assignment PIN_88 -to LCD_DB[9]
set_location_assignment PIN_1 -to LCD_RDX
set_location_assignment PIN_100 -to LCD_RESETX
set_location_assignment PIN_3 -to LCD_RS
set_location_assignment PIN_4 -to LCD_TE
set_location_assignment PIN_2 -to LCD_WRX
set_location_assignment PIN_42 -to MCU_ADDR
set_location_assignment PIN_72 -to MCU_DIR
set_location_assignment PIN_35 -to MCU_D[0]
set_location_assignment PIN_36 -to MCU_D[1]
set_location_assignment PIN_33 -to MCU_D[2]
set_location_assignment PIN_30 -to MCU_D[3]
set_location_assignment PIN_28 -to MCU_D[4]
set_location_assignment PIN_29 -to MCU_D[5]
set_location_assignment PIN_27 -to MCU_D[6]
set_location_assignment PIN_26 -to MCU_D[7]
set_location_assignment PIN_41 -to MCU_IO_STBX
set_location_assignment PIN_39 -to MCU_LCD_RDX
set_location_assignment PIN_40 -to MCU_LCD_TE
set_location_assignment PIN_71 -to MCU_LCD_WRX
set_location_assignment PIN_43 -to MCU_P2_8
set_location_assignment PIN_58 -to REF_EN
set_location_assignment PIN_14 -to SW_D
set_location_assignment PIN_37 -to SW_L
set_location_assignment PIN_12 -to SW_R
set_location_assignment PIN_15 -to SW_ROT_A
set_location_assignment PIN_16 -to SW_ROT_B
set_location_assignment PIN_17 -to SW_SEL
set_location_assignment PIN_34 -to SW_U
set_location_assignment PIN_47 -to SYSOFF
set_location_assignment PIN_6 -to TP_D
set_location_assignment PIN_7 -to TP_L
set_location_assignment PIN_5 -to TP_R
set_location_assignment PIN_8 -to TP_U
@@ -0,0 +1,38 @@
set_instance_assignment -name ENABLE_OPEN_DRAIN -to TP_U~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to TP_L~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to TP_R~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to TP_D~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to MCU_D[1]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to MCU_D[2]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to MCU_D[0]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to MCU_D[6]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to MCU_D[7]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[8]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[0]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[6]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[14]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[15]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[7]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[1]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to MCU_D[5]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to MCU_D[3]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to MCU_D[4]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[2]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[9]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[10]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[13]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[5]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[3]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[4]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[11]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_DB[12]~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_RDX~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_WRX~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_RS~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to MCU_LCD_TE~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_RESETX~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to REF_EN~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to LCD_BACKLIGHT~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to SYSOFF~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to AUDIO_RESETX~output false
set_instance_assignment -name ENABLE_OPEN_DRAIN -to GPS_RESETX~output false
@@ -0,0 +1,29 @@
tp_q[3] clken_ctrl_X1_Y15_N0
tp_q[4] clken_ctrl_X1_Y15_N0
lcd_backlight_q clken_ctrl_X1_Y15_N1
tp_q[0] clken_ctrl_X1_Y15_N0
lcd_reset_q clken_ctrl_X1_Y15_N1
tp_q[1] clken_ctrl_X1_Y15_N0
audio_reset_q clken_ctrl_X1_Y15_N1
tp_q[7] clken_ctrl_X1_Y15_N0
tp_q[2] clken_ctrl_X1_Y15_N0
tp_q[5] clken_ctrl_X1_Y15_N0
ref_en_q clken_ctrl_X1_Y15_N1
sysoff_q clken_ctrl_X1_Y15_N1
tp_q[6] clken_ctrl_X1_Y15_N0
lcd_data_in_q[0] clken_ctrl_X1_Y19_N0
lcd_data_in_q[6] clken_ctrl_X1_Y19_N0
lcd_data_out_q[1] clken_ctrl_X1_Y20_N0
lcd_data_out_q[2] clken_ctrl_X1_Y20_N0
lcd_data_out_q[6] clken_ctrl_X1_Y20_N0
lcd_data_out_q[7] clken_ctrl_X1_Y20_N0
lcd_data_out_q[0] clken_ctrl_X1_Y20_N0
lcd_data_in_q[7] clken_ctrl_X1_Y21_N0
lcd_data_in_q[1] clken_ctrl_X1_Y21_N0
lcd_data_in_q[2] clken_ctrl_X1_Y24_N0
lcd_data_in_q[4] clken_ctrl_X1_Y26_N0
lcd_data_out_q[4] clken_ctrl_X1_Y26_N1
lcd_data_out_q[3] clken_ctrl_X1_Y26_N1
lcd_data_out_q[5] clken_ctrl_X1_Y26_N1
lcd_data_in_q[3] clken_ctrl_X1_Y26_N0
lcd_data_in_q[5] clken_ctrl_X1_Y26_N0
@@ -0,0 +1,859 @@
SW_L~input|datain SW_L~input|datain
SW_L~input|oe SW_L~input|oe
SW_L~input|outclk SW_L~input|outclk
SW_L~input|outclkena SW_L~input|outclkena
SW_L~input|inclk SW_L~input|inclk
SW_L~input|inclkena SW_L~input|inclkena
SW_L~input|areset SW_L~input|areset
SW_L~input|sreset SW_L~input|sreset
SW_L~input|combout SW_L~input|combout
SW_L~input|padio SW_L~input|padio
SW_R~input|datain SW_R~input|datain
SW_R~input|oe SW_R~input|oe
SW_R~input|outclk SW_R~input|outclk
SW_R~input|outclkena SW_R~input|outclkena
SW_R~input|inclk SW_R~input|inclk
SW_R~input|inclkena SW_R~input|inclkena
SW_R~input|areset SW_R~input|areset
SW_R~input|sreset SW_R~input|sreset
SW_R~input|combout SW_R~input|combout
SW_R~input|padio SW_R~input|padio
TP_U~output|datain TP_U~output|datain
TP_U~output|oe TP_U~output|oe
TP_U~output|outclk TP_U~output|outclk
TP_U~output|outclkena TP_U~output|outclkena
TP_U~output|inclk TP_U~output|inclk
TP_U~output|inclkena TP_U~output|inclkena
TP_U~output|areset TP_U~output|areset
TP_U~output|sreset TP_U~output|sreset
TP_U~output|padio TP_U~output|padio
TP_L~output|datain TP_L~output|datain
TP_L~output|oe TP_L~output|oe
TP_L~output|outclk TP_L~output|outclk
TP_L~output|outclkena TP_L~output|outclkena
TP_L~output|inclk TP_L~output|inclk
TP_L~output|inclkena TP_L~output|inclkena
TP_L~output|areset TP_L~output|areset
TP_L~output|sreset TP_L~output|sreset
TP_L~output|padio TP_L~output|padio
SW_ROT_B~input|datain SW_ROT_B~input|datain
SW_ROT_B~input|oe SW_ROT_B~input|oe
SW_ROT_B~input|outclk SW_ROT_B~input|outclk
SW_ROT_B~input|outclkena SW_ROT_B~input|outclkena
SW_ROT_B~input|inclk SW_ROT_B~input|inclk
SW_ROT_B~input|inclkena SW_ROT_B~input|inclkena
SW_ROT_B~input|areset SW_ROT_B~input|areset
SW_ROT_B~input|sreset SW_ROT_B~input|sreset
SW_ROT_B~input|combout SW_ROT_B~input|combout
SW_ROT_B~input|padio SW_ROT_B~input|padio
TP_R~output|datain TP_R~output|datain
TP_R~output|oe TP_R~output|oe
TP_R~output|outclk TP_R~output|outclk
TP_R~output|outclkena TP_R~output|outclkena
TP_R~output|inclk TP_R~output|inclk
TP_R~output|inclkena TP_R~output|inclkena
TP_R~output|areset TP_R~output|areset
TP_R~output|sreset TP_R~output|sreset
TP_R~output|padio TP_R~output|padio
TP_D~output|datain TP_D~output|datain
TP_D~output|oe TP_D~output|oe
TP_D~output|outclk TP_D~output|outclk
TP_D~output|outclkena TP_D~output|outclkena
TP_D~output|inclk TP_D~output|inclk
TP_D~output|inclkena TP_D~output|inclkena
TP_D~output|areset TP_D~output|areset
TP_D~output|sreset TP_D~output|sreset
TP_D~output|padio TP_D~output|padio
MCU_D[1]~output|datain MCU_D[1]~output|datain
MCU_D[1]~output|oe MCU_D[1]~output|oe
MCU_D[1]~output|outclk MCU_D[1]~output|outclk
MCU_D[1]~output|outclkena MCU_D[1]~output|outclkena
MCU_D[1]~output|inclk MCU_D[1]~output|inclk
MCU_D[1]~output|inclkena MCU_D[1]~output|inclkena
MCU_D[1]~output|areset MCU_D[1]~output|areset
MCU_D[1]~output|sreset MCU_D[1]~output|sreset
MCU_D[1]~output|combout MCU_D[1]~output|combout
MCU_D[1]~output|padio MCU_D[1]~output|padio
MCU_D[2]~output|datain MCU_D[2]~output|datain
MCU_D[2]~output|oe MCU_D[2]~output|oe
MCU_D[2]~output|outclk MCU_D[2]~output|outclk
MCU_D[2]~output|outclkena MCU_D[2]~output|outclkena
MCU_D[2]~output|inclk MCU_D[2]~output|inclk
MCU_D[2]~output|inclkena MCU_D[2]~output|inclkena
MCU_D[2]~output|areset MCU_D[2]~output|areset
MCU_D[2]~output|sreset MCU_D[2]~output|sreset
MCU_D[2]~output|combout MCU_D[2]~output|combout
MCU_D[2]~output|padio MCU_D[2]~output|padio
MCU_DIR~input|datain MCU_DIR~input|datain
MCU_DIR~input|oe MCU_DIR~input|oe
MCU_DIR~input|outclk MCU_DIR~input|outclk
MCU_DIR~input|outclkena MCU_DIR~input|outclkena
MCU_DIR~input|inclk MCU_DIR~input|inclk
MCU_DIR~input|inclkena MCU_DIR~input|inclkena
MCU_DIR~input|areset MCU_DIR~input|areset
MCU_DIR~input|sreset MCU_DIR~input|sreset
MCU_DIR~input|combout MCU_DIR~input|combout
MCU_DIR~input|padio MCU_DIR~input|padio
MCU_D[0]~output|datain MCU_D[0]~output|datain
MCU_D[0]~output|oe MCU_D[0]~output|oe
MCU_D[0]~output|outclk MCU_D[0]~output|outclk
MCU_D[0]~output|outclkena MCU_D[0]~output|outclkena
MCU_D[0]~output|inclk MCU_D[0]~output|inclk
MCU_D[0]~output|inclkena MCU_D[0]~output|inclkena
MCU_D[0]~output|areset MCU_D[0]~output|areset
MCU_D[0]~output|sreset MCU_D[0]~output|sreset
MCU_D[0]~output|combout MCU_D[0]~output|combout
MCU_D[0]~output|padio MCU_D[0]~output|padio
MCU_D[6]~output|datain MCU_D[6]~output|datain
MCU_D[6]~output|oe MCU_D[6]~output|oe
MCU_D[6]~output|outclk MCU_D[6]~output|outclk
MCU_D[6]~output|outclkena MCU_D[6]~output|outclkena
MCU_D[6]~output|inclk MCU_D[6]~output|inclk
MCU_D[6]~output|inclkena MCU_D[6]~output|inclkena
MCU_D[6]~output|areset MCU_D[6]~output|areset
MCU_D[6]~output|sreset MCU_D[6]~output|sreset
MCU_D[6]~output|combout MCU_D[6]~output|combout
MCU_D[6]~output|padio MCU_D[6]~output|padio
MCU_D[7]~output|datain MCU_D[7]~output|datain
MCU_D[7]~output|oe MCU_D[7]~output|oe
MCU_D[7]~output|outclk MCU_D[7]~output|outclk
MCU_D[7]~output|outclkena MCU_D[7]~output|outclkena
MCU_D[7]~output|inclk MCU_D[7]~output|inclk
MCU_D[7]~output|inclkena MCU_D[7]~output|inclkena
MCU_D[7]~output|areset MCU_D[7]~output|areset
MCU_D[7]~output|sreset MCU_D[7]~output|sreset
MCU_D[7]~output|combout MCU_D[7]~output|combout
MCU_D[7]~output|padio MCU_D[7]~output|padio
LCD_DB[8]~output|datain LCD_DB[8]~output|datain
LCD_DB[8]~output|oe LCD_DB[8]~output|oe
LCD_DB[8]~output|outclk LCD_DB[8]~output|outclk
LCD_DB[8]~output|outclkena LCD_DB[8]~output|outclkena
LCD_DB[8]~output|inclk LCD_DB[8]~output|inclk
LCD_DB[8]~output|inclkena LCD_DB[8]~output|inclkena
LCD_DB[8]~output|areset LCD_DB[8]~output|areset
LCD_DB[8]~output|sreset LCD_DB[8]~output|sreset
LCD_DB[8]~output|combout LCD_DB[8]~output|combout
LCD_DB[8]~output|padio LCD_DB[8]~output|padio
LCD_DB[0]~output|datain LCD_DB[0]~output|datain
LCD_DB[0]~output|oe LCD_DB[0]~output|oe
LCD_DB[0]~output|outclk LCD_DB[0]~output|outclk
LCD_DB[0]~output|outclkena LCD_DB[0]~output|outclkena
LCD_DB[0]~output|inclk LCD_DB[0]~output|inclk
LCD_DB[0]~output|inclkena LCD_DB[0]~output|inclkena
LCD_DB[0]~output|areset LCD_DB[0]~output|areset
LCD_DB[0]~output|sreset LCD_DB[0]~output|sreset
LCD_DB[0]~output|combout LCD_DB[0]~output|combout
LCD_DB[0]~output|padio LCD_DB[0]~output|padio
LCD_DB[6]~output|datain LCD_DB[6]~output|datain
LCD_DB[6]~output|oe LCD_DB[6]~output|oe
LCD_DB[6]~output|outclk LCD_DB[6]~output|outclk
LCD_DB[6]~output|outclkena LCD_DB[6]~output|outclkena
LCD_DB[6]~output|inclk LCD_DB[6]~output|inclk
LCD_DB[6]~output|inclkena LCD_DB[6]~output|inclkena
LCD_DB[6]~output|areset LCD_DB[6]~output|areset
LCD_DB[6]~output|sreset LCD_DB[6]~output|sreset
LCD_DB[6]~output|combout LCD_DB[6]~output|combout
LCD_DB[6]~output|padio LCD_DB[6]~output|padio
LCD_DB[14]~output|datain LCD_DB[14]~output|datain
LCD_DB[14]~output|oe LCD_DB[14]~output|oe
LCD_DB[14]~output|outclk LCD_DB[14]~output|outclk
LCD_DB[14]~output|outclkena LCD_DB[14]~output|outclkena
LCD_DB[14]~output|inclk LCD_DB[14]~output|inclk
LCD_DB[14]~output|inclkena LCD_DB[14]~output|inclkena
LCD_DB[14]~output|areset LCD_DB[14]~output|areset
LCD_DB[14]~output|sreset LCD_DB[14]~output|sreset
LCD_DB[14]~output|combout LCD_DB[14]~output|combout
LCD_DB[14]~output|padio LCD_DB[14]~output|padio
LCD_DB[15]~output|datain LCD_DB[15]~output|datain
LCD_DB[15]~output|oe LCD_DB[15]~output|oe
LCD_DB[15]~output|outclk LCD_DB[15]~output|outclk
LCD_DB[15]~output|outclkena LCD_DB[15]~output|outclkena
LCD_DB[15]~output|inclk LCD_DB[15]~output|inclk
LCD_DB[15]~output|inclkena LCD_DB[15]~output|inclkena
LCD_DB[15]~output|areset LCD_DB[15]~output|areset
LCD_DB[15]~output|sreset LCD_DB[15]~output|sreset
LCD_DB[15]~output|combout LCD_DB[15]~output|combout
LCD_DB[15]~output|padio LCD_DB[15]~output|padio
LCD_DB[7]~output|datain LCD_DB[7]~output|datain
LCD_DB[7]~output|oe LCD_DB[7]~output|oe
LCD_DB[7]~output|outclk LCD_DB[7]~output|outclk
LCD_DB[7]~output|outclkena LCD_DB[7]~output|outclkena
LCD_DB[7]~output|inclk LCD_DB[7]~output|inclk
LCD_DB[7]~output|inclkena LCD_DB[7]~output|inclkena
LCD_DB[7]~output|areset LCD_DB[7]~output|areset
LCD_DB[7]~output|sreset LCD_DB[7]~output|sreset
LCD_DB[7]~output|combout LCD_DB[7]~output|combout
LCD_DB[7]~output|padio LCD_DB[7]~output|padio
LCD_DB[1]~output|datain LCD_DB[1]~output|datain
LCD_DB[1]~output|oe LCD_DB[1]~output|oe
LCD_DB[1]~output|outclk LCD_DB[1]~output|outclk
LCD_DB[1]~output|outclkena LCD_DB[1]~output|outclkena
LCD_DB[1]~output|inclk LCD_DB[1]~output|inclk
LCD_DB[1]~output|inclkena LCD_DB[1]~output|inclkena
LCD_DB[1]~output|areset LCD_DB[1]~output|areset
LCD_DB[1]~output|sreset LCD_DB[1]~output|sreset
LCD_DB[1]~output|combout LCD_DB[1]~output|combout
LCD_DB[1]~output|padio LCD_DB[1]~output|padio
MCU_D[5]~output|datain MCU_D[5]~output|datain
MCU_D[5]~output|oe MCU_D[5]~output|oe
MCU_D[5]~output|outclk MCU_D[5]~output|outclk
MCU_D[5]~output|outclkena MCU_D[5]~output|outclkena
MCU_D[5]~output|inclk MCU_D[5]~output|inclk
MCU_D[5]~output|inclkena MCU_D[5]~output|inclkena
MCU_D[5]~output|areset MCU_D[5]~output|areset
MCU_D[5]~output|sreset MCU_D[5]~output|sreset
MCU_D[5]~output|combout MCU_D[5]~output|combout
MCU_D[5]~output|padio MCU_D[5]~output|padio
MCU_D[3]~output|datain MCU_D[3]~output|datain
MCU_D[3]~output|oe MCU_D[3]~output|oe
MCU_D[3]~output|outclk MCU_D[3]~output|outclk
MCU_D[3]~output|outclkena MCU_D[3]~output|outclkena
MCU_D[3]~output|inclk MCU_D[3]~output|inclk
MCU_D[3]~output|inclkena MCU_D[3]~output|inclkena
MCU_D[3]~output|areset MCU_D[3]~output|areset
MCU_D[3]~output|sreset MCU_D[3]~output|sreset
MCU_D[3]~output|combout MCU_D[3]~output|combout
MCU_D[3]~output|padio MCU_D[3]~output|padio
MCU_D[4]~output|datain MCU_D[4]~output|datain
MCU_D[4]~output|oe MCU_D[4]~output|oe
MCU_D[4]~output|outclk MCU_D[4]~output|outclk
MCU_D[4]~output|outclkena MCU_D[4]~output|outclkena
MCU_D[4]~output|inclk MCU_D[4]~output|inclk
MCU_D[4]~output|inclkena MCU_D[4]~output|inclkena
MCU_D[4]~output|areset MCU_D[4]~output|areset
MCU_D[4]~output|sreset MCU_D[4]~output|sreset
MCU_D[4]~output|combout MCU_D[4]~output|combout
MCU_D[4]~output|padio MCU_D[4]~output|padio
LCD_DB[2]~output|datain LCD_DB[2]~output|datain
LCD_DB[2]~output|oe LCD_DB[2]~output|oe
LCD_DB[2]~output|outclk LCD_DB[2]~output|outclk
LCD_DB[2]~output|outclkena LCD_DB[2]~output|outclkena
LCD_DB[2]~output|inclk LCD_DB[2]~output|inclk
LCD_DB[2]~output|inclkena LCD_DB[2]~output|inclkena
LCD_DB[2]~output|areset LCD_DB[2]~output|areset
LCD_DB[2]~output|sreset LCD_DB[2]~output|sreset
LCD_DB[2]~output|combout LCD_DB[2]~output|combout
LCD_DB[2]~output|padio LCD_DB[2]~output|padio
LCD_DB[9]~output|datain LCD_DB[9]~output|datain
LCD_DB[9]~output|oe LCD_DB[9]~output|oe
LCD_DB[9]~output|outclk LCD_DB[9]~output|outclk
LCD_DB[9]~output|outclkena LCD_DB[9]~output|outclkena
LCD_DB[9]~output|inclk LCD_DB[9]~output|inclk
LCD_DB[9]~output|inclkena LCD_DB[9]~output|inclkena
LCD_DB[9]~output|areset LCD_DB[9]~output|areset
LCD_DB[9]~output|sreset LCD_DB[9]~output|sreset
LCD_DB[9]~output|combout LCD_DB[9]~output|combout
LCD_DB[9]~output|padio LCD_DB[9]~output|padio
LCD_DB[10]~output|datain LCD_DB[10]~output|datain
LCD_DB[10]~output|oe LCD_DB[10]~output|oe
LCD_DB[10]~output|outclk LCD_DB[10]~output|outclk
LCD_DB[10]~output|outclkena LCD_DB[10]~output|outclkena
LCD_DB[10]~output|inclk LCD_DB[10]~output|inclk
LCD_DB[10]~output|inclkena LCD_DB[10]~output|inclkena
LCD_DB[10]~output|areset LCD_DB[10]~output|areset
LCD_DB[10]~output|sreset LCD_DB[10]~output|sreset
LCD_DB[10]~output|combout LCD_DB[10]~output|combout
LCD_DB[10]~output|padio LCD_DB[10]~output|padio
SW_D~input|datain SW_D~input|datain
SW_D~input|oe SW_D~input|oe
SW_D~input|outclk SW_D~input|outclk
SW_D~input|outclkena SW_D~input|outclkena
SW_D~input|inclk SW_D~input|inclk
SW_D~input|inclkena SW_D~input|inclkena
SW_D~input|areset SW_D~input|areset
SW_D~input|sreset SW_D~input|sreset
SW_D~input|combout SW_D~input|combout
SW_D~input|padio SW_D~input|padio
LCD_DB[13]~output|datain LCD_DB[13]~output|datain
LCD_DB[13]~output|oe LCD_DB[13]~output|oe
LCD_DB[13]~output|outclk LCD_DB[13]~output|outclk
LCD_DB[13]~output|outclkena LCD_DB[13]~output|outclkena
LCD_DB[13]~output|inclk LCD_DB[13]~output|inclk
LCD_DB[13]~output|inclkena LCD_DB[13]~output|inclkena
LCD_DB[13]~output|areset LCD_DB[13]~output|areset
LCD_DB[13]~output|sreset LCD_DB[13]~output|sreset
LCD_DB[13]~output|combout LCD_DB[13]~output|combout
LCD_DB[13]~output|padio LCD_DB[13]~output|padio
LCD_DB[5]~output|datain LCD_DB[5]~output|datain
LCD_DB[5]~output|oe LCD_DB[5]~output|oe
LCD_DB[5]~output|outclk LCD_DB[5]~output|outclk
LCD_DB[5]~output|outclkena LCD_DB[5]~output|outclkena
LCD_DB[5]~output|inclk LCD_DB[5]~output|inclk
LCD_DB[5]~output|inclkena LCD_DB[5]~output|inclkena
LCD_DB[5]~output|areset LCD_DB[5]~output|areset
LCD_DB[5]~output|sreset LCD_DB[5]~output|sreset
LCD_DB[5]~output|combout LCD_DB[5]~output|combout
LCD_DB[5]~output|padio LCD_DB[5]~output|padio
LCD_DB[3]~output|datain LCD_DB[3]~output|datain
LCD_DB[3]~output|oe LCD_DB[3]~output|oe
LCD_DB[3]~output|outclk LCD_DB[3]~output|outclk
LCD_DB[3]~output|outclkena LCD_DB[3]~output|outclkena
LCD_DB[3]~output|inclk LCD_DB[3]~output|inclk
LCD_DB[3]~output|inclkena LCD_DB[3]~output|inclkena
LCD_DB[3]~output|areset LCD_DB[3]~output|areset
LCD_DB[3]~output|sreset LCD_DB[3]~output|sreset
LCD_DB[3]~output|combout LCD_DB[3]~output|combout
LCD_DB[3]~output|padio LCD_DB[3]~output|padio
LCD_DB[4]~output|datain LCD_DB[4]~output|datain
LCD_DB[4]~output|oe LCD_DB[4]~output|oe
LCD_DB[4]~output|outclk LCD_DB[4]~output|outclk
LCD_DB[4]~output|outclkena LCD_DB[4]~output|outclkena
LCD_DB[4]~output|inclk LCD_DB[4]~output|inclk
LCD_DB[4]~output|inclkena LCD_DB[4]~output|inclkena
LCD_DB[4]~output|areset LCD_DB[4]~output|areset
LCD_DB[4]~output|sreset LCD_DB[4]~output|sreset
LCD_DB[4]~output|combout LCD_DB[4]~output|combout
LCD_DB[4]~output|padio LCD_DB[4]~output|padio
SW_ROT_A~input|datain SW_ROT_A~input|datain
SW_ROT_A~input|oe SW_ROT_A~input|oe
SW_ROT_A~input|outclk SW_ROT_A~input|outclk
SW_ROT_A~input|outclkena SW_ROT_A~input|outclkena
SW_ROT_A~input|inclk SW_ROT_A~input|inclk
SW_ROT_A~input|inclkena SW_ROT_A~input|inclkena
SW_ROT_A~input|areset SW_ROT_A~input|areset
SW_ROT_A~input|sreset SW_ROT_A~input|sreset
SW_ROT_A~input|combout SW_ROT_A~input|combout
SW_ROT_A~input|padio SW_ROT_A~input|padio
SW_U~input|datain SW_U~input|datain
SW_U~input|oe SW_U~input|oe
SW_U~input|outclk SW_U~input|outclk
SW_U~input|outclkena SW_U~input|outclkena
SW_U~input|inclk SW_U~input|inclk
SW_U~input|inclkena SW_U~input|inclkena
SW_U~input|areset SW_U~input|areset
SW_U~input|sreset SW_U~input|sreset
SW_U~input|combout SW_U~input|combout
SW_U~input|padio SW_U~input|padio
LCD_DB[11]~output|datain LCD_DB[11]~output|datain
LCD_DB[11]~output|oe LCD_DB[11]~output|oe
LCD_DB[11]~output|outclk LCD_DB[11]~output|outclk
LCD_DB[11]~output|outclkena LCD_DB[11]~output|outclkena
LCD_DB[11]~output|inclk LCD_DB[11]~output|inclk
LCD_DB[11]~output|inclkena LCD_DB[11]~output|inclkena
LCD_DB[11]~output|areset LCD_DB[11]~output|areset
LCD_DB[11]~output|sreset LCD_DB[11]~output|sreset
LCD_DB[11]~output|combout LCD_DB[11]~output|combout
LCD_DB[11]~output|padio LCD_DB[11]~output|padio
LCD_DB[12]~output|datain LCD_DB[12]~output|datain
LCD_DB[12]~output|oe LCD_DB[12]~output|oe
LCD_DB[12]~output|outclk LCD_DB[12]~output|outclk
LCD_DB[12]~output|outclkena LCD_DB[12]~output|outclkena
LCD_DB[12]~output|inclk LCD_DB[12]~output|inclk
LCD_DB[12]~output|inclkena LCD_DB[12]~output|inclkena
LCD_DB[12]~output|areset LCD_DB[12]~output|areset
LCD_DB[12]~output|sreset LCD_DB[12]~output|sreset
LCD_DB[12]~output|combout LCD_DB[12]~output|combout
LCD_DB[12]~output|padio LCD_DB[12]~output|padio
LCD_RDX~output|datain LCD_RDX~output|datain
LCD_RDX~output|oe LCD_RDX~output|oe
LCD_RDX~output|outclk LCD_RDX~output|outclk
LCD_RDX~output|outclkena LCD_RDX~output|outclkena
LCD_RDX~output|inclk LCD_RDX~output|inclk
LCD_RDX~output|inclkena LCD_RDX~output|inclkena
LCD_RDX~output|areset LCD_RDX~output|areset
LCD_RDX~output|sreset LCD_RDX~output|sreset
LCD_RDX~output|padio LCD_RDX~output|padio
SW_SEL~input|datain SW_SEL~input|datain
SW_SEL~input|oe SW_SEL~input|oe
SW_SEL~input|outclk SW_SEL~input|outclk
SW_SEL~input|outclkena SW_SEL~input|outclkena
SW_SEL~input|inclk SW_SEL~input|inclk
SW_SEL~input|inclkena SW_SEL~input|inclkena
SW_SEL~input|areset SW_SEL~input|areset
SW_SEL~input|sreset SW_SEL~input|sreset
SW_SEL~input|combout SW_SEL~input|combout
SW_SEL~input|padio SW_SEL~input|padio
MCU_IO_STBX~input|datain MCU_IO_STBX~input|datain
MCU_IO_STBX~input|oe MCU_IO_STBX~input|oe
MCU_IO_STBX~input|outclk MCU_IO_STBX~input|outclk
MCU_IO_STBX~input|outclkena MCU_IO_STBX~input|outclkena
MCU_IO_STBX~input|inclk MCU_IO_STBX~input|inclk
MCU_IO_STBX~input|inclkena MCU_IO_STBX~input|inclkena
MCU_IO_STBX~input|areset MCU_IO_STBX~input|areset
MCU_IO_STBX~input|sreset MCU_IO_STBX~input|sreset
MCU_IO_STBX~input|combout MCU_IO_STBX~input|combout
MCU_IO_STBX~input|padio MCU_IO_STBX~input|padio
MCU_LCD_RDX~input|datain MCU_LCD_RDX~input|datain
MCU_LCD_RDX~input|oe MCU_LCD_RDX~input|oe
MCU_LCD_RDX~input|outclk MCU_LCD_RDX~input|outclk
MCU_LCD_RDX~input|outclkena MCU_LCD_RDX~input|outclkena
MCU_LCD_RDX~input|inclk MCU_LCD_RDX~input|inclk
MCU_LCD_RDX~input|inclkena MCU_LCD_RDX~input|inclkena
MCU_LCD_RDX~input|areset MCU_LCD_RDX~input|areset
MCU_LCD_RDX~input|sreset MCU_LCD_RDX~input|sreset
MCU_LCD_RDX~input|combout MCU_LCD_RDX~input|combout
MCU_LCD_RDX~input|padio MCU_LCD_RDX~input|padio
MCU_LCD_WRX~input|datain MCU_LCD_WRX~input|datain
MCU_LCD_WRX~input|oe MCU_LCD_WRX~input|oe
MCU_LCD_WRX~input|outclk MCU_LCD_WRX~input|outclk
MCU_LCD_WRX~input|outclkena MCU_LCD_WRX~input|outclkena
MCU_LCD_WRX~input|inclk MCU_LCD_WRX~input|inclk
MCU_LCD_WRX~input|inclkena MCU_LCD_WRX~input|inclkena
MCU_LCD_WRX~input|areset MCU_LCD_WRX~input|areset
MCU_LCD_WRX~input|sreset MCU_LCD_WRX~input|sreset
MCU_LCD_WRX~input|combout MCU_LCD_WRX~input|combout
MCU_LCD_WRX~input|padio MCU_LCD_WRX~input|padio
LCD_WRX~output|datain LCD_WRX~output|datain
LCD_WRX~output|oe LCD_WRX~output|oe
LCD_WRX~output|outclk LCD_WRX~output|outclk
LCD_WRX~output|outclkena LCD_WRX~output|outclkena
LCD_WRX~output|inclk LCD_WRX~output|inclk
LCD_WRX~output|inclkena LCD_WRX~output|inclkena
LCD_WRX~output|areset LCD_WRX~output|areset
LCD_WRX~output|sreset LCD_WRX~output|sreset
LCD_WRX~output|padio LCD_WRX~output|padio
LCD_RS~output|datain LCD_RS~output|datain
LCD_RS~output|oe LCD_RS~output|oe
LCD_RS~output|outclk LCD_RS~output|outclk
LCD_RS~output|outclkena LCD_RS~output|outclkena
LCD_RS~output|inclk LCD_RS~output|inclk
LCD_RS~output|inclkena LCD_RS~output|inclkena
LCD_RS~output|areset LCD_RS~output|areset
LCD_RS~output|sreset LCD_RS~output|sreset
LCD_RS~output|padio LCD_RS~output|padio
MCU_ADDR~input|datain MCU_ADDR~input|datain
MCU_ADDR~input|oe MCU_ADDR~input|oe
MCU_ADDR~input|outclk MCU_ADDR~input|outclk
MCU_ADDR~input|outclkena MCU_ADDR~input|outclkena
MCU_ADDR~input|inclk MCU_ADDR~input|inclk
MCU_ADDR~input|inclkena MCU_ADDR~input|inclkena
MCU_ADDR~input|areset MCU_ADDR~input|areset
MCU_ADDR~input|sreset MCU_ADDR~input|sreset
MCU_ADDR~input|combout MCU_ADDR~input|combout
MCU_ADDR~input|padio MCU_ADDR~input|padio
MCU_LCD_TE~output|datain MCU_LCD_TE~output|datain
MCU_LCD_TE~output|oe MCU_LCD_TE~output|oe
MCU_LCD_TE~output|outclk MCU_LCD_TE~output|outclk
MCU_LCD_TE~output|outclkena MCU_LCD_TE~output|outclkena
MCU_LCD_TE~output|inclk MCU_LCD_TE~output|inclk
MCU_LCD_TE~output|inclkena MCU_LCD_TE~output|inclkena
MCU_LCD_TE~output|areset MCU_LCD_TE~output|areset
MCU_LCD_TE~output|sreset MCU_LCD_TE~output|sreset
MCU_LCD_TE~output|padio MCU_LCD_TE~output|padio
LCD_TE~input|datain LCD_TE~input|datain
LCD_TE~input|oe LCD_TE~input|oe
LCD_TE~input|outclk LCD_TE~input|outclk
LCD_TE~input|outclkena LCD_TE~input|outclkena
LCD_TE~input|inclk LCD_TE~input|inclk
LCD_TE~input|inclkena LCD_TE~input|inclkena
LCD_TE~input|areset LCD_TE~input|areset
LCD_TE~input|sreset LCD_TE~input|sreset
LCD_TE~input|combout LCD_TE~input|combout
LCD_TE~input|padio LCD_TE~input|padio
LCD_RESETX~output|datain LCD_RESETX~output|datain
LCD_RESETX~output|oe LCD_RESETX~output|oe
LCD_RESETX~output|outclk LCD_RESETX~output|outclk
LCD_RESETX~output|outclkena LCD_RESETX~output|outclkena
LCD_RESETX~output|inclk LCD_RESETX~output|inclk
LCD_RESETX~output|inclkena LCD_RESETX~output|inclkena
LCD_RESETX~output|areset LCD_RESETX~output|areset
LCD_RESETX~output|sreset LCD_RESETX~output|sreset
LCD_RESETX~output|padio LCD_RESETX~output|padio
REF_EN~output|datain REF_EN~output|datain
REF_EN~output|oe REF_EN~output|oe
REF_EN~output|outclk REF_EN~output|outclk
REF_EN~output|outclkena REF_EN~output|outclkena
REF_EN~output|inclk REF_EN~output|inclk
REF_EN~output|inclkena REF_EN~output|inclkena
REF_EN~output|areset REF_EN~output|areset
REF_EN~output|sreset REF_EN~output|sreset
REF_EN~output|padio REF_EN~output|padio
LCD_BACKLIGHT~output|datain LCD_BACKLIGHT~output|datain
LCD_BACKLIGHT~output|oe LCD_BACKLIGHT~output|oe
LCD_BACKLIGHT~output|outclk LCD_BACKLIGHT~output|outclk
LCD_BACKLIGHT~output|outclkena LCD_BACKLIGHT~output|outclkena
LCD_BACKLIGHT~output|inclk LCD_BACKLIGHT~output|inclk
LCD_BACKLIGHT~output|inclkena LCD_BACKLIGHT~output|inclkena
LCD_BACKLIGHT~output|areset LCD_BACKLIGHT~output|areset
LCD_BACKLIGHT~output|sreset LCD_BACKLIGHT~output|sreset
LCD_BACKLIGHT~output|padio LCD_BACKLIGHT~output|padio
SYSOFF~output|datain SYSOFF~output|datain
SYSOFF~output|oe SYSOFF~output|oe
SYSOFF~output|outclk SYSOFF~output|outclk
SYSOFF~output|outclkena SYSOFF~output|outclkena
SYSOFF~output|inclk SYSOFF~output|inclk
SYSOFF~output|inclkena SYSOFF~output|inclkena
SYSOFF~output|areset SYSOFF~output|areset
SYSOFF~output|sreset SYSOFF~output|sreset
SYSOFF~output|padio SYSOFF~output|padio
AUDIO_RESETX~output|datain AUDIO_RESETX~output|datain
AUDIO_RESETX~output|oe AUDIO_RESETX~output|oe
AUDIO_RESETX~output|outclk AUDIO_RESETX~output|outclk
AUDIO_RESETX~output|outclkena AUDIO_RESETX~output|outclkena
AUDIO_RESETX~output|inclk AUDIO_RESETX~output|inclk
AUDIO_RESETX~output|inclkena AUDIO_RESETX~output|inclkena
AUDIO_RESETX~output|areset AUDIO_RESETX~output|areset
AUDIO_RESETX~output|sreset AUDIO_RESETX~output|sreset
AUDIO_RESETX~output|padio AUDIO_RESETX~output|padio
MCU_P2_8~input|datain MCU_P2_8~input|datain
MCU_P2_8~input|oe MCU_P2_8~input|oe
MCU_P2_8~input|outclk MCU_P2_8~input|outclk
MCU_P2_8~input|outclkena MCU_P2_8~input|outclkena
MCU_P2_8~input|inclk MCU_P2_8~input|inclk
MCU_P2_8~input|inclkena MCU_P2_8~input|inclkena
MCU_P2_8~input|areset MCU_P2_8~input|areset
MCU_P2_8~input|sreset MCU_P2_8~input|sreset
MCU_P2_8~input|combout MCU_P2_8~input|combout
MCU_P2_8~input|padio MCU_P2_8~input|padio
GPS_TX_READY~input|datain GPS_TX_READY~input|datain
GPS_TX_READY~input|oe GPS_TX_READY~input|oe
GPS_TX_READY~input|outclk GPS_TX_READY~input|outclk
GPS_TX_READY~input|outclkena GPS_TX_READY~input|outclkena
GPS_TX_READY~input|inclk GPS_TX_READY~input|inclk
GPS_TX_READY~input|inclkena GPS_TX_READY~input|inclkena
GPS_TX_READY~input|areset GPS_TX_READY~input|areset
GPS_TX_READY~input|sreset GPS_TX_READY~input|sreset
GPS_TX_READY~input|combout GPS_TX_READY~input|combout
GPS_TX_READY~input|padio GPS_TX_READY~input|padio
DEVICE_RESET~input|datain DEVICE_RESET~input|datain
DEVICE_RESET~input|oe DEVICE_RESET~input|oe
DEVICE_RESET~input|outclk DEVICE_RESET~input|outclk
DEVICE_RESET~input|outclkena DEVICE_RESET~input|outclkena
DEVICE_RESET~input|inclk DEVICE_RESET~input|inclk
DEVICE_RESET~input|inclkena DEVICE_RESET~input|inclkena
DEVICE_RESET~input|areset DEVICE_RESET~input|areset
DEVICE_RESET~input|sreset DEVICE_RESET~input|sreset
DEVICE_RESET~input|combout DEVICE_RESET~input|combout
DEVICE_RESET~input|padio DEVICE_RESET~input|padio
GPS_TIMEPULSE~input|datain GPS_TIMEPULSE~input|datain
GPS_TIMEPULSE~input|oe GPS_TIMEPULSE~input|oe
GPS_TIMEPULSE~input|outclk GPS_TIMEPULSE~input|outclk
GPS_TIMEPULSE~input|outclkena GPS_TIMEPULSE~input|outclkena
GPS_TIMEPULSE~input|inclk GPS_TIMEPULSE~input|inclk
GPS_TIMEPULSE~input|inclkena GPS_TIMEPULSE~input|inclkena
GPS_TIMEPULSE~input|areset GPS_TIMEPULSE~input|areset
GPS_TIMEPULSE~input|sreset GPS_TIMEPULSE~input|sreset
GPS_TIMEPULSE~input|combout GPS_TIMEPULSE~input|combout
GPS_TIMEPULSE~input|padio GPS_TIMEPULSE~input|padio
DEVICE_RESET_V~input|datain DEVICE_RESET_V~input|datain
DEVICE_RESET_V~input|oe DEVICE_RESET_V~input|oe
DEVICE_RESET_V~input|outclk DEVICE_RESET_V~input|outclk
DEVICE_RESET_V~input|outclkena DEVICE_RESET_V~input|outclkena
DEVICE_RESET_V~input|inclk DEVICE_RESET_V~input|inclk
DEVICE_RESET_V~input|inclkena DEVICE_RESET_V~input|inclkena
DEVICE_RESET_V~input|areset DEVICE_RESET_V~input|areset
DEVICE_RESET_V~input|sreset DEVICE_RESET_V~input|sreset
DEVICE_RESET_V~input|combout DEVICE_RESET_V~input|combout
DEVICE_RESET_V~input|padio DEVICE_RESET_V~input|padio
GPS_RESETX~output|datain GPS_RESETX~output|datain
GPS_RESETX~output|oe GPS_RESETX~output|oe
GPS_RESETX~output|outclk GPS_RESETX~output|outclk
GPS_RESETX~output|outclkena GPS_RESETX~output|outclkena
GPS_RESETX~output|inclk GPS_RESETX~output|inclk
GPS_RESETX~output|inclkena GPS_RESETX~output|inclkena
GPS_RESETX~output|areset GPS_RESETX~output|areset
GPS_RESETX~output|sreset GPS_RESETX~output|sreset
GPS_RESETX~output|padio GPS_RESETX~output|padio
lcd_reset_q~0|dataa lcd_reset_q~0|A
lcd_reset_q~0|datab lcd_reset_q~0|B
lcd_reset_q~0|datac lcd_reset_q~0|C
lcd_reset_q~0|datad lcd_reset_q~0|D
lcd_reset_q~0|combout lcd_reset_q~0|LutOut
|datac tp_q[3]|C
tp_q[3]|clk tp_q[3]|Clk
tp_q[3]|clrn tp_q[3]|AsyncReset
tp_q[3]|sclr tp_q[3]|SyncReset
tp_q[3]|sload tp_q[3]|SyncLoad
tp_q[3]|q tp_q[3]|Q
tp_q[4]~feeder|dataa tp_q[4]|A
tp_q[4]~feeder|datab tp_q[4]|B
tp_q[4]~feeder|datac tp_q[4]|C
tp_q[4]~feeder|datad tp_q[4]|D
tp_q[4]|clk tp_q[4]|Clk
tp_q[4]|clrn tp_q[4]|AsyncReset
tp_q[4]~feeder|combout tp_q[4]|LutOut
tp_q[4]|q tp_q[4]|Q
lcd_backlight_q~feeder|dataa lcd_backlight_q|A
lcd_backlight_q~feeder|datab lcd_backlight_q|B
lcd_backlight_q~feeder|datac lcd_backlight_q|C
lcd_backlight_q~feeder|datad lcd_backlight_q|D
lcd_backlight_q|clk lcd_backlight_q|Clk
lcd_backlight_q|clrn lcd_backlight_q|AsyncReset
lcd_backlight_q~feeder|combout lcd_backlight_q|LutOut
lcd_backlight_q|q lcd_backlight_q|Q
|datac tp_q[0]|C
tp_q[0]|clk tp_q[0]|Clk
tp_q[0]|clrn tp_q[0]|AsyncReset
tp_q[0]|sclr tp_q[0]|SyncReset
tp_q[0]|sload tp_q[0]|SyncLoad
tp_q[0]|q tp_q[0]|Q
lcd_reset_q~1|dataa lcd_reset_q|A
lcd_reset_q~1|datab lcd_reset_q|B
lcd_reset_q~1|datac lcd_reset_q|C
lcd_reset_q~1|datad lcd_reset_q|D
lcd_reset_q|clk lcd_reset_q|Clk
lcd_reset_q|clrn lcd_reset_q|AsyncReset
lcd_reset_q~1|combout lcd_reset_q|LutOut
lcd_reset_q|q lcd_reset_q|Q
|datac tp_q[1]|C
tp_q[1]|clk tp_q[1]|Clk
tp_q[1]|clrn tp_q[1]|AsyncReset
tp_q[1]|sclr tp_q[1]|SyncReset
tp_q[1]|sload tp_q[1]|SyncLoad
tp_q[1]|q tp_q[1]|Q
audio_reset_q~0|dataa audio_reset_q|A
audio_reset_q~0|datab audio_reset_q|B
audio_reset_q~0|datac audio_reset_q|C
audio_reset_q~0|datad audio_reset_q|D
audio_reset_q|clk audio_reset_q|Clk
audio_reset_q|clrn audio_reset_q|AsyncReset
audio_reset_q~0|combout audio_reset_q|LutOut
audio_reset_q|q audio_reset_q|Q
tp_q[7]~feeder|dataa tp_q[7]|A
tp_q[7]~feeder|datab tp_q[7]|B
tp_q[7]~feeder|datac tp_q[7]|C
tp_q[7]~feeder|datad tp_q[7]|D
tp_q[7]|clk tp_q[7]|Clk
tp_q[7]|clrn tp_q[7]|AsyncReset
tp_q[7]~feeder|combout tp_q[7]|LutOut
tp_q[7]|q tp_q[7]|Q
tp_q[2]~feeder|dataa tp_q[2]|A
tp_q[2]~feeder|datab tp_q[2]|B
tp_q[2]~feeder|datac tp_q[2]|C
tp_q[2]~feeder|datad tp_q[2]|D
tp_q[2]|clk tp_q[2]|Clk
tp_q[2]|clrn tp_q[2]|AsyncReset
tp_q[2]~feeder|combout tp_q[2]|LutOut
tp_q[2]|q tp_q[2]|Q
|datac tp_q[5]|C
tp_q[5]|clk tp_q[5]|Clk
tp_q[5]|clrn tp_q[5]|AsyncReset
tp_q[5]|sclr tp_q[5]|SyncReset
tp_q[5]|sload tp_q[5]|SyncLoad
tp_q[5]|q tp_q[5]|Q
ref_en_q~feeder|dataa ref_en_q|A
ref_en_q~feeder|datab ref_en_q|B
ref_en_q~feeder|datac ref_en_q|C
ref_en_q~feeder|datad ref_en_q|D
ref_en_q|clk ref_en_q|Clk
ref_en_q|clrn ref_en_q|AsyncReset
ref_en_q~feeder|combout ref_en_q|LutOut
ref_en_q|q ref_en_q|Q
tp_q[3]~0|dataa tp_q[3]~0|A
tp_q[3]~0|datab tp_q[3]~0|B
tp_q[3]~0|datac tp_q[3]~0|C
tp_q[3]~0|datad tp_q[3]~0|D
tp_q[3]~0|combout tp_q[3]~0|LutOut
sysoff_q~feeder|dataa sysoff_q|A
sysoff_q~feeder|datab sysoff_q|B
sysoff_q~feeder|datac sysoff_q|C
sysoff_q~feeder|datad sysoff_q|D
sysoff_q|clk sysoff_q|Clk
sysoff_q|clrn sysoff_q|AsyncReset
sysoff_q~feeder|combout sysoff_q|LutOut
sysoff_q|q sysoff_q|Q
tp_q[6]~feeder|dataa tp_q[6]|A
tp_q[6]~feeder|datab tp_q[6]|B
tp_q[6]~feeder|datac tp_q[6]|C
tp_q[6]~feeder|datad tp_q[6]|D
tp_q[6]|clk tp_q[6]|Clk
tp_q[6]|clrn tp_q[6]|AsyncReset
tp_q[6]~feeder|combout tp_q[6]|LutOut
tp_q[6]|q tp_q[6]|Q
tp_q[3]|ena clken_ctrl_X1_Y15_N0|ClkEn
tp_q[4]|ena clken_ctrl_X1_Y15_N0|ClkEn
lcd_backlight_q|ena clken_ctrl_X1_Y15_N1|ClkEn
tp_q[0]|ena clken_ctrl_X1_Y15_N0|ClkEn
lcd_reset_q|ena clken_ctrl_X1_Y15_N1|ClkEn
tp_q[1]|ena clken_ctrl_X1_Y15_N0|ClkEn
audio_reset_q|ena clken_ctrl_X1_Y15_N1|ClkEn
tp_q[7]|ena clken_ctrl_X1_Y15_N0|ClkEn
tp_q[2]|ena clken_ctrl_X1_Y15_N0|ClkEn
tp_q[5]|ena clken_ctrl_X1_Y15_N0|ClkEn
ref_en_q|ena clken_ctrl_X1_Y15_N1|ClkEn
sysoff_q|ena clken_ctrl_X1_Y15_N1|ClkEn
tp_q[6]|ena clken_ctrl_X1_Y15_N0|ClkEn
mcu_data_out[7]~15|dataa mcu_data_out[7]~15|A
mcu_data_out[7]~15|datab mcu_data_out[7]~15|B
mcu_data_out[7]~15|datac mcu_data_out[7]~15|C
mcu_data_out[7]~15|datad mcu_data_out[7]~15|D
mcu_data_out[7]~15|combout mcu_data_out[7]~15|LutOut
mcu_data_out[6]~13|dataa mcu_data_out[6]~13|A
mcu_data_out[6]~13|datab mcu_data_out[6]~13|B
mcu_data_out[6]~13|datac mcu_data_out[6]~13|C
mcu_data_out[6]~13|datad mcu_data_out[6]~13|D
mcu_data_out[6]~13|combout mcu_data_out[6]~13|LutOut
mcu_data_out[1]~3|dataa mcu_data_out[1]~3|A
mcu_data_out[1]~3|datab mcu_data_out[1]~3|B
mcu_data_out[1]~3|datac mcu_data_out[1]~3|C
mcu_data_out[1]~3|datad mcu_data_out[1]~3|D
mcu_data_out[1]~3|combout mcu_data_out[1]~3|LutOut
mcu_data_out[0]~1|dataa mcu_data_out[0]~1|A
mcu_data_out[0]~1|datab mcu_data_out[0]~1|B
mcu_data_out[0]~1|datac mcu_data_out[0]~1|C
mcu_data_out[0]~1|datad mcu_data_out[0]~1|D
mcu_data_out[0]~1|combout mcu_data_out[0]~1|LutOut
mcu_data_out[0]~0|dataa lcd_data_in_q[0]|A
mcu_data_out[0]~0|datab lcd_data_in_q[0]|B
mcu_data_out[0]~0|datac lcd_data_in_q[0]|C
mcu_data_out[0]~0|datad lcd_data_in_q[0]|D
lcd_data_in_q[0]|clk lcd_data_in_q[0]|Clk
lcd_data_in_q[0]|clrn lcd_data_in_q[0]|AsyncReset
lcd_data_in_q[0]|sclr lcd_data_in_q[0]|SyncReset
lcd_data_in_q[0]|sload lcd_data_in_q[0]|SyncLoad
mcu_data_out[0]~0|combout lcd_data_in_q[0]|LutOut
lcd_data_in_q[0]|q lcd_data_in_q[0]|Q
mcu_data_out[6]~12|dataa lcd_data_in_q[6]|A
mcu_data_out[6]~12|datab lcd_data_in_q[6]|B
mcu_data_out[6]~12|datac lcd_data_in_q[6]|C
mcu_data_out[6]~12|datad lcd_data_in_q[6]|D
lcd_data_in_q[6]|clk lcd_data_in_q[6]|Clk
lcd_data_in_q[6]|clrn lcd_data_in_q[6]|AsyncReset
lcd_data_in_q[6]|sclr lcd_data_in_q[6]|SyncReset
lcd_data_in_q[6]|sload lcd_data_in_q[6]|SyncLoad
mcu_data_out[6]~12|combout lcd_data_in_q[6]|LutOut
lcd_data_in_q[6]|q lcd_data_in_q[6]|Q
lcd_data_in_q[0]|ena clken_ctrl_X1_Y19_N0|ClkEn
lcd_data_in_q[6]|ena clken_ctrl_X1_Y19_N0|ClkEn
lcd_data_out_q[1]~feeder|dataa lcd_data_out_q[1]|A
lcd_data_out_q[1]~feeder|datab lcd_data_out_q[1]|B
lcd_data_out_q[1]~feeder|datac lcd_data_out_q[1]|C
lcd_data_out_q[1]~feeder|datad lcd_data_out_q[1]|D
lcd_data_out_q[1]|clk lcd_data_out_q[1]|Clk
lcd_data_out_q[1]|clrn lcd_data_out_q[1]|AsyncReset
lcd_data_out_q[1]~feeder|combout lcd_data_out_q[1]|LutOut
lcd_data_out_q[1]|q lcd_data_out_q[1]|Q
lcd_data_out_q[2]~feeder|dataa lcd_data_out_q[2]|A
lcd_data_out_q[2]~feeder|datab lcd_data_out_q[2]|B
lcd_data_out_q[2]~feeder|datac lcd_data_out_q[2]|C
lcd_data_out_q[2]~feeder|datad lcd_data_out_q[2]|D
lcd_data_out_q[2]|clk lcd_data_out_q[2]|Clk
lcd_data_out_q[2]|clrn lcd_data_out_q[2]|AsyncReset
lcd_data_out_q[2]~feeder|combout lcd_data_out_q[2]|LutOut
lcd_data_out_q[2]|q lcd_data_out_q[2]|Q
|datac lcd_data_out_q[6]|C
lcd_data_out_q[6]|clk lcd_data_out_q[6]|Clk
lcd_data_out_q[6]|clrn lcd_data_out_q[6]|AsyncReset
lcd_data_out_q[6]|sclr lcd_data_out_q[6]|SyncReset
lcd_data_out_q[6]|sload lcd_data_out_q[6]|SyncLoad
lcd_data_out_q[6]|q lcd_data_out_q[6]|Q
lcd_data_out_q[7]~feeder|dataa lcd_data_out_q[7]|A
lcd_data_out_q[7]~feeder|datab lcd_data_out_q[7]|B
lcd_data_out_q[7]~feeder|datac lcd_data_out_q[7]|C
lcd_data_out_q[7]~feeder|datad lcd_data_out_q[7]|D
lcd_data_out_q[7]|clk lcd_data_out_q[7]|Clk
lcd_data_out_q[7]|clrn lcd_data_out_q[7]|AsyncReset
lcd_data_out_q[7]~feeder|combout lcd_data_out_q[7]|LutOut
lcd_data_out_q[7]|q lcd_data_out_q[7]|Q
lcd_data_out_q[0]~feeder|dataa lcd_data_out_q[0]|A
lcd_data_out_q[0]~feeder|datab lcd_data_out_q[0]|B
lcd_data_out_q[0]~feeder|datac lcd_data_out_q[0]|C
lcd_data_out_q[0]~feeder|datad lcd_data_out_q[0]|D
lcd_data_out_q[0]|clk lcd_data_out_q[0]|Clk
lcd_data_out_q[0]|clrn lcd_data_out_q[0]|AsyncReset
lcd_data_out_q[0]~feeder|combout lcd_data_out_q[0]|LutOut
lcd_data_out_q[0]|q lcd_data_out_q[0]|Q
lcd_data_out_q[1]|ena clken_ctrl_X1_Y20_N0|ClkEn
lcd_data_out_q[2]|ena clken_ctrl_X1_Y20_N0|ClkEn
lcd_data_out_q[6]|ena clken_ctrl_X1_Y20_N0|ClkEn
lcd_data_out_q[7]|ena clken_ctrl_X1_Y20_N0|ClkEn
lcd_data_out_q[0]|ena clken_ctrl_X1_Y20_N0|ClkEn
mcu_data_out[7]~14|dataa lcd_data_in_q[7]|A
mcu_data_out[7]~14|datab lcd_data_in_q[7]|B
mcu_data_out[7]~14|datac lcd_data_in_q[7]|C
mcu_data_out[7]~14|datad lcd_data_in_q[7]|D
lcd_data_in_q[7]|clk lcd_data_in_q[7]|Clk
lcd_data_in_q[7]|clrn lcd_data_in_q[7]|AsyncReset
lcd_data_in_q[7]|sclr lcd_data_in_q[7]|SyncReset
lcd_data_in_q[7]|sload lcd_data_in_q[7]|SyncLoad
mcu_data_out[7]~14|combout lcd_data_in_q[7]|LutOut
lcd_data_in_q[7]|q lcd_data_in_q[7]|Q
mcu_data_out[1]~2|dataa lcd_data_in_q[1]|A
mcu_data_out[1]~2|datab lcd_data_in_q[1]|B
mcu_data_out[1]~2|datac lcd_data_in_q[1]|C
mcu_data_out[1]~2|datad lcd_data_in_q[1]|D
lcd_data_in_q[1]|clk lcd_data_in_q[1]|Clk
lcd_data_in_q[1]|clrn lcd_data_in_q[1]|AsyncReset
lcd_data_in_q[1]|sclr lcd_data_in_q[1]|SyncReset
lcd_data_in_q[1]|sload lcd_data_in_q[1]|SyncLoad
mcu_data_out[1]~2|combout lcd_data_in_q[1]|LutOut
lcd_data_in_q[1]|q lcd_data_in_q[1]|Q
lcd_data_in_q[7]|ena clken_ctrl_X1_Y21_N0|ClkEn
lcd_data_in_q[1]|ena clken_ctrl_X1_Y21_N0|ClkEn
mcu_data_out[3]~7|dataa mcu_data_out[3]~7|A
mcu_data_out[3]~7|datab mcu_data_out[3]~7|B
mcu_data_out[3]~7|datac mcu_data_out[3]~7|C
mcu_data_out[3]~7|datad mcu_data_out[3]~7|D
mcu_data_out[3]~7|combout mcu_data_out[3]~7|LutOut
mcu_data_out[4]~9|dataa mcu_data_out[4]~9|A
mcu_data_out[4]~9|datab mcu_data_out[4]~9|B
mcu_data_out[4]~9|datac mcu_data_out[4]~9|C
mcu_data_out[4]~9|datad mcu_data_out[4]~9|D
mcu_data_out[4]~9|combout mcu_data_out[4]~9|LutOut
mcu_data_out[2]~5|dataa mcu_data_out[2]~5|A
mcu_data_out[2]~5|datab mcu_data_out[2]~5|B
mcu_data_out[2]~5|datac mcu_data_out[2]~5|C
mcu_data_out[2]~5|datad mcu_data_out[2]~5|D
mcu_data_out[2]~5|combout mcu_data_out[2]~5|LutOut
mcu_data_out[5]~11|dataa mcu_data_out[5]~11|A
mcu_data_out[5]~11|datab mcu_data_out[5]~11|B
mcu_data_out[5]~11|datac mcu_data_out[5]~11|C
mcu_data_out[5]~11|datad mcu_data_out[5]~11|D
mcu_data_out[5]~11|combout mcu_data_out[5]~11|LutOut
mcu_data_out[2]~4|dataa lcd_data_in_q[2]|A
mcu_data_out[2]~4|datab lcd_data_in_q[2]|B
mcu_data_out[2]~4|datac lcd_data_in_q[2]|C
mcu_data_out[2]~4|datad lcd_data_in_q[2]|D
lcd_data_in_q[2]|clk lcd_data_in_q[2]|Clk
lcd_data_in_q[2]|clrn lcd_data_in_q[2]|AsyncReset
lcd_data_in_q[2]|sclr lcd_data_in_q[2]|SyncReset
lcd_data_in_q[2]|sload lcd_data_in_q[2]|SyncLoad
mcu_data_out[2]~4|combout lcd_data_in_q[2]|LutOut
lcd_data_in_q[2]|q lcd_data_in_q[2]|Q
lcd_data_in_q[2]|ena clken_ctrl_X1_Y24_N0|ClkEn
mcu_data_out[4]~8|dataa lcd_data_in_q[4]|A
mcu_data_out[4]~8|datab lcd_data_in_q[4]|B
mcu_data_out[4]~8|datac lcd_data_in_q[4]|C
mcu_data_out[4]~8|datad lcd_data_in_q[4]|D
lcd_data_in_q[4]|clk lcd_data_in_q[4]|Clk
lcd_data_in_q[4]|clrn lcd_data_in_q[4]|AsyncReset
lcd_data_in_q[4]|sclr lcd_data_in_q[4]|SyncReset
lcd_data_in_q[4]|sload lcd_data_in_q[4]|SyncLoad
mcu_data_out[4]~8|combout lcd_data_in_q[4]|LutOut
lcd_data_in_q[4]|q lcd_data_in_q[4]|Q
lcd_data_out_q[4]~feeder|dataa lcd_data_out_q[4]|A
lcd_data_out_q[4]~feeder|datab lcd_data_out_q[4]|B
lcd_data_out_q[4]~feeder|datac lcd_data_out_q[4]|C
lcd_data_out_q[4]~feeder|datad lcd_data_out_q[4]|D
lcd_data_out_q[4]|clk lcd_data_out_q[4]|Clk
lcd_data_out_q[4]|clrn lcd_data_out_q[4]|AsyncReset
lcd_data_out_q[4]~feeder|combout lcd_data_out_q[4]|LutOut
lcd_data_out_q[4]|q lcd_data_out_q[4]|Q
|datac lcd_data_out_q[3]|C
lcd_data_out_q[3]|clk lcd_data_out_q[3]|Clk
lcd_data_out_q[3]|clrn lcd_data_out_q[3]|AsyncReset
lcd_data_out_q[3]|sclr lcd_data_out_q[3]|SyncReset
lcd_data_out_q[3]|sload lcd_data_out_q[3]|SyncLoad
lcd_data_out_q[3]|q lcd_data_out_q[3]|Q
|datac lcd_data_out_q[5]|C
lcd_data_out_q[5]|clk lcd_data_out_q[5]|Clk
lcd_data_out_q[5]|clrn lcd_data_out_q[5]|AsyncReset
lcd_data_out_q[5]|sclr lcd_data_out_q[5]|SyncReset
lcd_data_out_q[5]|sload lcd_data_out_q[5]|SyncLoad
lcd_data_out_q[5]|q lcd_data_out_q[5]|Q
mcu_data_out[3]~6|dataa lcd_data_in_q[3]|A
mcu_data_out[3]~6|datab lcd_data_in_q[3]|B
mcu_data_out[3]~6|datac lcd_data_in_q[3]|C
mcu_data_out[3]~6|datad lcd_data_in_q[3]|D
lcd_data_in_q[3]|clk lcd_data_in_q[3]|Clk
lcd_data_in_q[3]|clrn lcd_data_in_q[3]|AsyncReset
lcd_data_in_q[3]|sclr lcd_data_in_q[3]|SyncReset
lcd_data_in_q[3]|sload lcd_data_in_q[3]|SyncLoad
mcu_data_out[3]~6|combout lcd_data_in_q[3]|LutOut
lcd_data_in_q[3]|q lcd_data_in_q[3]|Q
mcu_data_out[5]~10|dataa lcd_data_in_q[5]|A
mcu_data_out[5]~10|datab lcd_data_in_q[5]|B
mcu_data_out[5]~10|datac lcd_data_in_q[5]|C
mcu_data_out[5]~10|datad lcd_data_in_q[5]|D
lcd_data_in_q[5]|clk lcd_data_in_q[5]|Clk
lcd_data_in_q[5]|clrn lcd_data_in_q[5]|AsyncReset
lcd_data_in_q[5]|sclr lcd_data_in_q[5]|SyncReset
lcd_data_in_q[5]|sload lcd_data_in_q[5]|SyncLoad
mcu_data_out[5]~10|combout lcd_data_in_q[5]|LutOut
lcd_data_in_q[5]|q lcd_data_in_q[5]|Q
lcd_data_in_q[4]|ena clken_ctrl_X1_Y26_N0|ClkEn
lcd_data_out_q[4]|ena clken_ctrl_X1_Y26_N1|ClkEn
lcd_data_out_q[3]|ena clken_ctrl_X1_Y26_N1|ClkEn
lcd_data_out_q[5]|ena clken_ctrl_X1_Y26_N1|ClkEn
lcd_data_in_q[3]|ena clken_ctrl_X1_Y26_N0|ClkEn
lcd_data_in_q[5]|ena clken_ctrl_X1_Y26_N0|ClkEn
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,112 @@
set_location_assignment -to MCU_D[7] PIN_26
set_location_assignment -to MCU_D[6] PIN_27
set_location_assignment -to MCU_D[5] PIN_29
set_location_assignment -to MCU_D[4] PIN_28
set_location_assignment -to MCU_D[3] PIN_30
set_location_assignment -to MCU_D[2] PIN_33
set_location_assignment -to MCU_D[1] PIN_36
set_location_assignment -to MCU_D[0] PIN_35
set_location_assignment -to MCU_DIR PIN_72
set_location_assignment -to MCU_IO_STBX PIN_41
set_location_assignment -to MCU_LCD_WRX PIN_71
set_location_assignment -to MCU_ADDR PIN_42
set_location_assignment -to MCU_LCD_TE PIN_40
set_location_assignment -to MCU_P2_8 PIN_43
set_location_assignment -to MCU_LCD_RDX PIN_39
set_location_assignment -to TP_U PIN_8
set_location_assignment -to TP_D PIN_6
set_location_assignment -to TP_L PIN_7
set_location_assignment -to TP_R PIN_5
set_location_assignment -to SW_SEL PIN_17
set_location_assignment -to SW_ROT_A PIN_15
set_location_assignment -to SW_ROT_B PIN_16
set_location_assignment -to SW_U PIN_34
set_location_assignment -to SW_D PIN_14
set_location_assignment -to SW_L PIN_37
set_location_assignment -to SW_R PIN_12
set_location_assignment -to LCD_RESETX PIN_100
set_location_assignment -to LCD_RS PIN_3
set_location_assignment -to LCD_WRX PIN_2
set_location_assignment -to LCD_RDX PIN_1
set_location_assignment -to LCD_DB[15] PIN_82
set_location_assignment -to LCD_DB[14] PIN_83
set_location_assignment -to LCD_DB[13] PIN_84
set_location_assignment -to LCD_DB[12] PIN_85
set_location_assignment -to LCD_DB[11] PIN_86
set_location_assignment -to LCD_DB[10] PIN_87
set_location_assignment -to LCD_DB[9] PIN_88
set_location_assignment -to LCD_DB[8] PIN_89
set_location_assignment -to LCD_DB[7] PIN_90
set_location_assignment -to LCD_DB[6] PIN_91
set_location_assignment -to LCD_DB[5] PIN_92
set_location_assignment -to LCD_DB[4] PIN_95
set_location_assignment -to LCD_DB[3] PIN_96
set_location_assignment -to LCD_DB[2] PIN_97
set_location_assignment -to LCD_DB[1] PIN_98
set_location_assignment -to LCD_DB[0] PIN_99
set_location_assignment -to LCD_TE PIN_4
set_location_assignment -to LCD_BACKLIGHT PIN_76
set_location_assignment -to SYSOFF PIN_47
set_location_assignment -to AUDIO_RESETX PIN_57
set_location_assignment -to REF_EN PIN_58
set_location_assignment -to GPS_RESETX PIN_73
set_location_assignment -to GPS_TX_READY PIN_75
set_location_assignment -to GPS_TIMEPULSE PIN_74
set_location_assignment -to DEVICE_RESET PIN_44
set_location_assignment -to DEVICE_RESET_V PIN_38
set_instance_assignment -name IO_STANDARD -to MCU_D[7] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to MCU_D[6] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to MCU_D[5] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to MCU_D[4] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to MCU_D[3] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to MCU_D[2] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to MCU_D[1] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to MCU_D[0] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to MCU_DIR "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to MCU_IO_STBX "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to MCU_LCD_WRX "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to MCU_ADDR "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to MCU_LCD_TE "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to MCU_P2_8 "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to MCU_LCD_RDX "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to TP_U "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to TP_D "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to TP_L "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to TP_R "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to SW_SEL "3.3V Schmitt Trigger Input"
set_instance_assignment -name IO_STANDARD -to SW_ROT_A "3.3V Schmitt Trigger Input"
set_instance_assignment -name IO_STANDARD -to SW_ROT_B "3.3V Schmitt Trigger Input"
set_instance_assignment -name IO_STANDARD -to SW_U "3.3V Schmitt Trigger Input"
set_instance_assignment -name IO_STANDARD -to SW_D "3.3V Schmitt Trigger Input"
set_instance_assignment -name IO_STANDARD -to SW_L "3.3V Schmitt Trigger Input"
set_instance_assignment -name IO_STANDARD -to SW_R "3.3V Schmitt Trigger Input"
set_instance_assignment -name IO_STANDARD -to LCD_RESETX "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to LCD_RS "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to LCD_WRX "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to LCD_RDX "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to LCD_DB[15] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to LCD_DB[14] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to LCD_DB[13] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to LCD_DB[12] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to LCD_DB[11] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to LCD_DB[10] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to LCD_DB[9] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to LCD_DB[8] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to LCD_DB[7] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to LCD_DB[6] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to LCD_DB[5] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to LCD_DB[4] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to LCD_DB[3] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to LCD_DB[2] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to LCD_DB[1] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to LCD_DB[0] "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to LCD_TE "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to LCD_BACKLIGHT "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to SYSOFF "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to AUDIO_RESETX "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to REF_EN "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to GPS_RESETX "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to GPS_TX_READY "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to GPS_TIMEPULSE "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to DEVICE_RESET "3.3-V LVCMOS"
set_instance_assignment -name IO_STANDARD -to DEVICE_RESET_V "3.3-V LVCMOS"
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,125 @@
ssWJbg*O-TSHdTjR
^ykYUbZxhrN\/z*-xm-x%`T`=`t
dvaLDM\AMw:PPKa/udH;9|0c0g0w
n[tI{:2nE=y+CYTwlSOHfH<H<
^G`"ZxhrN\/z*-xm-x%`T`Q`!
d(J_A[~2aW[Ag\5RK4jN$%a%i%:
;^':y?GyRP[qV/udH;9|0]0c0c
6wnbVgw#6,-;rD&)jR)j ENEIEI
o={ 0 `VZ'35qBwqBoW&WMW<
G$<H2Hp.L5lFXMk1MkGu u u5
q+9SoSuTRR`%*1i|1iqtHtHtR
OA.-i-F,BmVCRlSwlSOH H Hm
^ftYZYjSK|%$?p2Wp2^)M)M)|
(`VmQm34^-|MvDd{Dd(8-8-8-
%sf)i)B@SUoz*-xm-x%`U`t`!
dP0vAvh,zw] cG cdKsK1Ks
cAMn9nX-}J6~KpRKpc:}:O:f
$f TATq0|n5LjN4jN$%C%i%i
;|{+y+>#vBe29at9a;CkCvC]
|>*qKqx4w /B;9H;9|0<0c0g
6wnbnV{.MD&)jR)j ECEIEf
o={ 0 `V>'35qBwqBoWXWMW&
G$<H2Hp.NlFXMk1MkGu`u u`
q+9SoSuTG`%*1i|1iqtJtHtH
OA.-i*-XCRlSwlSOHBH HB
^ftYZxhrN\/z*-xm-x%`=`t`!
dP0vAt_] cG cdK+K!K+
cAMn9a\5RK4jN$%,%|%{
;|{+y"RGe29at9a;CwCvC_
|.*hK[qqZ/udH;9|0w0g0<
7w4bn,yDP5R)j EdECEf
oP{+0 VZ'35qBwqBoWMWZW&
G0<V2H.LlFXMk1MkGu u5u`
qa9&oSTN`%*1i|1iqtHtltl
On.!i-,yVCRlSwlSOHyH<H
^]tkZYSM%$?p2Wp2^)|);)m
(%VbQm47|MvDd{Dd(8"8C8"
%8fGi)@5oz*-xm-x%`Q`!`S
d20nAv,gw] cG cdK!K+K+
cqM[9D@9gaX"6!`RKpc:v:&:}
$7 cAG+A"Jq-5RK4jNQ/BQN`/$%,%C%{
;8{ y|{+yR+Gefpt9a;C]C_C_
|.*hK>*qKZqo/udH;98zv89+z|0=0n0g
7w4b6wnbr[35qBwqBoWRWZW<
G0<V2$<H2ynKFv71MkGu&u`uw
qa9&o+9Sox3_%8\|1i!C?!icCqt^tNtR
On.!i(mi:CYTwlSOH;H<H
^xhZQNXz*-xm-x%`T`=`Q
d_:Av]Q{G cdK+KsKz
cgQ9A6!`RKpc:O:&:O
$"lAM+JAs5RK4jN$%,%C%C
;:"yR-?y>efpt9a;C_CkC!
|1tKZ/udH;9|0g0n0g
($b([=3\HwqBoWZW&WM
GOy2VFv71MkGu u5uL
q=M=>..%*1i|1iqt"tltR
O+(i-CRlSwlSOH<HyH
^P`Zf$?p2Wp2^);)|)B
(y6QLMvDd{Dd(8C8"8<
%\EiGz*-xm-x%`!`Q`5
d938{|j`d|NAQN`/A-{A6{:Ad,$%|%|%,
;S=Mp&d/(Njb*jk3bZfb_fab9 ECEfE
oK7*Hf1y'*io!icCo_RoMNlo5lqtHtJtl
OW{ITq?gs=dQGdS_Q!^Qg<^Q/C(878"8C
%w{#pg|:3`p9^pCV9"S9T}O9_&c:v:}:&
$1 oKQ`r=/9K89+zKo3KVn]KCg|0<0n0g
2)}P&bko7yk2hGu`u`uLw
q!C?-TiqS?#iXBitB;i8<OHyHyH<
^q-R=0QGdS_Q!^Qg^7Q/^(8"8"8^
%gWk:{A|cjVAYzAWzeA\+dK!KzK+
c^V2|KAQN`/A-{A6C,Ad,$%i%|%,
;&4}/dK89+zKo3KVn3KCg|0w0<0g
*3JoH0fB1Y0L<0"&M0uZoWRW&WZ
GgJR*\o!icCo_RoMN"o5lqtJtNtl
Oq#0g0Zq2&-Z1KZamNZ[K^)|)m)K
(_GTQkwGj_. UdQ)(8"8"8@
%WgFiFwxwi2pi'@!o%`Q`S`SU
dV|UAU9c9AQ{AX,zwdK&K!K&
cV^l9l*p*9!`9'-}Jc:v:}:Sv
$/Q\A\1N1ARKAv0|n$%|%C%|
;4&%y%SaSyfpy5#vB;C!CkC]
|z8)K)X9XKudKA4w |0<0n0c
3*}b}2j2bP5bK{.M ECEfEU
oYfs0sKBK0\H0xV>'oWRWXW^
GJg{2{bkb2XMk2h.5lGu u`uLj
qC!AoABiBo*1io<TR`qtHtJtl
O#q/i/WSWiRlSiJ,mVOH HyH;
^-q.Z. 2 Z?p2Z<S|%^)|)m)@
(_GTQTwdwQvDdQ)4-|(8"8<8R
%WgFiFwxwi*-xi'@Uo%`Q`=`=
dV|UAU9c9A cAX,rwdK1K!Kr
cV^l9l*p*9~Kp9'-iJc:O:f:S&
$/Q\A`r=/9KA|0<0<03
3*}bko7yk2hF5Gu`u`u&
qO!1oABiBo*1iTl`%RqtHtRtR
OQqli/WSWiRlS,BVCyOH HBHB
^DqpZ. 2 Z?p2Sm%$B^)M)m)@
(fGDQTwdwQvDd4"|MA(8-8<8R
%vg-iFwxwi*-x@toz;%`t`=`St
d^| AU9c9A c,&w]zzdK1KsKz&
cr^K9l*p*9~Kp-#J6Sfc:O:S:u
$VQjA\1N1ALjN09n5{:$%i%{%9
;d/GKN5bK ECECEfC
o7*HfY5Ks0fB1Y0L<0"<RoWXWXW<
G'-7gJXb{2gkIJ2KL2}L\Gu`uLuL
q4$\!C*BAo!icCo_RoMNlqtHtJtR
O{ITq#RW/iqS?#iXBitmBOH;HyHB
^sw0q-? .Zq2&-Z1KZamM^)B)m)K
(cH0G_vwTQGdS_Q!^Qg<R(8"8<8^
%{#pg|:3`p9^pCV9"S9TSvc:f:f:&
$ oKQ`r=/9K89+zKo3KV3p|0<030g
1X5*ko7yk2gkIJ2KL2}w5Gu u`u5
q4$\!c-{g2Zq2&-Z1KZamK^)B)|);
(cH0GSY{:cA|cjVAYzAWs1dK&KsK+
cd0`^C| ray&ad4yGwy kg;C!CkC_
|(k(BGGKA|0<0<0n
jRbK{ M ECECEa
oBw0xV<'oWXWXW<Z
Gk12h.wlGu`u`u
qi|o<TJ`qtJtJtRH
OSwiJ,yVC<OHyHyHy
^2WZ<SM%^)|)|)B
(d{Q)47|(8"8"8R
%xmi'@5o%`Q`Q`SU
dcGAX,gwdK!K!Kzz
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,3 @@
#QUARTUS_VERSION = "11.1"
PROJECT_REVISION = "portapack_h4m_cpld"
@@ -0,0 +1,115 @@
# Design name Assignments, replace __design_name__ with actual design name
# ========================
set_global_assignment -name DEVICE EP4CE75F29C8
set_global_assignment -name FAMILY "Cyclone IV E"
set_global_assignment -name TOP_LEVEL_ENTITY "top"
set_global_assignment -name SEARCH_PATH "A:\\Users\\jLynx\\Documents\\Code\\C\\portapack-mayhem\\hardware\\portapack_h4m\\CPLD\\AG256SL100\\."
set_global_assignment -name VERILOG_FILE "A:\\Users\\jLynx\\Downloads\\Supra-2023.02.b0-7773ca8a-win64-all\\etc\\arch\\rodinia\\alta_sim.v"
set_global_assignment -name VHDL_FILE "A:\\Users\\jLynx\\Documents\\Code\\C\\portapack-mayhem\\hardware\\portapack_h4m\\CPLD\\AG256SL100\\top.vhd"
set_global_assignment -name SDC_FILE "A:\\Users\\jLynx\\Documents\\Code\\C\\portapack-mayhem\\hardware\\portapack_h4m\\CPLD\\AG256SL100\\portapack_h4m_cpld.sdc"
set_global_assignment -name SDC_FILE .\\portapack_h4m_cpld_derate.sdc
#set_global_assignment -name LOGICLOCK_INCREMENTAL_COMPILE_FILE "atom_netlists/__design_name__.vqm"
# Project-Wide Assignments
# ========================
set_global_assignment -name ORIGINAL_QUARTUS_VERSION 11.1
set_global_assignment -name PROJECT_CREATION_TIME_DATE "09:37:04 JANUARY 04, 2013"
set_global_assignment -name LAST_QUARTUS_VERSION "22.1std.1 Lite Edition"
set_global_assignment -name PROJECT_OUTPUT_DIRECTORY ./quartus_logs
set_global_assignment -name NUM_PARALLEL_PROCESSORS ALL
set_global_assignment -name FLOW_ENABLE_IO_ASSIGNMENT_ANALYSIS ON
#set_global_assignment -name SMART_RECOMPILE ON
# Classic Timing Assignments
# ==========================
set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0
set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85
# Analysis & Synthesis Assignments
# ================================
set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS ON
set_global_assignment -name ADV_NETLIST_OPT_SYNTH_WYSIWYG_REMAP ON
#set_global_assignment -name MAX_BALANCING_DSP_BLOCKS 0
#set_global_assignment -name AUTO_ROM_RECOGNITION OFF
#set_global_assignment -name AUTO_RAM_RECOGNITION OFF
#set_global_assignment -name MAX_RAM_BLOCKS_M4K 0
set_global_assignment -name AUTO_OPEN_DRAIN_PINS OFF
# set_instance_assignment -name PRESERVE_REGISTER ON -to *
#set_instance_assignment -name PRESERVE_PLL_COUNTER_ORDER ON -to *
#set_instance_assignment -name MAX_NUMBER_OF_REGISTERS_FROM_UNINFERRED_RAMS 0 -to *
# Fitter Assignments
# ==================
set_global_assignment -name ERROR_CHECK_FREQUENCY_DIVISOR 1
set_global_assignment -name ROUTING_BACK_ANNOTATION_MODE OFF
set_global_assignment -name OPTIMIZE_HOLD_TIMING "IO PATHS AND MINIMUM TPD PATHS"
set_global_assignment -name FITTER_EFFORT "STANDARD FIT"
set_global_assignment -name ROUTER_TIMING_OPTIMIZATION_LEVEL MAXIMUM
set_global_assignment -name PLACEMENT_EFFORT_MULTIPLIER 10
set_global_assignment -name ROUTER_EFFORT_MULTIPLIER 10
set_global_assignment -name ECO_OPTIMIZE_TIMING ON
set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION ALWAYS
set_global_assignment -name FITTER_AGGRESSIVE_ROUTABILITY_OPTIMIZATION ALWAYS
set_global_assignment -name STRATIX_DEVICE_IO_STANDARD "3.3-V LVTTL"
set_global_assignment -name IO_PLACEMENT_OPTIMIZATION ON
set_global_assignment -name SEED 1
set_global_assignment -name FIT_ONLY_ONE_ATTEMPT OFF
set_global_assignment -name MAX_GLOBAL_CLOCKS_ALLOWED 4
set_global_assignment -name PHYSICAL_SYNTHESIS_COMBO_LOGIC ON
#set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_RETIMING ON
#set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_DUPLICATION ON
set_global_assignment -name PHYSICAL_SYNTHESIS_COMBO_LOGIC_FOR_AREA ON
set_global_assignment -name PHYSICAL_SYNTHESIS_EFFORT EXTRA
# EDA Netlist Writer Assignments
# ==============================
set_global_assignment -name EDA_SIMULATION_TOOL "ModelSim (Verilog)"
# LogicLock Region Assignments
# ============================
set_global_assignment -name LOGICLOCK_INCREMENTAL_COMPILE_ASSIGNMENT OFF
# Power Estimation Assignments
# ============================
set_global_assignment -name POWER_PRESET_COOLING_SOLUTION "23 MM HEAT SINK WITH 200 LFPM AIRFLOW"
set_global_assignment -name POWER_BOARD_THERMAL_MODEL "NONE (CONSERVATIVE)"
# start EDA_TOOL_SETTINGS(eda_simulation)
# ---------------------------------------
# EDA Netlist Writer Assignments
# ==============================
set_global_assignment -name EDA_TIME_SCALE "1 ps" -section_id eda_simulation
set_global_assignment -name EDA_OUTPUT_DATA_FORMAT "VERILOG HDL" -section_id eda_simulation
# end EDA_TOOL_SETTINGS(eda_simulation)
# -------------------------------------
# start DESIGN_PARTITION(Top)
# ---------------------------
# Incremental Compilation Assignments
# ===================================
set_global_assignment -name PARTITION_NETLIST_TYPE SOURCE -section_id Top
set_global_assignment -name PARTITION_FITTER_PRESERVATION_LEVEL PLACEMENT_AND_ROUTING -section_id Top
set_global_assignment -name PARTITION_COLOR 16764057 -section_id Top
set_global_assignment -name FLOW_DISABLE_ASSEMBLER ON
# end DESIGN_PARTITION(Top)
# -------------------------
set_global_assignment -name MAX_BALANCING_DSP_BLOCKS 0
set_global_assignment -name MAX_RAM_BLOCKS_M4K 0
set_global_assignment -name AUTO_ROM_RECOGNITION OFF
set_global_assignment -name AUTO_RAM_RECOGNITION OFF
set_global_assignment -name OPTIMIZE_IOC_REGISTER_PLACEMENT_FOR_TIMING OFF
set_global_assignment -name EDA_MAINTAIN_DESIGN_HIERARCHY PARTITION_ONLY -section_id eda_simulation
set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top
@@ -0,0 +1 @@
read_sdc -quiet "A:/Users/jLynx/Documents/Code/C/portapack-mayhem/hardware/portapack_h4m/CPLD/AG256SL100/portapack_h4m_cpld.sdc"
@@ -0,0 +1,806 @@
# -------------------------------------------------------------------------- #
#
# Copyright (C) 2023 Intel Corporation. All rights reserved.
# Your use of Intel Corporation's design tools, logic functions
# and other software and tools, and any partner logic
# functions, and any output files from any of the foregoing
# (including device programming or simulation files), and any
# associated documentation or information are expressly subject
# to the terms and conditions of the Intel Program License
# Subscription Agreement, the Intel Quartus Prime License Agreement,
# the Intel FPGA IP License Agreement, or other applicable license
# agreement, including, without limitation, that your use is for
# the sole purpose of programming logic devices manufactured by
# Intel and sold by Intel or its authorized distributors. Please
# refer to the applicable agreement for further details, at
# https://fpgasoftware.intel.com/eula.
#
# -------------------------------------------------------------------------- #
#
# Quartus Prime
# Version 22.1std.1 Build 917 02/14/2023 SC Lite Edition
# Date created = 14:46:17 April 19, 2024
#
# -------------------------------------------------------------------------- #
#
# Note:
#
# 1) Do not modify this file. This file was generated
# automatically by the Quartus Prime software and is used
# to preserve global assignments across Quartus Prime versions.
#
# -------------------------------------------------------------------------- #
set_global_assignment -name IP_COMPONENT_REPORT_HIERARCHY Off
set_global_assignment -name IP_COMPONENT_INTERNAL Off
set_global_assignment -name PROJECT_SHOW_ENTITY_NAME On
set_global_assignment -name PROJECT_USE_SIMPLIFIED_NAMES Off
set_global_assignment -name ENABLE_REDUCED_MEMORY_MODE Off
set_global_assignment -name VER_COMPATIBLE_DB_DIR export_db
set_global_assignment -name AUTO_EXPORT_VER_COMPATIBLE_DB Off
set_global_assignment -name FLOW_DISABLE_ASSEMBLER Off
set_global_assignment -name FLOW_ENABLE_POWER_ANALYZER Off
set_global_assignment -name FLOW_ENABLE_HC_COMPARE Off
set_global_assignment -name HC_OUTPUT_DIR hc_output
set_global_assignment -name SAVE_MIGRATION_INFO_DURING_COMPILATION Off
set_global_assignment -name FLOW_ENABLE_IO_ASSIGNMENT_ANALYSIS Off
set_global_assignment -name RUN_FULL_COMPILE_ON_DEVICE_CHANGE On
set_global_assignment -name FLOW_ENABLE_RTL_VIEWER Off
set_global_assignment -name READ_OR_WRITE_IN_BYTE_ADDRESS "Use global settings"
set_global_assignment -name FLOW_HARDCOPY_DESIGN_READINESS_CHECK On
set_global_assignment -name FLOW_ENABLE_PARALLEL_MODULES On
set_global_assignment -name ENABLE_COMPACT_REPORT_TABLE Off
set_global_assignment -name REVISION_TYPE Base -family "Arria V"
set_global_assignment -name REVISION_TYPE Base -family "Stratix V"
set_global_assignment -name REVISION_TYPE Base -family "Arria V GZ"
set_global_assignment -name REVISION_TYPE Base -family "Cyclone V"
set_global_assignment -name DEFAULT_HOLD_MULTICYCLE "Same as Multicycle"
set_global_assignment -name CUT_OFF_PATHS_BETWEEN_CLOCK_DOMAINS On
set_global_assignment -name CUT_OFF_READ_DURING_WRITE_PATHS On
set_global_assignment -name CUT_OFF_IO_PIN_FEEDBACK On
set_global_assignment -name DO_COMBINED_ANALYSIS Off
set_global_assignment -name TDC_AGGRESSIVE_HOLD_CLOSURE_EFFORT Off
set_global_assignment -name ENABLE_HPS_INTERNAL_TIMING Off
set_global_assignment -name EMIF_SOC_PHYCLK_ADVANCE_MODELING Off
set_global_assignment -name USE_DLL_FREQUENCY_FOR_DQS_DELAY_CHAIN Off
set_global_assignment -name ANALYZE_LATCHES_AS_SYNCHRONOUS_ELEMENTS On
set_global_assignment -name TIMING_ANALYZER_REPORT_SCRIPT_INCLUDE_DEFAULT_ANALYSIS On
set_global_assignment -name TIMING_ANALYZER_MULTICORNER_ANALYSIS On -family "Arria V"
set_global_assignment -name TIMING_ANALYZER_MULTICORNER_ANALYSIS On -family "Cyclone 10 LP"
set_global_assignment -name TIMING_ANALYZER_MULTICORNER_ANALYSIS On -family "MAX 10"
set_global_assignment -name TIMING_ANALYZER_MULTICORNER_ANALYSIS On -family "Stratix IV"
set_global_assignment -name TIMING_ANALYZER_MULTICORNER_ANALYSIS On -family "Cyclone IV E"
set_global_assignment -name TIMING_ANALYZER_MULTICORNER_ANALYSIS On -family "Arria 10"
set_global_assignment -name TIMING_ANALYZER_MULTICORNER_ANALYSIS Off -family "MAX V"
set_global_assignment -name TIMING_ANALYZER_MULTICORNER_ANALYSIS On -family "Stratix V"
set_global_assignment -name TIMING_ANALYZER_MULTICORNER_ANALYSIS On -family "Arria V GZ"
set_global_assignment -name TIMING_ANALYZER_MULTICORNER_ANALYSIS Off -family "MAX II"
set_global_assignment -name TIMING_ANALYZER_MULTICORNER_ANALYSIS On -family "Arria II GX"
set_global_assignment -name TIMING_ANALYZER_MULTICORNER_ANALYSIS On -family "Arria II GZ"
set_global_assignment -name TIMING_ANALYZER_MULTICORNER_ANALYSIS On -family "Cyclone IV GX"
set_global_assignment -name TIMING_ANALYZER_MULTICORNER_ANALYSIS On -family "Cyclone V"
set_global_assignment -name TIMING_ANALYZER_DO_REPORT_TIMING Off
set_global_assignment -name TIMING_ANALYZER_REPORT_WORST_CASE_TIMING_PATHS Off -family "Arria V"
set_global_assignment -name TIMING_ANALYZER_REPORT_WORST_CASE_TIMING_PATHS On -family "Cyclone 10 LP"
set_global_assignment -name TIMING_ANALYZER_REPORT_WORST_CASE_TIMING_PATHS Off -family "MAX 10"
set_global_assignment -name TIMING_ANALYZER_REPORT_WORST_CASE_TIMING_PATHS Off -family "Stratix IV"
set_global_assignment -name TIMING_ANALYZER_REPORT_WORST_CASE_TIMING_PATHS On -family "Cyclone IV E"
set_global_assignment -name TIMING_ANALYZER_REPORT_WORST_CASE_TIMING_PATHS Off -family "Arria 10"
set_global_assignment -name TIMING_ANALYZER_REPORT_WORST_CASE_TIMING_PATHS On -family "MAX V"
set_global_assignment -name TIMING_ANALYZER_REPORT_WORST_CASE_TIMING_PATHS Off -family "Stratix V"
set_global_assignment -name TIMING_ANALYZER_REPORT_WORST_CASE_TIMING_PATHS Off -family "Arria V GZ"
set_global_assignment -name TIMING_ANALYZER_REPORT_WORST_CASE_TIMING_PATHS On -family "MAX II"
set_global_assignment -name TIMING_ANALYZER_REPORT_WORST_CASE_TIMING_PATHS Off -family "Arria II GX"
set_global_assignment -name TIMING_ANALYZER_REPORT_WORST_CASE_TIMING_PATHS Off -family "Arria II GZ"
set_global_assignment -name TIMING_ANALYZER_REPORT_WORST_CASE_TIMING_PATHS On -family "Cyclone IV GX"
set_global_assignment -name TIMING_ANALYZER_REPORT_WORST_CASE_TIMING_PATHS Off -family "Cyclone V"
set_global_assignment -name TIMING_ANALYZER_REPORT_NUM_WORST_CASE_TIMING_PATHS 100
set_global_assignment -name TIMING_ANALYZER_DO_CCPP_REMOVAL On -family "Arria V"
set_global_assignment -name TIMING_ANALYZER_DO_CCPP_REMOVAL On -family "Cyclone 10 LP"
set_global_assignment -name TIMING_ANALYZER_DO_CCPP_REMOVAL On -family "MAX 10"
set_global_assignment -name TIMING_ANALYZER_DO_CCPP_REMOVAL On -family "Cyclone IV E"
set_global_assignment -name TIMING_ANALYZER_DO_CCPP_REMOVAL On -family "Stratix IV"
set_global_assignment -name TIMING_ANALYZER_DO_CCPP_REMOVAL On -family "Arria 10"
set_global_assignment -name TIMING_ANALYZER_DO_CCPP_REMOVAL Off -family "MAX V"
set_global_assignment -name TIMING_ANALYZER_DO_CCPP_REMOVAL On -family "Stratix V"
set_global_assignment -name TIMING_ANALYZER_DO_CCPP_REMOVAL On -family "Arria V GZ"
set_global_assignment -name TIMING_ANALYZER_DO_CCPP_REMOVAL Off -family "MAX II"
set_global_assignment -name TIMING_ANALYZER_DO_CCPP_REMOVAL On -family "Arria II GX"
set_global_assignment -name TIMING_ANALYZER_DO_CCPP_REMOVAL On -family "Arria II GZ"
set_global_assignment -name TIMING_ANALYZER_DO_CCPP_REMOVAL On -family "Cyclone IV GX"
set_global_assignment -name TIMING_ANALYZER_DO_CCPP_REMOVAL On -family "Cyclone V"
set_global_assignment -name OPTIMIZATION_MODE Balanced
set_global_assignment -name ALLOW_REGISTER_MERGING On
set_global_assignment -name ALLOW_REGISTER_DUPLICATION On
set_global_assignment -name DISABLE_LEGACY_TIMING_ANALYZER OFF -family "Arria V"
set_global_assignment -name DISABLE_LEGACY_TIMING_ANALYZER ON -family "Cyclone 10 LP"
set_global_assignment -name DISABLE_LEGACY_TIMING_ANALYZER OFF -family "MAX 10"
set_global_assignment -name DISABLE_LEGACY_TIMING_ANALYZER OFF -family "Stratix IV"
set_global_assignment -name DISABLE_LEGACY_TIMING_ANALYZER OFF -family "Cyclone IV E"
set_global_assignment -name DISABLE_LEGACY_TIMING_ANALYZER ON -family "Arria 10"
set_global_assignment -name DISABLE_LEGACY_TIMING_ANALYZER OFF -family "MAX V"
set_global_assignment -name DISABLE_LEGACY_TIMING_ANALYZER OFF -family "Stratix V"
set_global_assignment -name DISABLE_LEGACY_TIMING_ANALYZER OFF -family "Arria V GZ"
set_global_assignment -name DISABLE_LEGACY_TIMING_ANALYZER OFF -family "MAX II"
set_global_assignment -name DISABLE_LEGACY_TIMING_ANALYZER OFF -family "Arria II GX"
set_global_assignment -name DISABLE_LEGACY_TIMING_ANALYZER OFF -family "Arria II GZ"
set_global_assignment -name DISABLE_LEGACY_TIMING_ANALYZER OFF -family "Cyclone IV GX"
set_global_assignment -name DISABLE_LEGACY_TIMING_ANALYZER OFF -family "Cyclone V"
set_global_assignment -name MUX_RESTRUCTURE Auto
set_global_assignment -name MLAB_ADD_TIMING_CONSTRAINTS_FOR_MIXED_PORT_FEED_THROUGH_MODE_SETTING_DONT_CARE Off
set_global_assignment -name ENABLE_IP_DEBUG Off
set_global_assignment -name SAVE_DISK_SPACE On
set_global_assignment -name OCP_HW_EVAL -value OFF
set_global_assignment -name DEVICE_FILTER_PACKAGE Any
set_global_assignment -name DEVICE_FILTER_PIN_COUNT Any
set_global_assignment -name DEVICE_FILTER_SPEED_GRADE Any
set_global_assignment -name EDA_DESIGN_ENTRY_SYNTHESIS_TOOL "<None>"
set_global_assignment -name VERILOG_INPUT_VERSION Verilog_2001
set_global_assignment -name VHDL_INPUT_VERSION VHDL_1993
set_global_assignment -name FAMILY -value "Cyclone V"
set_global_assignment -name TRUE_WYSIWYG_FLOW Off
set_global_assignment -name SMART_COMPILE_IGNORES_TDC_FOR_STRATIX_PLL_CHANGES Off
set_global_assignment -name STATE_MACHINE_PROCESSING Auto
set_global_assignment -name SAFE_STATE_MACHINE Off
set_global_assignment -name EXTRACT_VERILOG_STATE_MACHINES On
set_global_assignment -name EXTRACT_VHDL_STATE_MACHINES On
set_global_assignment -name IGNORE_VERILOG_INITIAL_CONSTRUCTS Off
set_global_assignment -name VERILOG_CONSTANT_LOOP_LIMIT 5000
set_global_assignment -name VERILOG_NON_CONSTANT_LOOP_LIMIT 250
set_global_assignment -name INFER_RAMS_FROM_RAW_LOGIC On
set_global_assignment -name PARALLEL_SYNTHESIS On
set_global_assignment -name DSP_BLOCK_BALANCING Auto
set_global_assignment -name MAX_BALANCING_DSP_BLOCKS "-1 (Unlimited)"
set_global_assignment -name NOT_GATE_PUSH_BACK On
set_global_assignment -name ALLOW_POWER_UP_DONT_CARE On
set_global_assignment -name REMOVE_REDUNDANT_LOGIC_CELLS Off
set_global_assignment -name REMOVE_DUPLICATE_REGISTERS On
set_global_assignment -name IGNORE_CARRY_BUFFERS Off
set_global_assignment -name IGNORE_CASCADE_BUFFERS Off
set_global_assignment -name IGNORE_GLOBAL_BUFFERS Off
set_global_assignment -name IGNORE_ROW_GLOBAL_BUFFERS Off
set_global_assignment -name IGNORE_LCELL_BUFFERS Off
set_global_assignment -name MAX7000_IGNORE_LCELL_BUFFERS AUTO
set_global_assignment -name IGNORE_SOFT_BUFFERS On
set_global_assignment -name MAX7000_IGNORE_SOFT_BUFFERS Off
set_global_assignment -name LIMIT_AHDL_INTEGERS_TO_32_BITS Off
set_global_assignment -name AUTO_GLOBAL_CLOCK_MAX On
set_global_assignment -name AUTO_GLOBAL_OE_MAX On
set_global_assignment -name MAX_AUTO_GLOBAL_REGISTER_CONTROLS On
set_global_assignment -name AUTO_IMPLEMENT_IN_ROM Off
set_global_assignment -name APEX20K_TECHNOLOGY_MAPPER Lut
set_global_assignment -name OPTIMIZATION_TECHNIQUE Balanced
set_global_assignment -name STRATIXII_OPTIMIZATION_TECHNIQUE Balanced
set_global_assignment -name CYCLONE_OPTIMIZATION_TECHNIQUE Balanced
set_global_assignment -name CYCLONEII_OPTIMIZATION_TECHNIQUE Balanced
set_global_assignment -name STRATIX_OPTIMIZATION_TECHNIQUE Balanced
set_global_assignment -name MAXII_OPTIMIZATION_TECHNIQUE Balanced
set_global_assignment -name MAX7000_OPTIMIZATION_TECHNIQUE Speed
set_global_assignment -name APEX20K_OPTIMIZATION_TECHNIQUE Balanced
set_global_assignment -name MERCURY_OPTIMIZATION_TECHNIQUE Area
set_global_assignment -name FLEX6K_OPTIMIZATION_TECHNIQUE Area
set_global_assignment -name FLEX10K_OPTIMIZATION_TECHNIQUE Area
set_global_assignment -name ALLOW_XOR_GATE_USAGE On
set_global_assignment -name AUTO_LCELL_INSERTION On
set_global_assignment -name CARRY_CHAIN_LENGTH 48
set_global_assignment -name FLEX6K_CARRY_CHAIN_LENGTH 32
set_global_assignment -name FLEX10K_CARRY_CHAIN_LENGTH 32
set_global_assignment -name MERCURY_CARRY_CHAIN_LENGTH 48
set_global_assignment -name STRATIX_CARRY_CHAIN_LENGTH 70
set_global_assignment -name STRATIXII_CARRY_CHAIN_LENGTH 70
set_global_assignment -name CASCADE_CHAIN_LENGTH 2
set_global_assignment -name PARALLEL_EXPANDER_CHAIN_LENGTH 16
set_global_assignment -name MAX7000_PARALLEL_EXPANDER_CHAIN_LENGTH 4
set_global_assignment -name AUTO_CARRY_CHAINS On
set_global_assignment -name AUTO_CASCADE_CHAINS On
set_global_assignment -name AUTO_PARALLEL_EXPANDERS On
set_global_assignment -name AUTO_OPEN_DRAIN_PINS On
set_global_assignment -name ADV_NETLIST_OPT_SYNTH_WYSIWYG_REMAP Off
set_global_assignment -name AUTO_ROM_RECOGNITION On
set_global_assignment -name AUTO_RAM_RECOGNITION On
set_global_assignment -name AUTO_DSP_RECOGNITION On
set_global_assignment -name AUTO_SHIFT_REGISTER_RECOGNITION Auto
set_global_assignment -name ALLOW_SHIFT_REGISTER_MERGING_ACROSS_HIERARCHIES Auto
set_global_assignment -name AUTO_CLOCK_ENABLE_RECOGNITION On
set_global_assignment -name STRICT_RAM_RECOGNITION Off
set_global_assignment -name ALLOW_SYNCH_CTRL_USAGE On
set_global_assignment -name FORCE_SYNCH_CLEAR Off
set_global_assignment -name AUTO_RAM_BLOCK_BALANCING On
set_global_assignment -name AUTO_RAM_TO_LCELL_CONVERSION Off
set_global_assignment -name AUTO_RESOURCE_SHARING Off
set_global_assignment -name ALLOW_ANY_SHIFT_REGISTER_SIZE_FOR_RECOGNITION Off
set_global_assignment -name MAX7000_FANIN_PER_CELL 100
set_global_assignment -name USE_LOGICLOCK_CONSTRAINTS_IN_BALANCING On
set_global_assignment -name MAX_RAM_BLOCKS_M512 "-1 (Unlimited)"
set_global_assignment -name MAX_RAM_BLOCKS_M4K "-1 (Unlimited)"
set_global_assignment -name MAX_RAM_BLOCKS_MRAM "-1 (Unlimited)"
set_global_assignment -name IGNORE_TRANSLATE_OFF_AND_SYNTHESIS_OFF Off
set_global_assignment -name STRATIXGX_BYPASS_REMAPPING_OF_FORCE_SIGNAL_DETECT_SIGNAL_THRESHOLD_SELECT Off
set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "Arria II GZ"
set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "Arria V"
set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "Cyclone 10 LP"
set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "MAX 10"
set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "Cyclone IV GX"
set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "Stratix IV"
set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "Cyclone IV E"
set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "Arria 10"
set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "Stratix V"
set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "Arria V GZ"
set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "Cyclone V"
set_global_assignment -name SYNTH_TIMING_DRIVEN_SYNTHESIS On -family "Arria II GX"
set_global_assignment -name REPORT_PARAMETER_SETTINGS On
set_global_assignment -name REPORT_SOURCE_ASSIGNMENTS On
set_global_assignment -name REPORT_CONNECTIVITY_CHECKS On
set_global_assignment -name IGNORE_MAX_FANOUT_ASSIGNMENTS Off
set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 3 -family "Arria V"
set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 2 -family "Cyclone 10 LP"
set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 2 -family "MAX 10"
set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 2 -family "Cyclone IV E"
set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 3 -family "Stratix IV"
set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 3 -family "Arria 10"
set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 2 -family "MAX V"
set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 3 -family "Stratix V"
set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 2 -family "MAX II"
set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 3 -family "Arria V GZ"
set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 3 -family "Arria II GX"
set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 3 -family "Arria II GZ"
set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 2 -family "Cyclone IV GX"
set_global_assignment -name SYNCHRONIZATION_REGISTER_CHAIN_LENGTH 3 -family "Cyclone V"
set_global_assignment -name OPTIMIZE_POWER_DURING_SYNTHESIS "Normal compilation"
set_global_assignment -name HDL_MESSAGE_LEVEL Level2
set_global_assignment -name USE_HIGH_SPEED_ADDER Auto
set_global_assignment -name NUMBER_OF_PROTECTED_REGISTERS_REPORTED 100
set_global_assignment -name NUMBER_OF_REMOVED_REGISTERS_REPORTED 5000
set_global_assignment -name NUMBER_OF_SYNTHESIS_MIGRATION_ROWS 5000
set_global_assignment -name SYNTHESIS_S10_MIGRATION_CHECKS Off
set_global_assignment -name NUMBER_OF_SWEPT_NODES_REPORTED 5000
set_global_assignment -name NUMBER_OF_INVERTED_REGISTERS_REPORTED 100
set_global_assignment -name SYNTH_CLOCK_MUX_PROTECTION On
set_global_assignment -name SYNTH_GATED_CLOCK_CONVERSION Off
set_global_assignment -name BLOCK_DESIGN_NAMING Auto
set_global_assignment -name SYNTH_PROTECT_SDC_CONSTRAINT Off
set_global_assignment -name SYNTHESIS_EFFORT Auto
set_global_assignment -name SHIFT_REGISTER_RECOGNITION_ACLR_SIGNAL On
set_global_assignment -name PRE_MAPPING_RESYNTHESIS Off
set_global_assignment -name SYNTH_MESSAGE_LEVEL Medium
set_global_assignment -name DISABLE_REGISTER_MERGING_ACROSS_HIERARCHIES Auto
set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "Arria II GZ"
set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "Arria V"
set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "Cyclone 10 LP"
set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "MAX 10"
set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "Cyclone IV GX"
set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "Stratix IV"
set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "Cyclone IV E"
set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "Arria 10"
set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "Stratix V"
set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "Arria V GZ"
set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "Cyclone V"
set_global_assignment -name SYNTH_RESOURCE_AWARE_INFERENCE_FOR_BLOCK_RAM On -family "Arria II GX"
set_global_assignment -name MAX_LABS "-1 (Unlimited)"
set_global_assignment -name RBCGEN_CRITICAL_WARNING_TO_ERROR On
set_global_assignment -name MAX_NUMBER_OF_REGISTERS_FROM_UNINFERRED_RAMS "-1 (Unlimited)"
set_global_assignment -name AUTO_PARALLEL_SYNTHESIS On
set_global_assignment -name PRPOF_ID Off
set_global_assignment -name DISABLE_DSP_NEGATE_INFERENCING Off
set_global_assignment -name REPORT_PARAMETER_SETTINGS_PRO On
set_global_assignment -name REPORT_SOURCE_ASSIGNMENTS_PRO On
set_global_assignment -name ENABLE_STATE_MACHINE_INFERENCE Off
set_global_assignment -name FLEX10K_ENABLE_LOCK_OUTPUT Off
set_global_assignment -name AUTO_MERGE_PLLS On
set_global_assignment -name IGNORE_MODE_FOR_MERGE Off
set_global_assignment -name TXPMA_SLEW_RATE Low
set_global_assignment -name ADCE_ENABLED Auto
set_global_assignment -name ROUTER_TIMING_OPTIMIZATION_LEVEL Normal
set_global_assignment -name ROUTER_CLOCKING_TOPOLOGY_ANALYSIS Off
set_global_assignment -name PLACEMENT_EFFORT_MULTIPLIER 1.0
set_global_assignment -name ROUTER_EFFORT_MULTIPLIER 1.0
set_global_assignment -name FIT_ATTEMPTS_TO_SKIP 0.0
set_global_assignment -name PHYSICAL_SYNTHESIS Off
set_global_assignment -name ECO_ALLOW_ROUTING_CHANGES Off
set_global_assignment -name DEVICE AUTO
set_global_assignment -name BASE_PIN_OUT_FILE_ON_SAMEFRAME_DEVICE Off
set_global_assignment -name ENABLE_JTAG_BST_SUPPORT Off
set_global_assignment -name MAX7000_ENABLE_JTAG_BST_SUPPORT On
set_global_assignment -name ENABLE_NCEO_OUTPUT Off
set_global_assignment -name RESERVE_NCEO_AFTER_CONFIGURATION "Use as regular IO"
set_global_assignment -name CYCLONEII_RESERVE_NCEO_AFTER_CONFIGURATION "Use as programming pin"
set_global_assignment -name STRATIXIII_UPDATE_MODE Standard
set_global_assignment -name STRATIX_UPDATE_MODE Standard
set_global_assignment -name INTERNAL_FLASH_UPDATE_MODE "Single Image"
set_global_assignment -name CVP_MODE Off
set_global_assignment -name STRATIXV_CONFIGURATION_SCHEME "Passive Serial" -family "Arria V"
set_global_assignment -name STRATIXV_CONFIGURATION_SCHEME "Passive Serial" -family "Arria 10"
set_global_assignment -name STRATIXV_CONFIGURATION_SCHEME "Passive Serial" -family "Stratix V"
set_global_assignment -name STRATIXV_CONFIGURATION_SCHEME "Passive Serial" -family "Arria V GZ"
set_global_assignment -name STRATIXV_CONFIGURATION_SCHEME "Passive Serial" -family "Cyclone V"
set_global_assignment -name VID_OPERATION_MODE "PMBus Slave"
set_global_assignment -name USE_CONF_DONE AUTO
set_global_assignment -name USE_PWRMGT_SCL AUTO
set_global_assignment -name USE_PWRMGT_SDA AUTO
set_global_assignment -name USE_PWRMGT_ALERT AUTO
set_global_assignment -name USE_INIT_DONE AUTO
set_global_assignment -name USE_CVP_CONFDONE AUTO
set_global_assignment -name USE_SEU_ERROR AUTO
set_global_assignment -name RESERVE_AVST_CLK_AFTER_CONFIGURATION "Use as regular IO"
set_global_assignment -name RESERVE_AVST_VALID_AFTER_CONFIGURATION "Use as regular IO"
set_global_assignment -name RESERVE_AVST_DATA15_THROUGH_DATA0_AFTER_CONFIGURATION "Use as regular IO"
set_global_assignment -name RESERVE_AVST_DATA31_THROUGH_DATA16_AFTER_CONFIGURATION "Use as regular IO"
set_global_assignment -name STRATIXIII_CONFIGURATION_SCHEME "Passive Serial"
set_global_assignment -name MAX10FPGA_CONFIGURATION_SCHEME "Internal Configuration"
set_global_assignment -name CYCLONEIII_CONFIGURATION_SCHEME "Active Serial"
set_global_assignment -name STRATIXII_CONFIGURATION_SCHEME "Passive Serial"
set_global_assignment -name CYCLONEII_CONFIGURATION_SCHEME "Active Serial"
set_global_assignment -name APEX20K_CONFIGURATION_SCHEME "Passive Serial"
set_global_assignment -name STRATIX_CONFIGURATION_SCHEME "Passive Serial"
set_global_assignment -name CYCLONE_CONFIGURATION_SCHEME "Active Serial"
set_global_assignment -name MERCURY_CONFIGURATION_SCHEME "Passive Serial"
set_global_assignment -name FLEX6K_CONFIGURATION_SCHEME "Passive Serial"
set_global_assignment -name FLEX10K_CONFIGURATION_SCHEME "Passive Serial"
set_global_assignment -name APEXII_CONFIGURATION_SCHEME "Passive Serial"
set_global_assignment -name USER_START_UP_CLOCK Off
set_global_assignment -name ENABLE_UNUSED_RX_CLOCK_WORKAROUND Off
set_global_assignment -name PRESERVE_UNUSED_XCVR_CHANNEL Off
set_global_assignment -name IGNORE_HSSI_COLUMN_POWER_WHEN_PRESERVING_UNUSED_XCVR_CHANNELS On
set_global_assignment -name AUTO_RESERVE_CLKUSR_FOR_CALIBRATION On
set_global_assignment -name DEVICE_INITIALIZATION_CLOCK INIT_INTOSC
set_global_assignment -name ENABLE_VREFA_PIN Off
set_global_assignment -name ENABLE_VREFB_PIN Off
set_global_assignment -name ALWAYS_ENABLE_INPUT_BUFFERS Off
set_global_assignment -name ENABLE_ASMI_FOR_FLASH_LOADER Off
set_global_assignment -name ENABLE_DEVICE_WIDE_RESET Off
set_global_assignment -name ENABLE_DEVICE_WIDE_OE Off
set_global_assignment -name RESERVE_ALL_UNUSED_PINS "As output driving ground"
set_global_assignment -name ENABLE_INIT_DONE_OUTPUT Off
set_global_assignment -name INIT_DONE_OPEN_DRAIN On
set_global_assignment -name RESERVE_NWS_NRS_NCS_CS_AFTER_CONFIGURATION "Use as regular IO"
set_global_assignment -name RESERVE_RDYNBUSY_AFTER_CONFIGURATION "Use as regular IO"
set_global_assignment -name RESERVE_DATA31_THROUGH_DATA16_AFTER_CONFIGURATION "Use as regular IO"
set_global_assignment -name RESERVE_DATA15_THROUGH_DATA8_AFTER_CONFIGURATION "Use as regular IO"
set_global_assignment -name RESERVE_DATA7_THROUGH_DATA1_AFTER_CONFIGURATION "Use as regular IO"
set_global_assignment -name RESERVE_DATA0_AFTER_CONFIGURATION "As input tri-stated"
set_global_assignment -name RESERVE_DATA1_AFTER_CONFIGURATION "As input tri-stated"
set_global_assignment -name RESERVE_DATA7_THROUGH_DATA2_AFTER_CONFIGURATION "Use as regular IO"
set_global_assignment -name RESERVE_DATA7_THROUGH_DATA5_AFTER_CONFIGURATION "Use as regular IO"
set_global_assignment -name RESERVE_FLASH_NCE_AFTER_CONFIGURATION "As input tri-stated"
set_global_assignment -name RESERVE_OTHER_AP_PINS_AFTER_CONFIGURATION "Use as regular IO"
set_global_assignment -name RESERVE_DCLK_AFTER_CONFIGURATION "Use as programming pin"
set_global_assignment -name ENABLE_CONFIGURATION_PINS On
set_global_assignment -name ENABLE_JTAG_PIN_SHARING Off
set_global_assignment -name ENABLE_NCE_PIN Off
set_global_assignment -name ENABLE_BOOT_SEL_PIN On
set_global_assignment -name CRC_ERROR_CHECKING Off
set_global_assignment -name INTERNAL_SCRUBBING Off
set_global_assignment -name PR_ERROR_OPEN_DRAIN On
set_global_assignment -name PR_READY_OPEN_DRAIN On
set_global_assignment -name ENABLE_CVP_CONFDONE Off
set_global_assignment -name CVP_CONFDONE_OPEN_DRAIN On
set_global_assignment -name ENABLE_NCONFIG_FROM_CORE On
set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "Arria II GZ"
set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "Arria V"
set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "Cyclone 10 LP"
set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "MAX 10"
set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "Cyclone IV GX"
set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "Stratix IV"
set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "Cyclone IV E"
set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "Arria 10"
set_global_assignment -name OPTIMIZE_HOLD_TIMING "IO Paths and Minimum TPD Paths" -family "MAX V"
set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "Stratix V"
set_global_assignment -name OPTIMIZE_HOLD_TIMING "IO Paths and Minimum TPD Paths" -family "MAX II"
set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "Arria V GZ"
set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "Cyclone V"
set_global_assignment -name OPTIMIZE_HOLD_TIMING "All Paths" -family "Arria II GX"
set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "Arria V"
set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "Cyclone 10 LP"
set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "MAX 10"
set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "Cyclone IV E"
set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "Stratix IV"
set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "Arria 10"
set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING Off -family "MAX V"
set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "Stratix V"
set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "Arria V GZ"
set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING Off -family "MAX II"
set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "Arria II GX"
set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "Arria II GZ"
set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "Cyclone IV GX"
set_global_assignment -name OPTIMIZE_MULTI_CORNER_TIMING On -family "Cyclone V"
set_global_assignment -name BLOCK_RAM_TO_MLAB_CELL_CONVERSION On
set_global_assignment -name BLOCK_RAM_AND_MLAB_EQUIVALENT_POWER_UP_CONDITIONS Auto
set_global_assignment -name BLOCK_RAM_AND_MLAB_EQUIVALENT_PAUSED_READ_CAPABILITIES Care
set_global_assignment -name PROGRAMMABLE_POWER_TECHNOLOGY_SETTING Automatic -family "Stratix IV"
set_global_assignment -name PROGRAMMABLE_POWER_TECHNOLOGY_SETTING Automatic -family "Arria 10"
set_global_assignment -name PROGRAMMABLE_POWER_TECHNOLOGY_SETTING Automatic -family "Stratix V"
set_global_assignment -name PROGRAMMABLE_POWER_TECHNOLOGY_SETTING Automatic -family "Arria V GZ"
set_global_assignment -name PROGRAMMABLE_POWER_MAXIMUM_HIGH_SPEED_FRACTION_OF_USED_LAB_TILES 1.0
set_global_assignment -name GUARANTEE_MIN_DELAY_CORNER_IO_ZERO_HOLD_TIME On
set_global_assignment -name OPTIMIZE_POWER_DURING_FITTING "Normal compilation"
set_global_assignment -name OPTIMIZE_SSN Off
set_global_assignment -name OPTIMIZE_TIMING "Normal compilation"
set_global_assignment -name ECO_OPTIMIZE_TIMING Off
set_global_assignment -name ECO_REGENERATE_REPORT Off
set_global_assignment -name OPTIMIZE_IOC_REGISTER_PLACEMENT_FOR_TIMING Normal
set_global_assignment -name FIT_ONLY_ONE_ATTEMPT Off
set_global_assignment -name FINAL_PLACEMENT_OPTIMIZATION Automatically
set_global_assignment -name FITTER_AGGRESSIVE_ROUTABILITY_OPTIMIZATION Automatically
set_global_assignment -name SEED 1
set_global_assignment -name PERIPHERY_TO_CORE_PLACEMENT_AND_ROUTING_OPTIMIZATION OFF
set_global_assignment -name RESERVE_ROUTING_OUTPUT_FLEXIBILITY Off
set_global_assignment -name SLOW_SLEW_RATE Off
set_global_assignment -name PCI_IO Off
set_global_assignment -name TURBO_BIT On
set_global_assignment -name WEAK_PULL_UP_RESISTOR Off
set_global_assignment -name ENABLE_BUS_HOLD_CIRCUITRY Off
set_global_assignment -name AUTO_GLOBAL_MEMORY_CONTROLS Off
set_global_assignment -name MIGRATION_CONSTRAIN_CORE_RESOURCES On
set_global_assignment -name QII_AUTO_PACKED_REGISTERS Auto
set_global_assignment -name AUTO_PACKED_REGISTERS_MAX Auto
set_global_assignment -name NORMAL_LCELL_INSERT On
set_global_assignment -name CARRY_OUT_PINS_LCELL_INSERT On
set_global_assignment -name AUTO_DELAY_CHAINS On -family "Arria V"
set_global_assignment -name AUTO_DELAY_CHAINS On -family "Cyclone 10 LP"
set_global_assignment -name AUTO_DELAY_CHAINS On -family "MAX 10"
set_global_assignment -name AUTO_DELAY_CHAINS On -family "Stratix IV"
set_global_assignment -name AUTO_DELAY_CHAINS On -family "Cyclone IV E"
set_global_assignment -name AUTO_DELAY_CHAINS On -family "Arria 10"
set_global_assignment -name AUTO_DELAY_CHAINS On -family "MAX V"
set_global_assignment -name AUTO_DELAY_CHAINS On -family "Stratix V"
set_global_assignment -name AUTO_DELAY_CHAINS On -family "MAX II"
set_global_assignment -name AUTO_DELAY_CHAINS On -family "Arria V GZ"
set_global_assignment -name AUTO_DELAY_CHAINS On -family "Arria II GX"
set_global_assignment -name AUTO_DELAY_CHAINS On -family "Arria II GZ"
set_global_assignment -name AUTO_DELAY_CHAINS On -family "Cyclone IV GX"
set_global_assignment -name AUTO_DELAY_CHAINS On -family "Cyclone V"
set_global_assignment -name AUTO_DELAY_CHAINS_FOR_HIGH_FANOUT_INPUT_PINS OFF
set_global_assignment -name XSTL_INPUT_ALLOW_SE_BUFFER Off
set_global_assignment -name TREAT_BIDIR_AS_OUTPUT Off
set_global_assignment -name AUTO_TURBO_BIT ON
set_global_assignment -name PHYSICAL_SYNTHESIS_COMBO_LOGIC_FOR_AREA Off
set_global_assignment -name PHYSICAL_SYNTHESIS_COMBO_LOGIC Off
set_global_assignment -name PHYSICAL_SYNTHESIS_LOG_FILE Off
set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_DUPLICATION Off
set_global_assignment -name PHYSICAL_SYNTHESIS_MAP_LOGIC_TO_MEMORY_FOR_AREA Off
set_global_assignment -name PHYSICAL_SYNTHESIS_REGISTER_RETIMING Off
set_global_assignment -name PHYSICAL_SYNTHESIS_ASYNCHRONOUS_SIGNAL_PIPELINING Off
set_global_assignment -name IO_PLACEMENT_OPTIMIZATION On
set_global_assignment -name ALLOW_LVTTL_LVCMOS_INPUT_LEVELS_TO_OVERDRIVE_INPUT_BUFFER Off
set_global_assignment -name OVERRIDE_DEFAULT_ELECTROMIGRATION_PARAMETERS Off
set_global_assignment -name FITTER_EFFORT "Auto Fit"
set_global_assignment -name FITTER_AUTO_EFFORT_DESIRED_SLACK_MARGIN 0ns
set_global_assignment -name PHYSICAL_SYNTHESIS_EFFORT Normal
set_global_assignment -name ROUTER_LCELL_INSERTION_AND_LOGIC_DUPLICATION Auto
set_global_assignment -name ROUTER_REGISTER_DUPLICATION Auto
set_global_assignment -name STRATIXGX_ALLOW_CLOCK_FANOUT_WITH_ANALOG_RESET Off
set_global_assignment -name AUTO_GLOBAL_CLOCK On
set_global_assignment -name AUTO_GLOBAL_OE On
set_global_assignment -name AUTO_GLOBAL_REGISTER_CONTROLS On
set_global_assignment -name FITTER_EARLY_TIMING_ESTIMATE_MODE Realistic
set_global_assignment -name STRATIXGX_ALLOW_GIGE_UNDER_FULL_DATARATE_RANGE Off
set_global_assignment -name STRATIXGX_ALLOW_RX_CORECLK_FROM_NON_RX_CLKOUT_SOURCE_IN_DOUBLE_DATA_WIDTH_MODE Off
set_global_assignment -name STRATIXGX_ALLOW_GIGE_IN_DOUBLE_DATA_WIDTH_MODE Off
set_global_assignment -name STRATIXGX_ALLOW_PARALLEL_LOOPBACK_IN_DOUBLE_DATA_WIDTH_MODE Off
set_global_assignment -name STRATIXGX_ALLOW_XAUI_IN_SINGLE_DATA_WIDTH_MODE Off
set_global_assignment -name STRATIXGX_ALLOW_XAUI_WITH_CORECLK_SELECTED_AT_RATE_MATCHER Off
set_global_assignment -name STRATIXGX_ALLOW_XAUI_WITH_RX_CORECLK_FROM_NON_TXPLL_SOURCE Off
set_global_assignment -name STRATIXGX_ALLOW_GIGE_WITH_CORECLK_SELECTED_AT_RATE_MATCHER Off
set_global_assignment -name STRATIXGX_ALLOW_GIGE_WITHOUT_8B10B Off
set_global_assignment -name STRATIXGX_ALLOW_GIGE_WITH_RX_CORECLK_FROM_NON_TXPLL_SOURCE Off
set_global_assignment -name STRATIXGX_ALLOW_POST8B10B_LOOPBACK Off
set_global_assignment -name STRATIXGX_ALLOW_REVERSE_PARALLEL_LOOPBACK Off
set_global_assignment -name STRATIXGX_ALLOW_USE_OF_GXB_COUPLED_IOS Off
set_global_assignment -name GENERATE_GXB_RECONFIG_MIF Off
set_global_assignment -name GENERATE_GXB_RECONFIG_MIF_WITH_PLL Off
set_global_assignment -name RESERVE_ALL_UNUSED_PINS_WEAK_PULLUP "As input tri-stated with weak pull-up"
set_global_assignment -name ENABLE_HOLD_BACK_OFF On
set_global_assignment -name CONFIGURATION_VCCIO_LEVEL Auto
set_global_assignment -name FORCE_CONFIGURATION_VCCIO Off
set_global_assignment -name SYNCHRONIZER_IDENTIFICATION Auto
set_global_assignment -name ENABLE_BENEFICIAL_SKEW_OPTIMIZATION On
set_global_assignment -name OPTIMIZE_FOR_METASTABILITY On
set_global_assignment -name CRC_ERROR_OPEN_DRAIN On -family "Arria V"
set_global_assignment -name CRC_ERROR_OPEN_DRAIN Off -family "Cyclone 10 LP"
set_global_assignment -name CRC_ERROR_OPEN_DRAIN Off -family "MAX 10"
set_global_assignment -name CRC_ERROR_OPEN_DRAIN Off -family "Cyclone IV E"
set_global_assignment -name CRC_ERROR_OPEN_DRAIN On -family "Arria 10"
set_global_assignment -name CRC_ERROR_OPEN_DRAIN On -family "Stratix V"
set_global_assignment -name CRC_ERROR_OPEN_DRAIN On -family "Arria V GZ"
set_global_assignment -name CRC_ERROR_OPEN_DRAIN On -family "Cyclone V"
set_global_assignment -name MAX_GLOBAL_CLOCKS_ALLOWED "-1 (Unlimited)"
set_global_assignment -name MAX_REGIONAL_CLOCKS_ALLOWED "-1 (Unlimited)"
set_global_assignment -name MAX_PERIPHERY_CLOCKS_ALLOWED "-1 (Unlimited)"
set_global_assignment -name MAX_CLOCKS_ALLOWED "-1 (Unlimited)"
set_global_assignment -name ACTIVE_SERIAL_CLOCK FREQ_100MHz -family "Arria 10"
set_global_assignment -name ACTIVE_SERIAL_CLOCK FREQ_100MHz -family "Arria V"
set_global_assignment -name ACTIVE_SERIAL_CLOCK FREQ_100MHz -family "Stratix V"
set_global_assignment -name ACTIVE_SERIAL_CLOCK FREQ_40MHz -family "Cyclone IV GX"
set_global_assignment -name ACTIVE_SERIAL_CLOCK FREQ_100MHz -family "Arria V GZ"
set_global_assignment -name ACTIVE_SERIAL_CLOCK FREQ_100MHz -family "Cyclone V"
set_global_assignment -name ACTIVE_SERIAL_CLOCK FREQ_40MHz -family "Arria II GX"
set_global_assignment -name M144K_BLOCK_READ_CLOCK_DUTY_CYCLE_DEPENDENCY Off
set_global_assignment -name STRATIXIII_MRAM_COMPATIBILITY On
set_global_assignment -name FORCE_FITTER_TO_AVOID_PERIPHERY_PLACEMENT_WARNINGS Off
set_global_assignment -name AUTO_C3_M9K_BIT_SKIP Off
set_global_assignment -name PR_DONE_OPEN_DRAIN On
set_global_assignment -name NCEO_OPEN_DRAIN On
set_global_assignment -name ENABLE_CRC_ERROR_PIN Off
set_global_assignment -name ENABLE_PR_PINS Off
set_global_assignment -name RESERVE_PR_PINS Off
set_global_assignment -name CONVERT_PR_WARNINGS_TO_ERRORS Off
set_global_assignment -name PR_PINS_OPEN_DRAIN Off
set_global_assignment -name CLAMPING_DIODE Off
set_global_assignment -name TRI_STATE_SPI_PINS Off
set_global_assignment -name UNUSED_TSD_PINS_GND Off
set_global_assignment -name IMPLEMENT_MLAB_IN_16_BIT_DEEP_MODE Off
set_global_assignment -name FORM_DDR_CLUSTERING_CLIQUE Off
set_global_assignment -name ALM_REGISTER_PACKING_EFFORT Medium
set_global_assignment -name ADVANCED_PHYSICAL_OPTIMIZATION On -family "Arria V"
set_global_assignment -name ADVANCED_PHYSICAL_OPTIMIZATION Off -family "Stratix IV"
set_global_assignment -name ADVANCED_PHYSICAL_OPTIMIZATION On -family "Arria 10"
set_global_assignment -name ADVANCED_PHYSICAL_OPTIMIZATION On -family "Stratix V"
set_global_assignment -name ADVANCED_PHYSICAL_OPTIMIZATION On -family "Arria V GZ"
set_global_assignment -name ADVANCED_PHYSICAL_OPTIMIZATION On -family "Cyclone V"
set_global_assignment -name RELATIVE_NEUTRON_FLUX 1.0
set_global_assignment -name SEU_FIT_REPORT Off
set_global_assignment -name HYPER_RETIMER Off -family "Arria 10"
set_global_assignment -name HYPER_RETIMER_FAST_FORWARD_ADD_PIPELINING_MAX "-1"
set_global_assignment -name HYPER_RETIMER_FAST_FORWARD_ASYNCH_CLEAR Auto
set_global_assignment -name HYPER_RETIMER_FAST_FORWARD_USER_PRESERVE_RESTRICTION Auto
set_global_assignment -name HYPER_RETIMER_FAST_FORWARD_DSP_BLOCKS On
set_global_assignment -name HYPER_RETIMER_FAST_FORWARD_RAM_BLOCKS On
set_global_assignment -name EDA_SIMULATION_TOOL "<None>"
set_global_assignment -name EDA_TIMING_ANALYSIS_TOOL "<None>"
set_global_assignment -name EDA_BOARD_DESIGN_TIMING_TOOL "<None>"
set_global_assignment -name EDA_BOARD_DESIGN_SYMBOL_TOOL "<None>"
set_global_assignment -name EDA_BOARD_DESIGN_SIGNAL_INTEGRITY_TOOL "<None>"
set_global_assignment -name EDA_BOARD_DESIGN_BOUNDARY_SCAN_TOOL "<None>"
set_global_assignment -name EDA_BOARD_DESIGN_TOOL "<None>"
set_global_assignment -name EDA_FORMAL_VERIFICATION_TOOL "<None>"
set_global_assignment -name EDA_RESYNTHESIS_TOOL "<None>"
set_global_assignment -name ON_CHIP_BITSTREAM_DECOMPRESSION On
set_global_assignment -name COMPRESSION_MODE Off
set_global_assignment -name CLOCK_SOURCE Internal
set_global_assignment -name CONFIGURATION_CLOCK_FREQUENCY "10 MHz"
set_global_assignment -name CONFIGURATION_CLOCK_DIVISOR 1
set_global_assignment -name ENABLE_LOW_VOLTAGE_MODE_ON_CONFIG_DEVICE On
set_global_assignment -name FLEX6K_ENABLE_LOW_VOLTAGE_MODE_ON_CONFIG_DEVICE Off
set_global_assignment -name FLEX10K_ENABLE_LOW_VOLTAGE_MODE_ON_CONFIG_DEVICE On
set_global_assignment -name MAX7000S_JTAG_USER_CODE FFFF
set_global_assignment -name STRATIX_JTAG_USER_CODE FFFFFFFF
set_global_assignment -name APEX20K_JTAG_USER_CODE FFFFFFFF
set_global_assignment -name MERCURY_JTAG_USER_CODE FFFFFFFF
set_global_assignment -name FLEX10K_JTAG_USER_CODE 7F
set_global_assignment -name MAX7000_JTAG_USER_CODE FFFFFFFF
set_global_assignment -name MAX7000_USE_CHECKSUM_AS_USERCODE Off
set_global_assignment -name USE_CHECKSUM_AS_USERCODE On
set_global_assignment -name SECURITY_BIT Off
set_global_assignment -name USE_CONFIGURATION_DEVICE Off -family "Cyclone 10 LP"
set_global_assignment -name USE_CONFIGURATION_DEVICE On -family "MAX 10"
set_global_assignment -name USE_CONFIGURATION_DEVICE Off -family "Cyclone IV E"
set_global_assignment -name USE_CONFIGURATION_DEVICE Off -family "Stratix IV"
set_global_assignment -name USE_CONFIGURATION_DEVICE On -family "MAX V"
set_global_assignment -name USE_CONFIGURATION_DEVICE On -family "MAX II"
set_global_assignment -name USE_CONFIGURATION_DEVICE Off -family "Arria II GX"
set_global_assignment -name USE_CONFIGURATION_DEVICE Off -family "Arria II GZ"
set_global_assignment -name USE_CONFIGURATION_DEVICE Off -family "Cyclone IV GX"
set_global_assignment -name CYCLONEIII_CONFIGURATION_DEVICE Auto
set_global_assignment -name STRATIXII_CONFIGURATION_DEVICE Auto
set_global_assignment -name PWRMGT_SLAVE_DEVICE_TYPE "PV3102 or EM1130"
set_global_assignment -name PWRMGT_SLAVE_DEVICE0_ADDRESS 0000000
set_global_assignment -name PWRMGT_SLAVE_DEVICE1_ADDRESS 0000000
set_global_assignment -name PWRMGT_SLAVE_DEVICE2_ADDRESS 0000000
set_global_assignment -name PWRMGT_SLAVE_DEVICE3_ADDRESS 0000000
set_global_assignment -name PWRMGT_SLAVE_DEVICE4_ADDRESS 0000000
set_global_assignment -name PWRMGT_SLAVE_DEVICE5_ADDRESS 0000000
set_global_assignment -name PWRMGT_SLAVE_DEVICE6_ADDRESS 0000000
set_global_assignment -name PWRMGT_SLAVE_DEVICE7_ADDRESS 0000000
set_global_assignment -name PWRMGT_VOLTAGE_OUTPUT_FORMAT "Auto discovery"
set_global_assignment -name PWRMGT_DIRECT_FORMAT_COEFFICIENT_M 0
set_global_assignment -name PWRMGT_DIRECT_FORMAT_COEFFICIENT_B 0
set_global_assignment -name PWRMGT_DIRECT_FORMAT_COEFFICIENT_R 0
set_global_assignment -name APEX20K_CONFIGURATION_DEVICE Auto
set_global_assignment -name MERCURY_CONFIGURATION_DEVICE Auto
set_global_assignment -name FLEX6K_CONFIGURATION_DEVICE Auto
set_global_assignment -name FLEX10K_CONFIGURATION_DEVICE Auto
set_global_assignment -name CYCLONE_CONFIGURATION_DEVICE Auto
set_global_assignment -name STRATIX_CONFIGURATION_DEVICE Auto
set_global_assignment -name APEX20K_CONFIG_DEVICE_JTAG_USER_CODE FFFFFFFF
set_global_assignment -name STRATIX_CONFIG_DEVICE_JTAG_USER_CODE FFFFFFFF
set_global_assignment -name MERCURY_CONFIG_DEVICE_JTAG_USER_CODE FFFFFFFF
set_global_assignment -name FLEX10K_CONFIG_DEVICE_JTAG_USER_CODE FFFFFFFF
set_global_assignment -name EPROM_USE_CHECKSUM_AS_USERCODE Off
set_global_assignment -name AUTO_INCREMENT_CONFIG_DEVICE_JTAG_USER_CODE On
set_global_assignment -name DISABLE_NCS_AND_OE_PULLUPS_ON_CONFIG_DEVICE Off
set_global_assignment -name GENERATE_TTF_FILE Off
set_global_assignment -name GENERATE_RBF_FILE Off
set_global_assignment -name GENERATE_HEX_FILE Off
set_global_assignment -name HEXOUT_FILE_START_ADDRESS 0
set_global_assignment -name HEXOUT_FILE_COUNT_DIRECTION Up
set_global_assignment -name RESERVE_ALL_UNUSED_PINS_NO_OUTPUT_GND "As output driving an unspecified signal"
set_global_assignment -name RELEASE_CLEARS_BEFORE_TRI_STATES Off
set_global_assignment -name AUTO_RESTART_CONFIGURATION On
set_global_assignment -name HARDCOPYII_POWER_ON_EXTRA_DELAY Off
set_global_assignment -name STRATIXII_MRAM_COMPATIBILITY Off
set_global_assignment -name CYCLONEII_M4K_COMPATIBILITY On
set_global_assignment -name ENABLE_OCT_DONE Off -family "Arria V"
set_global_assignment -name ENABLE_OCT_DONE Off -family "Cyclone 10 LP"
set_global_assignment -name ENABLE_OCT_DONE On -family "MAX 10"
set_global_assignment -name ENABLE_OCT_DONE Off -family "Cyclone IV E"
set_global_assignment -name ENABLE_OCT_DONE Off -family "Arria 10"
set_global_assignment -name ENABLE_OCT_DONE Off -family "Stratix V"
set_global_assignment -name ENABLE_OCT_DONE Off -family "Arria V GZ"
set_global_assignment -name ENABLE_OCT_DONE Off -family "Arria II GX"
set_global_assignment -name ENABLE_OCT_DONE Off -family "Cyclone IV GX"
set_global_assignment -name ENABLE_OCT_DONE Off -family "Cyclone V"
set_global_assignment -name USE_CHECKERED_PATTERN_AS_UNINITIALIZED_RAM_CONTENT OFF
set_global_assignment -name ARRIAIIGX_RX_CDR_LOCKUP_FIX_OVERRIDE Off
set_global_assignment -name ENABLE_AUTONOMOUS_PCIE_HIP Off
set_global_assignment -name ENABLE_ADV_SEU_DETECTION Off
set_global_assignment -name POR_SCHEME "Instant ON"
set_global_assignment -name EN_USER_IO_WEAK_PULLUP On
set_global_assignment -name EN_SPI_IO_WEAK_PULLUP On
set_global_assignment -name POF_VERIFY_PROTECT Off
set_global_assignment -name ENABLE_SPI_MODE_CHECK Off
set_global_assignment -name FORCE_SSMCLK_TO_ISMCLK On
set_global_assignment -name FALLBACK_TO_EXTERNAL_FLASH Off
set_global_assignment -name EXTERNAL_FLASH_FALLBACK_ADDRESS 0
set_global_assignment -name GENERATE_PMSF_FILES On
set_global_assignment -name START_TIME 0ns
set_global_assignment -name SIMULATION_MODE TIMING
set_global_assignment -name AUTO_USE_SIMULATION_PDB_NETLIST Off
set_global_assignment -name ADD_DEFAULT_PINS_TO_SIMULATION_OUTPUT_WAVEFORMS On
set_global_assignment -name SETUP_HOLD_DETECTION Off
set_global_assignment -name SETUP_HOLD_DETECTION_INPUT_REGISTERS_BIDIR_PINS_DISABLED Off
set_global_assignment -name CHECK_OUTPUTS Off
set_global_assignment -name SIMULATION_COVERAGE On
set_global_assignment -name SIMULATION_COMPLETE_COVERAGE_REPORT_PANEL On
set_global_assignment -name SIMULATION_MISSING_1_VALUE_COVERAGE_REPORT_PANEL On
set_global_assignment -name SIMULATION_MISSING_0_VALUE_COVERAGE_REPORT_PANEL On
set_global_assignment -name GLITCH_DETECTION Off
set_global_assignment -name GLITCH_INTERVAL 1ns
set_global_assignment -name SIMULATOR_GENERATE_SIGNAL_ACTIVITY_FILE Off
set_global_assignment -name SIMULATION_WITH_GLITCH_FILTERING_WHEN_GENERATING_SAF On
set_global_assignment -name SIMULATION_BUS_CHANNEL_GROUPING Off
set_global_assignment -name SIMULATION_VDB_RESULT_FLUSH On
set_global_assignment -name VECTOR_COMPARE_TRIGGER_MODE INPUT_EDGE
set_global_assignment -name SIMULATION_NETLIST_VIEWER Off
set_global_assignment -name SIMULATION_INTERCONNECT_DELAY_MODEL_TYPE TRANSPORT
set_global_assignment -name SIMULATION_CELL_DELAY_MODEL_TYPE TRANSPORT
set_global_assignment -name SIMULATOR_GENERATE_POWERPLAY_VCD_FILE Off
set_global_assignment -name SIMULATOR_PVT_TIMING_MODEL_TYPE AUTO
set_global_assignment -name SIMULATION_WITH_AUTO_GLITCH_FILTERING AUTO
set_global_assignment -name DRC_TOP_FANOUT 50
set_global_assignment -name DRC_FANOUT_EXCEEDING 30
set_global_assignment -name DRC_GATED_CLOCK_FEED 30
set_global_assignment -name HARDCOPY_FLOW_AUTOMATION MIGRATION_ONLY
set_global_assignment -name ENABLE_DRC_SETTINGS Off
set_global_assignment -name CLK_RULE_CLKNET_CLKSPINES_THRESHOLD 25
set_global_assignment -name DRC_DETAIL_MESSAGE_LIMIT 10
set_global_assignment -name DRC_VIOLATION_MESSAGE_LIMIT 30
set_global_assignment -name DRC_DEADLOCK_STATE_LIMIT 2
set_global_assignment -name MERGE_HEX_FILE Off
set_global_assignment -name GENERATE_SVF_FILE Off
set_global_assignment -name GENERATE_ISC_FILE Off
set_global_assignment -name GENERATE_JAM_FILE Off
set_global_assignment -name GENERATE_JBC_FILE Off
set_global_assignment -name GENERATE_JBC_FILE_COMPRESSED On
set_global_assignment -name GENERATE_CONFIG_SVF_FILE Off
set_global_assignment -name GENERATE_CONFIG_ISC_FILE Off
set_global_assignment -name GENERATE_CONFIG_JAM_FILE Off
set_global_assignment -name GENERATE_CONFIG_JBC_FILE Off
set_global_assignment -name GENERATE_CONFIG_JBC_FILE_COMPRESSED On
set_global_assignment -name GENERATE_CONFIG_HEXOUT_FILE Off
set_global_assignment -name ISP_CLAMP_STATE_DEFAULT "Tri-state"
set_global_assignment -name HPS_EARLY_IO_RELEASE Off
set_global_assignment -name SIGNALPROBE_ALLOW_OVERUSE Off
set_global_assignment -name SIGNALPROBE_DURING_NORMAL_COMPILATION Off
set_global_assignment -name POWER_DEFAULT_TOGGLE_RATE 12.5%
set_global_assignment -name POWER_DEFAULT_INPUT_IO_TOGGLE_RATE 12.5%
set_global_assignment -name POWER_USE_PVA On
set_global_assignment -name POWER_USE_INPUT_FILE "No File"
set_global_assignment -name POWER_USE_INPUT_FILES Off
set_global_assignment -name POWER_VCD_FILTER_GLITCHES On
set_global_assignment -name POWER_REPORT_SIGNAL_ACTIVITY Off
set_global_assignment -name POWER_REPORT_POWER_DISSIPATION Off
set_global_assignment -name POWER_USE_DEVICE_CHARACTERISTICS TYPICAL
set_global_assignment -name POWER_AUTO_COMPUTE_TJ On
set_global_assignment -name POWER_TJ_VALUE 25
set_global_assignment -name POWER_USE_TA_VALUE 25
set_global_assignment -name POWER_USE_CUSTOM_COOLING_SOLUTION Off
set_global_assignment -name POWER_BOARD_TEMPERATURE 25
set_global_assignment -name POWER_HPS_ENABLE Off
set_global_assignment -name POWER_HPS_PROC_FREQ 0.0
set_global_assignment -name ENABLE_SMART_VOLTAGE_ID Off
set_global_assignment -name IGNORE_PARTITIONS Off
set_global_assignment -name AUTO_EXPORT_INCREMENTAL_COMPILATION Off
set_global_assignment -name RAPID_RECOMPILE_ASSIGNMENT_CHECKING On
set_global_assignment -name OUTPUT_IO_TIMING_ENDPOINT "Near End"
set_global_assignment -name RTLV_REMOVE_FANOUT_FREE_REGISTERS On
set_global_assignment -name RTLV_SIMPLIFIED_LOGIC On
set_global_assignment -name RTLV_GROUP_RELATED_NODES On
set_global_assignment -name RTLV_GROUP_COMB_LOGIC_IN_CLOUD Off
set_global_assignment -name RTLV_GROUP_COMB_LOGIC_IN_CLOUD_TMV Off
set_global_assignment -name RTLV_GROUP_RELATED_NODES_TMV On
set_global_assignment -name EQC_CONSTANT_DFF_DETECTION On
set_global_assignment -name EQC_DUPLICATE_DFF_DETECTION On
set_global_assignment -name EQC_BBOX_MERGE On
set_global_assignment -name EQC_LVDS_MERGE On
set_global_assignment -name EQC_RAM_UNMERGING On
set_global_assignment -name EQC_DFF_SS_EMULATION On
set_global_assignment -name EQC_RAM_REGISTER_UNPACK On
set_global_assignment -name EQC_MAC_REGISTER_UNPACK On
set_global_assignment -name EQC_SET_PARTITION_BB_TO_VCC_GND On
set_global_assignment -name EQC_STRUCTURE_MATCHING On
set_global_assignment -name EQC_AUTO_BREAK_CONE On
set_global_assignment -name EQC_POWER_UP_COMPARE Off
set_global_assignment -name EQC_AUTO_COMP_LOOP_CUT On
set_global_assignment -name EQC_AUTO_INVERSION On
set_global_assignment -name EQC_AUTO_TERMINATE On
set_global_assignment -name EQC_SUB_CONE_REPORT Off
set_global_assignment -name EQC_RENAMING_RULES On
set_global_assignment -name EQC_PARAMETER_CHECK On
set_global_assignment -name EQC_AUTO_PORTSWAP On
set_global_assignment -name EQC_DETECT_DONT_CARES On
set_global_assignment -name EQC_SHOW_ALL_MAPPED_POINTS Off
set_global_assignment -name EDA_INPUT_GND_NAME GND -section_id ?
set_global_assignment -name EDA_INPUT_VCC_NAME VCC -section_id ?
set_global_assignment -name EDA_INPUT_DATA_FORMAT NONE -section_id ?
set_global_assignment -name EDA_SHOW_LMF_MAPPING_MESSAGES Off -section_id ?
set_global_assignment -name EDA_RUN_TOOL_AUTOMATICALLY Off -section_id ?
set_global_assignment -name RESYNTHESIS_RETIMING FULL -section_id ?
set_global_assignment -name RESYNTHESIS_OPTIMIZATION_EFFORT Normal -section_id ?
set_global_assignment -name RESYNTHESIS_PHYSICAL_SYNTHESIS Normal -section_id ?
set_global_assignment -name USE_GENERATED_PHYSICAL_CONSTRAINTS On -section_id ?
set_global_assignment -name VCCPD_VOLTAGE 3.3V -section_id ?
set_global_assignment -name EDA_USER_COMPILED_SIMULATION_LIBRARY_DIRECTORY "<None>" -section_id ?
set_global_assignment -name EDA_LAUNCH_CMD_LINE_TOOL Off -section_id ?
set_global_assignment -name EDA_ENABLE_IPUTF_MODE On -section_id ?
set_global_assignment -name EDA_NATIVELINK_PORTABLE_FILE_PATHS Off -section_id ?
set_global_assignment -name EDA_NATIVELINK_GENERATE_SCRIPT_ONLY Off -section_id ?
set_global_assignment -name EDA_WAIT_FOR_GUI_TOOL_COMPLETION Off -section_id ?
set_global_assignment -name EDA_TRUNCATE_LONG_HIERARCHY_PATHS Off -section_id ?
set_global_assignment -name EDA_FLATTEN_BUSES Off -section_id ?
set_global_assignment -name EDA_MAP_ILLEGAL_CHARACTERS Off -section_id ?
set_global_assignment -name EDA_GENERATE_TIMING_CLOSURE_DATA Off -section_id ?
set_global_assignment -name EDA_GENERATE_POWER_INPUT_FILE Off -section_id ?
set_global_assignment -name EDA_TEST_BENCH_ENABLE_STATUS NOT_USED -section_id ?
set_global_assignment -name EDA_RTL_SIM_MODE NOT_USED -section_id ?
set_global_assignment -name EDA_MAINTAIN_DESIGN_HIERARCHY OFF -section_id ?
set_global_assignment -name EDA_GENERATE_FUNCTIONAL_NETLIST On -section_id ?
set_global_assignment -name EDA_WRITE_DEVICE_CONTROL_PORTS Off -section_id ?
set_global_assignment -name EDA_SIMULATION_VCD_OUTPUT_TCL_FILE Off -section_id ?
set_global_assignment -name EDA_SIMULATION_VCD_OUTPUT_SIGNALS_TO_TCL_FILE "All Except Combinational Logic Element Outputs" -section_id ?
set_global_assignment -name EDA_ENABLE_GLITCH_FILTERING Off -section_id ?
set_global_assignment -name EDA_WRITE_NODES_FOR_POWER_ESTIMATION OFF -section_id ?
set_global_assignment -name EDA_SETUP_HOLD_DETECTION_INPUT_REGISTERS_BIDIR_PINS_DISABLED Off -section_id ?
set_global_assignment -name EDA_WRITER_DONT_WRITE_TOP_ENTITY Off -section_id ?
set_global_assignment -name EDA_VHDL_ARCH_NAME structure -section_id ?
set_global_assignment -name EDA_IBIS_MODEL_SELECTOR Off -section_id ?
set_global_assignment -name EDA_IBIS_EXTENDED_MODEL_SELECTOR Off -section_id ?
set_global_assignment -name EDA_IBIS_MUTUAL_COUPLING Off -section_id ?
set_global_assignment -name EDA_FORMAL_VERIFICATION_ALLOW_RETIMING Off -section_id ?
set_global_assignment -name EDA_BOARD_BOUNDARY_SCAN_OPERATION PRE_CONFIG -section_id ?
set_global_assignment -name EDA_GENERATE_RTL_SIMULATION_COMMAND_SCRIPT Off -section_id ?
set_global_assignment -name EDA_GENERATE_GATE_LEVEL_SIMULATION_COMMAND_SCRIPT Off -section_id ?
set_global_assignment -name EDA_IBIS_SPECIFICATION_VERSION 4p2 -section_id ?
set_global_assignment -name SIM_VECTOR_COMPARED_CLOCK_OFFSET 0ns -section_id ?
set_global_assignment -name SIM_VECTOR_COMPARED_CLOCK_DUTY_CYCLE 50 -section_id ?
set_global_assignment -name APEX20K_CLIQUE_TYPE LAB -section_id ? -entity ?
set_global_assignment -name MAX7K_CLIQUE_TYPE LAB -section_id ? -entity ?
set_global_assignment -name MERCURY_CLIQUE_TYPE LAB -section_id ? -entity ?
set_global_assignment -name FLEX6K_CLIQUE_TYPE LAB -section_id ? -entity ?
set_global_assignment -name FLEX10K_CLIQUE_TYPE LAB -section_id ? -entity ?
set_global_assignment -name PARTITION_PRESERVE_HIGH_SPEED_TILES On -section_id ? -entity ?
set_global_assignment -name PARTITION_IGNORE_SOURCE_FILE_CHANGES Off -section_id ? -entity ?
set_global_assignment -name PARTITION_ALWAYS_USE_QXP_NETLIST Off -section_id ? -entity ?
set_global_assignment -name PARTITION_IMPORT_ASSIGNMENTS On -section_id ? -entity ?
set_global_assignment -name PARTITION_IMPORT_EXISTING_ASSIGNMENTS REPLACE_CONFLICTING -section_id ? -entity ?
set_global_assignment -name PARTITION_IMPORT_EXISTING_LOGICLOCK_REGIONS UPDATE_CONFLICTING -section_id ? -entity ?
set_global_assignment -name PARTITION_IMPORT_PROMOTE_ASSIGNMENTS On -section_id ? -entity ?
set_global_assignment -name ALLOW_MULTIPLE_PERSONAS Off -section_id ? -entity ?
set_global_assignment -name PARTITION_ASD_REGION_ID 1 -section_id ? -entity ?
set_global_assignment -name CROSS_BOUNDARY_OPTIMIZATIONS Off -section_id ? -entity ?
set_global_assignment -name PROPAGATE_CONSTANTS_ON_INPUTS On -section_id ? -entity ?
set_global_assignment -name PROPAGATE_INVERSIONS_ON_INPUTS On -section_id ? -entity ?
set_global_assignment -name REMOVE_LOGIC_ON_UNCONNECTED_OUTPUTS On -section_id ? -entity ?
set_global_assignment -name MERGE_EQUIVALENT_INPUTS On -section_id ? -entity ?
set_global_assignment -name MERGE_EQUIVALENT_BIDIRS On -section_id ? -entity ?
set_global_assignment -name ABSORB_PATHS_FROM_OUTPUTS_TO_INPUTS On -section_id ? -entity ?
set_global_assignment -name PARTITION_ENABLE_STRICT_PRESERVATION Off -section_id ? -entity ?
@@ -0,0 +1,2 @@
set_timing_derate -late 2.0
set_timing_derate -early 2.0
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
Here are the schematic files of H4M. If you have any questions about them, please feel free to contact me. My email address is opensourcesdrlab@gmail.com