Updated component and bus generation logic + bugfixes
This commit is contained in:
parent
86b8861533
commit
f93a2afa63
|
@ -40,12 +40,12 @@ bool Application::loadLibrary(std::string& filename, std::ostream &errorOutput)
|
|||
}
|
||||
|
||||
if(library.has_value()) {
|
||||
errorOutput<<"Failed creating library model"<<std::endl;
|
||||
return false;
|
||||
} else {
|
||||
libraryPath = filename;
|
||||
// on library load we create a new schema
|
||||
schema = new domain::Schema();
|
||||
} else {
|
||||
errorOutput<<"Failed creating library model"<<std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
@ -158,3 +158,42 @@ Application *Application::instance() {
|
|||
}
|
||||
return application;
|
||||
}
|
||||
|
||||
std::shared_ptr<domain::ComponentInstance> Application::addComponent(domain::Component component, std::vector<domain::InstanceAttribute> attributes, int x, int y) {
|
||||
std::set<std::string> names;
|
||||
for(const auto& c: schema->componentInstances) {
|
||||
names.insert(c->name);
|
||||
}
|
||||
std::string name = generateName(names, component.getInstanceName());
|
||||
|
||||
schema->componentInstances.push_back(std::make_shared<domain::ComponentInstance>(name, attributes, std::make_pair(x, y), component));
|
||||
return schema->componentInstances.back();
|
||||
}
|
||||
|
||||
std::shared_ptr<domain::BusInstance> Application::addBus(domain::Bus bus, int x, int y) {
|
||||
std::set<std::string> names;
|
||||
for(const auto& b: schema->busInstances) {
|
||||
names.insert(b->name);
|
||||
}
|
||||
std::string name = generateName(names, bus.getInstanceName());
|
||||
|
||||
schema->busInstances.push_back(std::make_shared<domain::BusInstance>(name, std::make_pair(x, y), bus));
|
||||
return schema->busInstances.back();
|
||||
}
|
||||
|
||||
|
||||
std::string Application::generateName(std::set<std::string>& names, std::string instanceName) {
|
||||
if(names.find(instanceName) == names.end()) {
|
||||
return instanceName;
|
||||
}
|
||||
char buffer[4];
|
||||
for(int i=0; i<1000; i++) {
|
||||
sprintf(buffer, "%03d", i);
|
||||
auto name = instanceName + "_" + buffer;
|
||||
if(names.find(name) == names.end()) {
|
||||
return name;
|
||||
}
|
||||
}
|
||||
// return default value as this should never happen
|
||||
return instanceName;
|
||||
}
|
|
@ -6,6 +6,7 @@
|
|||
#define SCHEMEEDITOR_APPLICATION_H
|
||||
|
||||
|
||||
#include <set>
|
||||
#include "comdel/domain/library.h"
|
||||
#include "comdel/domain/schema.h"
|
||||
#include "comdel/domain/comdel_validator.h"
|
||||
|
@ -16,10 +17,13 @@ private:
|
|||
std::string libraryPath;
|
||||
std::optional<domain::Library> library = std::nullopt;
|
||||
domain::Schema* schema = nullptr;
|
||||
std::vector<domain::FunctionValidator*> validators = domain::getSupportedValidators();
|
||||
|
||||
std::string generateName(std::set<std::string>& names, std::string instanceName);
|
||||
|
||||
public:
|
||||
std::optional<domain::Library> getLibrary();
|
||||
domain::Schema* getSchema();
|
||||
std::vector<domain::FunctionValidator*> validators = domain::getSupportedValidators();
|
||||
|
||||
void clear();
|
||||
|
||||
|
@ -32,6 +36,9 @@ public:
|
|||
std::vector<domain::ValidationError> validateSchema();
|
||||
std::vector<domain::ValidationError> generateComdel(std::ostringstream &output);
|
||||
|
||||
std::shared_ptr<domain::ComponentInstance> addComponent(domain::Component component, std::vector<domain::InstanceAttribute> attributes, int x, int y);
|
||||
std::shared_ptr<domain::BusInstance> addBus(domain::Bus bus, int x, int y);
|
||||
|
||||
static bool hasErrors(std::vector<domain::ValidationError> empty);
|
||||
|
||||
~Application() = default;
|
||||
|
|
|
@ -7,13 +7,19 @@
|
|||
#include <QMenu>
|
||||
#include <QLine>
|
||||
#include <QGraphicsSceneContextMenuEvent>
|
||||
#include <set>
|
||||
|
||||
namespace display {
|
||||
|
||||
void Component::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {
|
||||
QMenu menu;
|
||||
menu.addAction("Izmjeni ime", [this]() {
|
||||
auto dialog = new NameDialog(this->instance.get());
|
||||
std::set<std::string> names;
|
||||
for(const auto &component: Application::instance()->getSchema()->componentInstances) {
|
||||
names.insert(component->name);
|
||||
}
|
||||
|
||||
auto dialog = new NameDialog(this->instance.get(), names);
|
||||
dialog->exec();
|
||||
});
|
||||
menu.addSeparator();
|
||||
|
@ -93,7 +99,12 @@ namespace display {
|
|||
void Bus::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) {
|
||||
QMenu menu;
|
||||
menu.addAction("Izmjeni ime", [this]() {
|
||||
auto dialog = new NameDialog(this->busInstance.get());
|
||||
std::set<std::string> names;
|
||||
for(const auto &component: Application::instance()->getSchema()->busInstances) {
|
||||
names.insert(component->name);
|
||||
}
|
||||
|
||||
auto dialog = new NameDialog(this->busInstance.get(), names);
|
||||
dialog->exec();
|
||||
});
|
||||
menu.exec(event->screenPos());
|
||||
|
@ -110,7 +121,7 @@ namespace display {
|
|||
QVariant BusGroup::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) {
|
||||
if (change == ItemPositionChange && scene()) {
|
||||
// value is the new position.
|
||||
QPointF newPos = value.toPointF();
|
||||
QPoint newPos = value.toPointF().toPoint();
|
||||
busInstance->position.first = newPos.x();
|
||||
busInstance->position.second = newPos.y();
|
||||
|
||||
|
@ -136,7 +147,7 @@ namespace display {
|
|||
QVariant ComponentGroup::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) {
|
||||
if (change == ItemPositionChange && scene()) {
|
||||
// value is the new position.
|
||||
QPointF newPos = value.toPointF();
|
||||
QPoint newPos = value.toPointF().toPoint();
|
||||
componentInstance->position.first = newPos.x();
|
||||
componentInstance->position.second = newPos.y();
|
||||
|
||||
|
|
|
@ -2,37 +2,54 @@
|
|||
// Created by bbr on 18. 04. 2022..
|
||||
//
|
||||
|
||||
#include <set>
|
||||
#include "name_dialog.h"
|
||||
|
||||
display::NameDialog::NameDialog(domain::ComponentInstance *instance) : componentInstance(instance) {
|
||||
display::NameDialog::NameDialog(domain::ComponentInstance *instance, std::set<std::string>& names) : componentInstance(instance), usedNames(names) {
|
||||
usedNames.erase(instance->name);
|
||||
|
||||
auto *layout = new QVBoxLayout(this);
|
||||
layout->addWidget(new QLabel("Izmjeni ime", this));
|
||||
|
||||
edit = new QLineEdit(this);
|
||||
edit->insert(instance->name.c_str());
|
||||
connect(edit, &QLineEdit::textChanged, this, &NameDialog::onNameUpdate);
|
||||
layout->addWidget(edit);
|
||||
this->setWindowTitle("Izmjeni ime");
|
||||
auto *button = new QPushButton("Ažuriraj", this);
|
||||
button = new QPushButton("Ažuriraj", this);
|
||||
connect(button, &QPushButton::clicked, this, &NameDialog::onNameChange);
|
||||
layout->addWidget(button);
|
||||
this->setLayout(layout);
|
||||
}
|
||||
|
||||
display::NameDialog::NameDialog(domain::BusInstance *instance): busInstance(instance) {
|
||||
display::NameDialog::NameDialog(domain::BusInstance *instance, std::set<std::string>& names): busInstance(instance), usedNames(names) {
|
||||
usedNames.erase(instance->name);
|
||||
|
||||
auto *layout = new QVBoxLayout(this);
|
||||
layout->addWidget(new QLabel("Izmjeni ime", this));
|
||||
|
||||
edit = new QLineEdit(this);
|
||||
edit->insert(instance->name.c_str());
|
||||
connect(edit, &QLineEdit::textChanged, this, &NameDialog::onNameUpdate);
|
||||
layout->addWidget(edit);
|
||||
this->setWindowTitle("Izmjeni ime");
|
||||
auto *button = new QPushButton("Ažuriraj", this);
|
||||
button = new QPushButton("Ažuriraj", this);
|
||||
connect(button, &QPushButton::clicked, this, &NameDialog::onNameChange);
|
||||
layout->addWidget(button);
|
||||
this->setLayout(layout);
|
||||
}
|
||||
|
||||
void display::NameDialog::onNameUpdate(const QString &text) {
|
||||
if(usedNames.find(text.toStdString()) == usedNames.end()) {
|
||||
button->setDisabled(false);
|
||||
} else {
|
||||
button->setDisabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
void display::NameDialog::onNameChange() {
|
||||
|
||||
|
||||
if (componentInstance != nullptr) {
|
||||
componentInstance->name = this->edit->text().toStdString();
|
||||
} else if (busInstance != nullptr) {
|
||||
|
|
|
@ -7,24 +7,28 @@
|
|||
#include <QLineEdit>
|
||||
#include <QPushButton>
|
||||
|
||||
#include <set>
|
||||
|
||||
#include <comdel/domain/instance.h>
|
||||
|
||||
namespace display {
|
||||
|
||||
class NameDialog : public QDialog {
|
||||
|
||||
std::set<std::string> usedNames;
|
||||
QLineEdit *edit = nullptr;
|
||||
domain::ComponentInstance *componentInstance = nullptr;
|
||||
domain::BusInstance *busInstance = nullptr;
|
||||
QPushButton *button;
|
||||
|
||||
public:
|
||||
|
||||
NameDialog(domain::ComponentInstance *instance);
|
||||
NameDialog(domain::ComponentInstance *instance, std::set<std::string>& names);
|
||||
|
||||
NameDialog(domain::BusInstance *instance);
|
||||
NameDialog(domain::BusInstance *instance, std::set<std::string>& names);
|
||||
|
||||
public slots:
|
||||
|
||||
void onNameUpdate(const QString& text);
|
||||
void onNameChange();
|
||||
};
|
||||
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
#include "component_display.h"
|
||||
#include "schema_display.h"
|
||||
#include "application.h"
|
||||
#include "attribute_dialog.h"
|
||||
|
||||
#include <QDrag>
|
||||
#include <QDragEnterEvent>
|
||||
|
@ -86,15 +88,30 @@ namespace display {
|
|||
|
||||
auto attributes = std::vector<domain::InstanceAttribute>();
|
||||
for (auto attr: component.getAttributes()) {
|
||||
attributes.emplace_back(attr.getName(), attr.getDefault(), attr);
|
||||
domain::InstanceAttribute attribute(attr.getName(), attr.getDefault(), attr);
|
||||
if(attr.getPopup().has_value() && attr.getPopup()->getType() == domain::Popup::AUTOMATIC) {
|
||||
if(attr.getDefault().isType(domain::Value::MEMORY_REFERENCE)) {
|
||||
auto dialog = new MemoryDialog(&attribute, schema->componentInstances);
|
||||
if(dialog->exec() == QDialog::Rejected) {
|
||||
// if any dialog isn't set, whole creation is rejected
|
||||
event->ignore();
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
auto dialog = new AttributeDialog(&attribute);
|
||||
if(dialog->exec() == QDialog::Rejected) {
|
||||
// if any dialog isn't set, whole creation is rejected
|
||||
event->ignore();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
attributes.push_back(attribute);
|
||||
}
|
||||
|
||||
auto currentPos = this->mapToScene(event->pos());
|
||||
auto currentPos = this->mapToScene(event->pos()).toPoint();
|
||||
|
||||
auto instance = std::make_shared<domain::ComponentInstance>(component.getInstanceName(), attributes,
|
||||
std::make_pair(currentPos.x(), currentPos.y()),
|
||||
component);
|
||||
schema->componentInstances.push_back(instance);
|
||||
auto instance = Application::instance()->addComponent(component, attributes, currentPos.x(), currentPos.y());
|
||||
|
||||
auto group = new display::ComponentGroup(instance);
|
||||
scene.addItem(group);
|
||||
|
@ -111,11 +128,9 @@ namespace display {
|
|||
if (event->mimeData()->hasFormat("comdel/bus")) {
|
||||
auto bus = library->getBus(event->mimeData()->data("comdel/bus").toStdString());
|
||||
|
||||
auto currentPos = this->mapToScene(event->pos());
|
||||
auto currentPos = this->mapToScene(event->pos()).toPoint();
|
||||
|
||||
auto instance = std::make_shared<domain::BusInstance>(bus.getName(),
|
||||
std::make_pair(currentPos.x(), currentPos.y()), bus);
|
||||
schema->busInstances.push_back(instance);
|
||||
auto instance = Application::instance()->addBus(bus, currentPos.x(), currentPos.y());
|
||||
|
||||
auto group = new display::BusGroup(instance);
|
||||
scene.addItem(group);
|
||||
|
|
|
@ -10,6 +10,11 @@ namespace domain {
|
|||
return name;
|
||||
}
|
||||
|
||||
std::string Bus::getInstanceName() {
|
||||
return instanceName;
|
||||
}
|
||||
|
||||
|
||||
int Wire::getWidth() {
|
||||
return width;
|
||||
}
|
||||
|
@ -30,9 +35,9 @@ namespace domain {
|
|||
return type;
|
||||
}
|
||||
|
||||
Bus::Bus(std::string name, std::string tooltip, BusType type, std::pair<int, int> count, std::vector<Wire> wires,
|
||||
Bus::Bus(std::string name, std::string instanceName, std::string tooltip, BusType type, std::pair<int, int> count, std::vector<Wire> wires,
|
||||
std::optional<ui::Bus> displayBus)
|
||||
: name(name), tooltip(tooltip), type(type), count(count), wires(wires), displayBus(displayBus) {}
|
||||
: name(name), instanceName(instanceName), tooltip(tooltip), type(type), count(count), wires(wires), displayBus(displayBus) {}
|
||||
|
||||
std::string Bus::getName() {
|
||||
return name;
|
||||
|
@ -57,5 +62,4 @@ namespace domain {
|
|||
std::optional<ui::Bus> Bus::getDisplayBus() {
|
||||
return displayBus;
|
||||
}
|
||||
|
||||
} // namespace domain
|
||||
|
|
|
@ -54,6 +54,7 @@ namespace domain {
|
|||
};
|
||||
private:
|
||||
std::string name;
|
||||
std::string instanceName;
|
||||
std::string tooltip;
|
||||
BusType type;
|
||||
|
||||
|
@ -62,11 +63,13 @@ namespace domain {
|
|||
std::vector<Wire> wires;
|
||||
|
||||
public:
|
||||
Bus(std::string name, std::string tooltip, BusType type, std::pair<int, int> count, std::vector<Wire> wires,
|
||||
Bus(std::string name, std::string instanceName, std::string tooltip, BusType type, std::pair<int, int> count, std::vector<Wire> wires,
|
||||
std::optional<ui::Bus> display = std::nullopt);
|
||||
|
||||
std::string getName();
|
||||
|
||||
std::string getInstanceName();
|
||||
|
||||
std::string getTooltip();
|
||||
|
||||
BusType getType();
|
||||
|
|
|
@ -167,8 +167,7 @@ namespace domain {
|
|||
}
|
||||
|
||||
for (auto &comp: node.components) {
|
||||
std::optional<Component> component;
|
||||
component = loadComponent(comp);
|
||||
auto component = loadComponent(comp);
|
||||
if (component) {
|
||||
components.push_back(*component);
|
||||
}
|
||||
|
@ -196,13 +195,24 @@ namespace domain {
|
|||
}
|
||||
}
|
||||
|
||||
return Library(name, libraryInfo, header, componentDirectory, componentHeader, addressSpaces, components, buses,
|
||||
connections, messages);
|
||||
if(errors.empty()) {
|
||||
return Library(name, libraryInfo, header, componentDirectory, componentHeader, addressSpaces, components, buses,
|
||||
connections, messages);
|
||||
} else {
|
||||
return nullopt;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
std::optional<Bus> SchemaCreator::loadBus(BusNode node) {
|
||||
std::string busName = node.name.value;
|
||||
|
||||
if (!node.instanceName) {
|
||||
errors.emplace_back(node.span, "missing @instanceName");
|
||||
return nullopt;
|
||||
}
|
||||
std::string instanceName = node.instanceName->value;
|
||||
|
||||
auto count = std::make_pair<int, int>(1, 1);
|
||||
if (node.count) {
|
||||
count = std::make_pair<int, int>(node.count->first.value, node.count->second.value);
|
||||
|
@ -259,7 +269,7 @@ namespace domain {
|
|||
return nullopt;
|
||||
}
|
||||
|
||||
return Bus(busName, tooltip, type, count, wires, displayBus);
|
||||
return Bus(busName, instanceName, tooltip, type, count, wires, displayBus);
|
||||
}
|
||||
|
||||
|
||||
|
@ -497,7 +507,7 @@ namespace domain {
|
|||
pop();
|
||||
return nullopt;
|
||||
}
|
||||
std::string instanceName = node.instanceName->asString();
|
||||
std::string instanceName = node.instanceName->value;
|
||||
|
||||
auto count = std::make_pair<int, int>(1, 1);
|
||||
if (node.count) {
|
||||
|
@ -950,7 +960,13 @@ namespace domain {
|
|||
}
|
||||
}
|
||||
|
||||
return schema;
|
||||
if(errors.empty()) {
|
||||
return schema;
|
||||
} else {
|
||||
delete schema;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
shared_ptr<ComponentInstance> SchemaCreator::loadComponentInstance(InstanceNode instance, Library &library) {
|
||||
|
|
|
@ -309,7 +309,7 @@ struct ComponentNode : public AstNode {
|
|||
std::optional<StringNode> source;
|
||||
EnumNode<ComponentType> type;
|
||||
std::vector<RuleNode> rules;
|
||||
std::optional<StringNode> instanceName;
|
||||
std::optional<IdentifierNode> instanceName;
|
||||
std::optional<CountNode> count;
|
||||
std::optional<DisplayNode> display;
|
||||
std::vector<PinNode> pins;
|
||||
|
@ -325,6 +325,7 @@ struct BusNode : public AstNode {
|
|||
|
||||
EnumNode<BusType> type;
|
||||
IdentifierNode name;
|
||||
std::optional<IdentifierNode> instanceName;
|
||||
std::optional<StringNode> tooltip;
|
||||
std::optional<CountNode> count;
|
||||
std::optional<DisplayNode> display;
|
||||
|
|
|
@ -438,7 +438,7 @@ PResult<ComponentNode> ComdelParser::parseComponent() {
|
|||
PResult<poly<AstNode>> err;
|
||||
if (check(TokenType::KW_INSTANCE_NAME)) {
|
||||
bump();
|
||||
ASSIGN_OR_SET_ERR(component.instanceName, parseString());
|
||||
ASSIGN_OR_SET_ERR(component.instanceName, parseIdentifier());
|
||||
} else if (check(TokenType::KW_TOOLTIP)) {
|
||||
bump();
|
||||
ASSIGN_OR_SET_ERR(component.tooltip, parseString());
|
||||
|
@ -554,22 +554,30 @@ PResult<BusNode> ComdelParser::parseBus() {
|
|||
PResult<poly<AstNode>> err;
|
||||
if (check(TokenType::KW_TOOLTIP)) {
|
||||
bump();
|
||||
ASSIGN_OR_RETURN_IF_ERR(bus.tooltip, parseString());
|
||||
ASSIGN_OR_SET_ERR(bus.tooltip, parseString());
|
||||
} else if (check(TokenType::KW_INSTANCE_NAME)) {
|
||||
bump();
|
||||
ASSIGN_OR_SET_ERR(bus.instanceName, parseIdentifier());
|
||||
} else if (check(TokenType::KW_COUNT)) {
|
||||
ASSIGN_OR_RETURN_IF_ERR(bus.count, parseCount());
|
||||
ASSIGN_OR_SET_ERR(bus.count, parseCount());
|
||||
} else if (check(TokenType::KW_DISPLAY)) {
|
||||
ASSIGN_OR_RETURN_IF_ERR(bus.display, parseDisplay());
|
||||
ASSIGN_OR_SET_ERR(bus.display, parseDisplay());
|
||||
} else if (check(TokenType::KW_WIRES)) {
|
||||
bump();
|
||||
RETURN_IF_NOT_TOKEN(TokenType::LBRACE);
|
||||
while (check(TokenType::IDENTIFIER)) {
|
||||
APPEND_OR_RETURN_IF_ERR(bus.wires, parseWire());
|
||||
if(consume(TokenType::LBRACE)) {
|
||||
while (check(TokenType::IDENTIFIER)) {
|
||||
APPEND_OR_RETURN_IF_ERR(bus.wires, parseWire());
|
||||
|
||||
if (check(TokenType::COMMA)) {
|
||||
RETURN_IF_NOT_TOKEN(TokenType::COMMA);
|
||||
if (check(TokenType::COMMA)) {
|
||||
RETURN_IF_NOT_TOKEN(TokenType::COMMA);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
err = unexpected();
|
||||
}
|
||||
if(!consume(TokenType::RBRACE)) {
|
||||
err = unexpected();
|
||||
}
|
||||
RETURN_IF_NOT_TOKEN(TokenType::RBRACE);
|
||||
} else {
|
||||
err = unexpected();
|
||||
bump();
|
||||
|
|
|
@ -23,21 +23,19 @@ component System
|
|||
wire --BACK;
|
||||
|
||||
|
||||
//directRam
|
||||
wire INT;
|
||||
|
||||
|
||||
// components --------------------------------------------
|
||||
subcomponent Memorija mem<false, 1, 1024, 8, 1024>(ADR, DATA, READ, WRITE, SIZE, WAIT, INT);
|
||||
subcomponent FRISC proc(ADR, DATA, READ, WRITE, SIZE, WAIT, INT0, INT1, INT2, INT3, --IACK, 1, *, INT);
|
||||
subcomponent FRISC procesor(ADR, DATA, READ, WRITE, SIZE, WAIT, INT0, INT1, INT2, INT3, --IACK, 1, *, 93852075053817, 0, null, null);
|
||||
subcomponent FRISC procesor(ADR, DATA, READ, WRITE, SIZE, WAIT, INT0, INT1, INT2, INT3, --IACK, 1, *, 93852075053817, 0, null, null);
|
||||
subcomponent Memorija mem<false, 1, 1024, 8, 1024>(ADR, DATA, READ, WRITE, SIZE, WAIT, 94534054858378, 0, null, null);
|
||||
subcomponent FRISC procesor_002(ADR, DATA, READ, WRITE, SIZE, WAIT, INT0, INT1, INT2, INT3, --IACK, 1, *, 94534054858378, 0, null, null);
|
||||
subcomponent FRISC procesor_001(ADR, DATA, READ, WRITE, SIZE, WAIT, INT0, INT1, INT2, INT3, --IACK, 1, *, 94534054858378, 0, null, null);
|
||||
subcomponent FRISC procesor_000(ADR, DATA, READ, WRITE, SIZE, WAIT, INT0, INT1, INT2, INT3, --IACK, 1, *, 94534054858378, 0, null, null);
|
||||
subcomponent FRISC procesor(ADR, DATA, READ, WRITE, SIZE, WAIT, INT0, INT1, INT2, INT3, --IACK, 1, *, 94534054858378, 0, null, null);
|
||||
|
||||
display {
|
||||
component { x: 0; y: 0; ref: "proc"; }
|
||||
component { x: 0; y: 0; ref: "procesor_002"; }
|
||||
component { x: 0; y: 250; ref: "mem"; }
|
||||
component { x: -185; y: 9; ref: "procesor"; }
|
||||
component { x: -181; y: 194; ref: "procesor"; }
|
||||
component { x: -89; y: 74; ref: "procesor_001"; }
|
||||
component { x: -175; y: 195; ref: "procesor_000"; }
|
||||
component { x: -195; y: 63; ref: "procesor"; }
|
||||
|
||||
// bus bus
|
||||
|
||||
|
@ -47,13 +45,10 @@ component System
|
|||
}
|
||||
|
||||
|
||||
// directRam bus
|
||||
|
||||
|
||||
line {x1:50; y1:116; x2:50; y2:210;}
|
||||
line {x1:50; y1:234; x2:50; y2:210;}
|
||||
line {x1:-16; y1:278; x2:116; y2:50;}
|
||||
line {x1:-135; y1:125; x2:50; y2:210;}
|
||||
line {x1:-131; y1:310; x2:50; y2:210;}
|
||||
line {x1:-39; y1:190; x2:50; y2:210;}
|
||||
line {x1:-145; y1:179; x2:50; y2:210;}
|
||||
line {x1:-125; y1:311; x2:50; y2:210;}
|
||||
}
|
||||
}
|
|
@ -18,7 +18,7 @@
|
|||
}
|
||||
|
||||
@component FRISC processor {
|
||||
@instanceName "procesor"
|
||||
@instanceName procesor
|
||||
@tooltip "Procesor FRISC, mora postojati jedan"
|
||||
@count (1, 1)
|
||||
@source "FRISC.cdl"
|
||||
|
@ -77,7 +77,7 @@
|
|||
}
|
||||
|
||||
@component Memorija memory {
|
||||
@instanceName "memorija"
|
||||
@instanceName memorija
|
||||
@tooltip "Memorijska komponenta, mora postojati barem jedna"
|
||||
@count (1,1000)
|
||||
@source "memory.cdl"
|
||||
|
@ -219,7 +219,7 @@
|
|||
}
|
||||
|
||||
@component DMA {
|
||||
@instanceName "dma"
|
||||
@instanceName dma
|
||||
@tooltip "DMA-kontroler"
|
||||
@count (0,1000)
|
||||
@source "dma.cdl"
|
||||
|
@ -299,6 +299,7 @@
|
|||
}
|
||||
|
||||
@bus glavnaSabirnica regular {
|
||||
@instanceName glavnaSabirnica
|
||||
@tooltip "sabirnica za spajanje FRISC a s memorijama i UI/jedinicama"
|
||||
@count (1,1)
|
||||
@display {
|
||||
|
@ -334,6 +335,7 @@
|
|||
}
|
||||
}
|
||||
@bus PIOSabirnica automatic {
|
||||
@instanceName PIOSabirnica
|
||||
@count (0, 20)
|
||||
@wires {
|
||||
PIO_DATA<8>,
|
||||
|
@ -343,6 +345,7 @@
|
|||
}
|
||||
|
||||
@bus directRam automatic {
|
||||
@instanceName directRam
|
||||
@wires {
|
||||
INT
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
@source "frisc_library.csl"
|
||||
|
||||
@schema {
|
||||
@instance proc FRISC {
|
||||
@instance procesor_002 FRISC {
|
||||
@position (0, 0)
|
||||
@attribute _memory null
|
||||
}
|
||||
|
@ -15,11 +15,28 @@
|
|||
@attribute pocetnaAdresa 1024
|
||||
}
|
||||
|
||||
@instance procesor_001 FRISC {
|
||||
@position (-89, 74)
|
||||
@attribute _memory null
|
||||
}
|
||||
|
||||
@instance procesor_000 FRISC {
|
||||
@position (-175, 195)
|
||||
@attribute _memory null
|
||||
}
|
||||
|
||||
@instance procesor FRISC {
|
||||
@position (-195, 63)
|
||||
@attribute _memory null
|
||||
}
|
||||
|
||||
@instance bus glavnaSabirnica {
|
||||
@position (0, 200)
|
||||
@size 100
|
||||
}
|
||||
|
||||
@connection (procesor_002.glavniPin, bus) {
|
||||
}
|
||||
@connection (mem.glavniPin, bus) {
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue