OpenASIP 2.2
Loading...
Searching...
No Matches
FUPortDialog.cc
Go to the documentation of this file.
1/*
2 Copyright (c) 2002-2009 Tampere University.
3
4 This file is part of TTA-Based Codesign Environment (TCE).
5
6 Permission is hereby granted, free of charge, to any person obtaining a
7 copy of this software and associated documentation files (the "Software"),
8 to deal in the Software without restriction, including without limitation
9 the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 and/or sell copies of the Software, and to permit persons to whom the
11 Software is furnished to do so, subject to the following conditions:
12
13 The above copyright notice and this permission notice shall be included in
14 all copies or substantial portions of the Software.
15
16 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 DEALINGS IN THE SOFTWARE.
23 */
24/**
25 * @file FUPortDialog.cc
26 *
27 * Definition of FUPortDialog class.
28 *
29 * @author Veli-Pekka Jääskeläinen 2004 (vjaaskel-no.spam-cs.tut.fi)
30 * @note rating: red
31 */
32
33#include <string>
34#include <wx/wx.h>
35#include <wx/statline.h>
36#include <wx/spinctrl.h>
37#include <wx/valgen.h>
38#include <boost/format.hpp>
39
40#include "Application.hh"
41#include "FUPort.hh"
42#include "FUPortDialog.hh"
43#include "WxConversion.hh"
44#include "Conversion.hh"
45#include "ModelConstants.hh"
46#include "ProDeConstants.hh"
47#include "ProDeTextGenerator.hh"
48#include "Socket.hh"
49#include "Machine.hh"
50#include "MachineTester.hh"
51#include "WarningDialog.hh"
52#include "UserManualCmd.hh"
53#include "InformationDialog.hh"
54#include "GUITextGenerator.hh"
55#include "WidgetTools.hh"
56
57using boost::format;
58using std::string;
59using namespace TTAMachine;
60
61BEGIN_EVENT_TABLE(FUPortDialog, wxDialog)
62 EVT_TEXT(ID_NAME, FUPortDialog::onName)
65 EVT_CHOICE(ID_INPUT_SOCKET, FUPortDialog::onSocketChoice)
66 EVT_CHOICE(ID_OUTPUT_SOCKET, FUPortDialog::onSocketChoice)
68
69
70/**
71 * The Constructor.
72 *
73 * @param parent Parent window of the dialog.
74 * @param port Port to modify.
75 */
77 wxWindow* parent,
78 FUPort* port):
79 wxDialog(parent, -1, _T(""), wxDefaultPosition),
80 port_(port),
81 name_(_T("")),
83 triggers_(false),
84 inputSocketChoice_(NULL),
85 outputSocketChoice_(NULL) {
86
87 oldInput_ = port_->inputSocket();
88 oldOutput_ = port_->outputSocket();
89
90 createContents(this, true, true);
91
92 inputSocketChoice_ = dynamic_cast<wxChoice*>(FindWindow(ID_INPUT_SOCKET));
93 outputSocketChoice_ = dynamic_cast<wxChoice*>(FindWindow(ID_OUTPUT_SOCKET));
94 FindWindow(ID_NAME)->SetValidator(wxTextValidator(wxFILTER_ASCII, &name_));
95 FindWindow(ID_TRIGGERS)->SetValidator(wxGenericValidator(&triggers_));
96 FindWindow(ID_WIDTH)->SetValidator(wxGenericValidator(&width_));
97
98 FindWindow(wxID_OK)->Disable();
99
100 // set texts to widgets
101 setTexts();
102
103 TransferDataToWindow();
104}
105
106/**
107 * The Destructor.
108 */
111
112
113/**
114 * Sets texts for widgets.
115 */
116void
152
153
154/**
155 * Transfers data from the port object to the dialog widgets.
156 *
157 * @return False, if an error occured in the transfer.
158*/
159bool
162 width_ = port_->width();
165
166 // wxWidgets GTK1 version seems to bug with spincontrol and
167 // checkbox validators. The widget value has to be set manually.
168 dynamic_cast<wxSpinCtrl*>(FindWindow(ID_WIDTH))->SetValue(width_);
169 dynamic_cast<wxCheckBox*>(FindWindow(ID_TRIGGERS))->SetValue(triggers_);
170
171 return wxWindow::TransferDataToWindow();
172}
173
174
175/**
176 * Updates input and output socket choicers.
177 */
178void
180
181 inputSocketChoice_->Clear();
183 outputSocketChoice_->Clear();
185
186 MachineTester tester(*(port_->parentUnit()->machine()));
187
188 // Add ports to the choicers
189 Machine::SocketNavigator navigator =
191
192 for (int i = 0; i < navigator.count(); i++) {
193 Socket* socket = navigator.item(i);
194 wxString socketName = WxConversion::toWxString(socket->name());
195
196 // Add available input sockets.
197 Socket* input = port_->inputSocket();
198 if (input != NULL) {
199 port_->detachSocket(*input);
200 }
201 bool legal = tester.canConnect(*socket, *port_);
202 if (legal && socket->direction() == Socket::INPUT) {
203 inputSocketChoice_->Append(socketName);
204 }
205 if (input != NULL) {
206 port_->attachSocket(*input);
207 }
208
209 // Add available output sockets.
210 Socket* output = port_->outputSocket();
211 if (output != NULL) {
212 port_->detachSocket(*output);
213 }
214 legal = tester.canConnect(*socket, *port_);
215 if (legal && socket->direction() == Socket::OUTPUT) {
216 outputSocketChoice_->Append(socketName);
217 }
218 if (output != NULL) {
219 port_->attachSocket(*output);
220 }
221 // ignore sockets with unknown direction
222 }
223
224 // set input socket choice
225 if (port_->inputSocket() == NULL) {
226 inputSocketChoice_->SetStringSelection(ProDeConstants::NONE);
227 } else {
228 wxString socketName =
230 inputSocketChoice_->SetStringSelection(socketName);
231 }
232
233 // set output socket choice
234 if (port_->outputSocket() == NULL) {
235 outputSocketChoice_->SetStringSelection(ProDeConstants::NONE);
236 } else {
237 wxString socketName =
239 outputSocketChoice_->SetStringSelection(socketName);
240 }
241}
242
243
244/**
245 * Resets the original input and output sockets for the port and closes
246 * the dialog.
247 */
248void
249FUPortDialog::onCancel(wxCommandEvent&) {
251 if (oldInput_ != NULL) {
253 }
254 if (oldOutput_ != NULL) {
256 }
257 EndModal(wxID_CANCEL);
258}
259
260
261/**
262 * Validates input in the controls, and updates the port object.
263 */
264void
265FUPortDialog::onOK(wxCommandEvent&) {
266
267 if (!Validate()) {
268 return;
269 }
270
271 if (!TransferDataFromWindow()) {
272 return;
273 }
274
275 // check whether FU already has a port of tht name.
276
277 string trimmedName =
278 WxConversion::toString(name_.Trim(false).Trim(true));
279
280 // Check the name validity.
281 if (!MachineTester::isValidComponentName(trimmedName)) {
283 format message =
285 InformationDialog warning(
286 this, WxConversion::toWxString(message.str()));
287 warning.ShowModal();
288 return;
289 }
290
291 if (port_->name() != trimmedName) {
293 for (int i = 0; i < fu->portCount(); i++) {
294 string name = fu->port(i)->name();
295 if (name == WxConversion::toString(name_)) {
296 ProDeTextGenerator* prodeTexts =
298 format message =
300 format a_port =
302 format machine =
304 format port =
306 message % trimmedName % a_port.str() % machine.str() %
307 port.str();
308 WarningDialog warning(
309 this, WxConversion::toWxString(message.str()));
310 warning.ShowModal();
311 return;
312 }
313 }
314 }
315
316 // update attributes
317 port_->setName(trimmedName);
320
321 EndModal(wxID_OK);
322}
323
324/**
325 * Updates the port object when user changes input/output socket selection.
326 */
327void
330 Machine::SocketNavigator navigator =
332
333 // set input socket
334 string inputSocketName =
335 WxConversion::toString(inputSocketChoice_->GetStringSelection());
336 if (inputSocketName != WxConversion::toString(ProDeConstants::NONE)) {
337 port_->attachSocket(*(navigator.item(inputSocketName)));
338 }
339
340 // set output socket
341 string outputSocketName =
342 WxConversion::toString(outputSocketChoice_->GetStringSelection());
343 if (outputSocketName != WxConversion::toString(ProDeConstants::NONE)) {
344 port_->attachSocket(*(navigator.item(outputSocketName)));
345 }
347}
348
349
350/**
351 * Disables OK-button if the name field is empty.
352 */
353void
354FUPortDialog::onName(wxCommandEvent&) {
355 if (!TransferDataFromWindow()) {
356 assert(false);
357 }
358 wxString trimmedName = name_.Trim(false).Trim(true);
359 if (trimmedName == _T("")) {
360 FindWindow(wxID_OK)->Disable();
361 } else {
362 FindWindow(wxID_OK)->Enable();
363 }
364}
365
366
367/**
368 * Creates contents of the dialog window. Initially generated with
369 * wxDesigner, the code will be cleaned up later.
370 *
371 * @param parent Parent dialog of the contents.
372 * @param call_fit If true, fits sizer in dialog window.
373 * @param set_sizer If true, sets sizer as dialog's sizer.
374 * @return Top level sizer of the contents.
375 */
376wxSizer*
378 wxWindow *parent, bool call_fit, bool set_sizer) {
379
380 wxBoxSizer *item0 = new wxBoxSizer( wxVERTICAL );
381
382 wxFlexGridSizer *item1 = new wxFlexGridSizer( 2, 0, 0 );
383
384 wxStaticText *item2 = new wxStaticText( parent, ID_LABEL_NAME, wxT("Name:"), wxDefaultPosition, wxDefaultSize, 0 );
385 item1->Add( item2, 0, wxALIGN_RIGHT|wxALL, 5 );
386
387 wxTextCtrl *item3 = new wxTextCtrl( parent, ID_NAME, wxT(""), wxDefaultPosition, wxSize(200,-1), 0 );
388 item1->Add( item3, 0, wxALIGN_CENTER|wxALL, 5 );
389
390 wxStaticText *item4 = new wxStaticText( parent, ID_LABEL_WIDTH, wxT("Width:"), wxDefaultPosition, wxDefaultSize, 0 );
391 item1->Add( item4, 0, wxALIGN_RIGHT|wxALL, 5 );
392
393 wxSpinCtrl *item5 = new wxSpinCtrl( parent, ID_WIDTH, wxT("1"), wxDefaultPosition, wxSize(-1,-1), 0, 1, 10000, 1 );
394 item1->Add( item5, 0, wxALIGN_CENTER|wxALL, 5 );
395
396 wxStaticText *item6 = new wxStaticText( parent, ID_LABEL_INPUT_SOCKET, wxT("Input Socket:"), wxDefaultPosition, wxDefaultSize, 0 );
397 item1->Add( item6, 0, wxALIGN_RIGHT|wxALL, 5 );
398
399 wxString strs7[] =
400 {
401 wxT("NONE")
402 };
403 wxChoice *item7 = new wxChoice( parent, ID_INPUT_SOCKET, wxDefaultPosition, wxSize(200,-1), 1, strs7, 0 );
404 item1->Add( item7, 0, wxALIGN_CENTER|wxALL, 5 );
405
406 wxStaticText *item8 = new wxStaticText( parent, ID_LABEL_OUTPUT_SOCKET, wxT("Output Socket:"), wxDefaultPosition, wxDefaultSize, 0 );
407 item1->Add( item8, 0, wxALIGN_RIGHT|wxALL, 5 );
408
409 wxString strs9[] =
410 {
411 wxT("NONE")
412 };
413 wxChoice *item9 = new wxChoice( parent, ID_OUTPUT_SOCKET, wxDefaultPosition, wxSize(200,-1), 1, strs9, 0 );
414 item1->Add( item9, 0, wxALIGN_CENTER|wxALL, 5 );
415
416 item0->Add( item1, 0, wxALIGN_CENTER|wxALL, 5 );
417
418 wxBoxSizer *item10 = new wxBoxSizer( wxHORIZONTAL );
419
420 wxCheckBox *item11 = new wxCheckBox( parent, ID_TRIGGERS, wxT("Triggers"), wxDefaultPosition, wxDefaultSize, 0 );
421 item10->Add( item11, 0, wxALIGN_CENTER|wxALL, 5 );
422
423 item0->Add( item10, 0, wxALL, 5 );
424
425 wxStaticLine *item12 = new wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL );
426 item0->Add( item12, 0, wxGROW|wxALL, 5 );
427
428 wxBoxSizer *item13 = new wxBoxSizer( wxHORIZONTAL );
429
430 wxButton *item14 = new wxButton( parent, ID_HELP, wxT("&Help"), wxDefaultPosition, wxDefaultSize, 0 );
431 item13->Add( item14, 0, wxALIGN_CENTER|wxALL, 5 );
432
433 wxButton *item15 = new wxButton( parent, wxID_OK, wxT("&OK"), wxDefaultPosition, wxDefaultSize, 0 );
434 item13->Add( item15, 0, wxALIGN_CENTER|wxALL, 5 );
435
436 wxButton *item16 = new wxButton( parent, wxID_CANCEL, wxT("&Cancel"), wxDefaultPosition, wxDefaultSize, 0 );
437 item13->Add( item16, 0, wxALIGN_CENTER|wxALL, 5 );
438
439 item0->Add( item13, 0, wxALIGN_CENTER|wxALL, 5 );
440
441 if (set_sizer)
442 {
443 parent->SetSizer( item0 );
444 if (call_fit)
445 item0->SetSizeHints( parent );
446 }
447
448 return item0;
449}
#define assert(condition)
END_EVENT_TABLE() using namespace IDF
TTAMachine::Machine * machine
the architecture definition of the estimated processor
EVT_BUTTON(ID_EDIT_ARCH_PORT, FUImplementationDialog::onEditArchitecturePort) EVT_BUTTON(ID_ADD_EXTERNAL_PORT
const int DEFAULT_WIDTH
Default window width.
find Finds info of the inner loops in the false
wxString name_
Name of the port.
wxChoice * inputSocketChoice_
Input socket choice control.
TTAMachine::FUPort * port_
Function unit port to modify.
void updateSockets()
wxSizer * createContents(wxWindow *parent, bool call_fit, bool set_sizer)
virtual bool TransferDataToWindow()
TTAMachine::Socket * oldInput_
Original input socket of the port.
void onOK(wxCommandEvent &event)
void onName(wxCommandEvent &event)
wxChoice * outputSocketChoice_
Output socket choice control.
int width_
Width of the port.
bool triggers_
Trigger attribute of the port.
TTAMachine::Socket * oldOutput_
Original output socket of the port.
void onCancel(wxCommandEvent &event)
void onSocketChoice(wxCommandEvent &event)
@ TXT_BUTTON_HELP
Label for help button.
@ TXT_BUTTON_CANCEL
Label for cancel button.
@ TXT_BUTTON_OK
Label for OK button.
static GUITextGenerator * instance()
virtual bool canConnect(const TTAMachine::Socket &socket, const TTAMachine::Segment &segment)
static bool isValidComponentName(const std::string &name)
static const wxString NONE
Constant for "None".
static ProDeTextGenerator * instance()
@ MSG_ERROR_SAME_NAME
Error: Same name exists.
@ MSG_ERROR_ILLEGAL_NAME
Error: Illegal component name.
@ COMP_FUNCTION_UNIT
Name for FU (w/o article).
@ TXT_LABEL_NAME
Label for component name widget.
@ TXT_LABEL_TRIGGERS
Label for 'triggers' checkbox.
@ TXT_FU_PORT_DIALOG_TITLE
Function unit port dialog title.
@ TXT_LABEL_INPUT_SOCKET
Label for input socket selector.
@ TXT_LABEL_WIDTH
Label for bit width widget.
@ TXT_LABEL_OUTPUT_SOCKET
Label for output socket selector.
@ COMP_PORT
Name for port (w/o article).
@ COMP_A_PORT
Name for port (w/ article).
FunctionUnit * parentUnit() const
Definition BaseFUPort.cc:96
virtual int width() const
void setWidth(int width)
virtual Machine * machine() const
virtual TCEString name() const
virtual bool isTriggering() const
Definition FUPort.cc:182
void setTriggering(bool triggers)
Definition FUPort.cc:212
virtual BaseFUPort * port(const std::string &name) const
ComponentType * item(int index) const
virtual SocketNavigator socketNavigator() const
Definition Machine.cc:368
virtual Socket * outputSocket() const
Definition Port.cc:281
virtual void attachSocket(Socket &socket)
Definition Port.cc:191
virtual void detachSocket(Socket &socket)
Definition Port.cc:237
virtual void detachAllSockets()
Definition Port.cc:536
virtual Socket * inputSocket() const
Definition Port.cc:261
virtual std::string name() const
Definition Port.cc:141
virtual void setName(const std::string &name)
Definition Port.cc:155
@ OUTPUT
Data goes from port to bus.
Definition Socket.hh:60
@ INPUT
Data goes from bus to port.
Definition Socket.hh:59
Direction direction() const
virtual int portCount() const
Definition Unit.cc:135
virtual boost::format text(int textId)
static void setLabel(Texts::TextGenerator *generator, wxWindow *widget, int textID)
static wxString toWxString(const std::string &source)
static std::string toString(const wxString &source)