summaryrefslogtreecommitdiff
path: root/utils/regtools/qeditor
diff options
context:
space:
mode:
Diffstat (limited to 'utils/regtools/qeditor')
-rw-r--r--utils/regtools/qeditor/analyser.cpp2
-rw-r--r--utils/regtools/qeditor/analyser.h10
-rw-r--r--utils/regtools/qeditor/backend.cpp422
-rw-r--r--utils/regtools/qeditor/backend.h208
-rw-r--r--utils/regtools/qeditor/main.cpp12
-rw-r--r--utils/regtools/qeditor/mainwindow.cpp27
-rw-r--r--utils/regtools/qeditor/mainwindow.h13
-rw-r--r--utils/regtools/qeditor/qeditor.pro2
-rw-r--r--utils/regtools/qeditor/regdisplaypanel.cpp157
-rw-r--r--utils/regtools/qeditor/regdisplaypanel.h36
-rw-r--r--utils/regtools/qeditor/regedit.cpp2222
-rw-r--r--utils/regtools/qeditor/regedit.h276
-rw-r--r--utils/regtools/qeditor/regtab.cpp152
-rw-r--r--utils/regtools/qeditor/regtab.h13
-rw-r--r--utils/regtools/qeditor/std_analysers.cpp429
-rw-r--r--utils/regtools/qeditor/std_analysers.h26
-rw-r--r--utils/regtools/qeditor/utils.cpp644
-rw-r--r--utils/regtools/qeditor/utils.h169
18 files changed, 2912 insertions, 1908 deletions
diff --git a/utils/regtools/qeditor/analyser.cpp b/utils/regtools/qeditor/analyser.cpp
index 7b60dcffcd..aa422cbc6f 100644
--- a/utils/regtools/qeditor/analyser.cpp
+++ b/utils/regtools/qeditor/analyser.cpp
@@ -20,7 +20,7 @@
20 ****************************************************************************/ 20 ****************************************************************************/
21#include "analyser.h" 21#include "analyser.h"
22 22
23Analyser::Analyser(const SocRef& soc, IoBackend *backend) 23Analyser::Analyser(const soc_desc::soc_ref_t& soc, IoBackend *backend)
24 :m_soc(soc), m_io_backend(backend) 24 :m_soc(soc), m_io_backend(backend)
25{ 25{
26} 26}
diff --git a/utils/regtools/qeditor/analyser.h b/utils/regtools/qeditor/analyser.h
index 83b0a9c469..a099399a3b 100644
--- a/utils/regtools/qeditor/analyser.h
+++ b/utils/regtools/qeditor/analyser.h
@@ -30,13 +30,13 @@
30class Analyser : public RegTabPanel 30class Analyser : public RegTabPanel
31{ 31{
32public: 32public:
33 Analyser(const SocRef& soc, IoBackend *backend); 33 Analyser(const soc_desc::soc_ref_t& soc, IoBackend *backend);
34 virtual ~Analyser(); 34 virtual ~Analyser();
35 virtual void AllowWrite(bool en) { Q_UNUSED(en); } 35 virtual void AllowWrite(bool en) { Q_UNUSED(en); }
36 virtual QWidget *GetWidget() = 0; 36 virtual QWidget *GetWidget() = 0;
37 37
38protected: 38protected:
39 const SocRef& m_soc; 39 soc_desc::soc_ref_t m_soc;
40 IoBackend *m_io_backend; 40 IoBackend *m_io_backend;
41}; 41};
42 42
@@ -49,7 +49,7 @@ public:
49 virtual QString GetName() = 0; 49 virtual QString GetName() = 0;
50 virtual bool SupportSoc(const QString& soc_name) = 0; 50 virtual bool SupportSoc(const QString& soc_name) = 0;
51 // return NULL of soc is not handled by the analyser 51 // return NULL of soc is not handled by the analyser
52 virtual Analyser *Create(const SocRef& soc, IoBackend *backend) = 0; 52 virtual Analyser *Create(const soc_desc::soc_ref_t& soc, IoBackend *backend) = 0;
53private: 53private:
54 QString m_name; 54 QString m_name;
55 55
@@ -72,9 +72,9 @@ public:
72 virtual QString GetName() { return m_name; } 72 virtual QString GetName() { return m_name; }
73 virtual bool SupportSoc(const QString& soc_name) { return T::SupportSoc(soc_name); } 73 virtual bool SupportSoc(const QString& soc_name) { return T::SupportSoc(soc_name); }
74 // return NULL of soc is not handled by the analyser 74 // return NULL of soc is not handled by the analyser
75 virtual T *Create(const SocRef& soc, IoBackend *backend) 75 virtual T *Create(const soc_desc::soc_ref_t& soc, IoBackend *backend)
76 { 76 {
77 if(!T::SupportSoc(soc.GetSoc().name.c_str())) 77 if(!T::SupportSoc(QString::fromStdString(soc.get()->name)))
78 return 0; 78 return 0;
79 return new T(soc, backend); 79 return new T(soc, backend);
80 } 80 }
diff --git a/utils/regtools/qeditor/backend.cpp b/utils/regtools/qeditor/backend.cpp
index cbaff7370d..5f006b0aa7 100644
--- a/utils/regtools/qeditor/backend.cpp
+++ b/utils/regtools/qeditor/backend.cpp
@@ -28,15 +28,15 @@
28 * SocFile 28 * SocFile
29 */ 29 */
30SocFile::SocFile() 30SocFile::SocFile()
31 :m_valid(false) 31 :m_valid(true)
32{ 32{
33} 33}
34 34
35SocFile::SocFile(const QString& filename) 35SocFile::SocFile(const QString& filename)
36 :m_filename(filename) 36 :m_filename(filename)
37{ 37{
38 m_valid = parse_xml(filename.toStdString(), m_soc); 38 soc_desc::error_context_t ctx;
39 normalize(m_soc); 39 m_valid = soc_desc::parse_xml(filename.toStdString(), m_soc, ctx);
40} 40}
41 41
42bool SocFile::IsValid() 42bool SocFile::IsValid()
@@ -44,9 +44,12 @@ bool SocFile::IsValid()
44 return m_valid; 44 return m_valid;
45} 45}
46 46
47SocRef SocFile::GetSocRef() 47soc_desc::soc_ref_t SocFile::GetSocRef()
48{ 48{
49 return SocRef(this); 49 if(m_valid)
50 return soc_desc::soc_ref_t(&m_soc);
51 else
52 return soc_desc::soc_ref_t();
50} 53}
51 54
52QString SocFile::GetFilename() 55QString SocFile::GetFilename()
@@ -67,15 +70,22 @@ QList< SocFileRef > Backend::GetSocFileList()
67{ 70{
68 QList< SocFileRef > list; 71 QList< SocFileRef > list;
69 for(std::list< SocFile >::iterator it = m_socs.begin(); it != m_socs.end(); ++it) 72 for(std::list< SocFile >::iterator it = m_socs.begin(); it != m_socs.end(); ++it)
70 list.append(SocFileRef(&(*it))); 73 {
74 if(it->IsValid())
75 list.append(SocFileRef(&(*it)));
76 }
71 return list; 77 return list;
72} 78}
73 79
74QList< SocRef > Backend::GetSocList() 80QList< soc_desc::soc_ref_t > Backend::GetSocList()
75{ 81{
76 QList< SocRef > list; 82 QList< soc_desc::soc_ref_t > list;
77 for(std::list< SocFile >::iterator it = m_socs.begin(); it != m_socs.end(); ++it) 83 for(std::list< SocFile >::iterator it = m_socs.begin(); it != m_socs.end(); ++it)
78 list.append(it->GetSocRef()); 84 {
85 soc_desc::soc_ref_t r = it->GetSocRef();
86 if(r.valid())
87 list.append(r);
88 }
79 return list; 89 return list;
80} 90}
81 91
@@ -85,7 +95,7 @@ bool Backend::LoadSocDesc(const QString& filename)
85 if(!f.IsValid()) 95 if(!f.IsValid())
86 return false; 96 return false;
87 m_socs.push_back(f); 97 m_socs.push_back(f);
88 emit OnSocListChanged(); 98 emit OnSocAdded(SocFileRef(&m_socs.back()));
89 return true; 99 return true;
90} 100}
91 101
@@ -107,6 +117,63 @@ IoBackend *Backend::CreateHWStubIoBackend(HWStubDevice *dev)
107#endif 117#endif
108 118
109/** 119/**
120 * DummyIoBackend
121 */
122
123DummyIoBackend::DummyIoBackend()
124{
125}
126
127bool DummyIoBackend::IsValid()
128{
129 return false;
130}
131
132QString DummyIoBackend::GetSocName()
133{
134 return "";
135}
136
137bool DummyIoBackend::ReadRegister(soc_addr_t addr, soc_word_t& value,
138 unsigned width)
139{
140 Q_UNUSED(addr);
141 Q_UNUSED(value);
142 Q_UNUSED(width);
143 return false;
144}
145
146bool DummyIoBackend::Reload()
147{
148 return false;
149}
150
151bool DummyIoBackend::IsReadOnly()
152{
153 return true;
154}
155
156bool DummyIoBackend::WriteRegister(soc_addr_t addr, soc_word_t value,
157 unsigned width, WriteMode mode)
158{
159 Q_UNUSED(addr);
160 Q_UNUSED(value);
161 Q_UNUSED(mode);
162 Q_UNUSED(width);
163 return false;
164}
165
166bool DummyIoBackend::IsDirty()
167{
168 return false;
169}
170
171bool DummyIoBackend::Commit()
172{
173 return false;
174}
175
176/**
110 * RamIoBackend 177 * RamIoBackend
111 */ 178 */
112RamIoBackend::RamIoBackend(const QString& soc_name) 179RamIoBackend::RamIoBackend(const QString& soc_name)
@@ -114,9 +181,36 @@ RamIoBackend::RamIoBackend(const QString& soc_name)
114 m_soc = soc_name; 181 m_soc = soc_name;
115} 182}
116 183
117bool RamIoBackend::ReadRegister(const QString& name, soc_word_t& value) 184bool RamIoBackend::IsValid()
185{
186 return m_soc != "";
187}
188
189QString RamIoBackend::GetSocName()
190{
191 return m_soc;
192}
193
194void RamIoBackend::SetSocName(const QString& soc_name)
195{
196 m_soc = soc_name;
197}
198
199bool RamIoBackend::RamIoBackend::Reload()
118{ 200{
119 QMap<QString, soc_word_t>::const_iterator it = m_map.find(name); 201 return false;
202}
203
204bool RamIoBackend::IsReadOnly()
205{
206 return false;
207}
208
209bool RamIoBackend::ReadRegister(soc_addr_t addr, soc_word_t& value,
210 unsigned width)
211{
212 Q_UNUSED(width);
213 QMap<soc_addr_t, soc_word_t>::const_iterator it = m_map.find(addr);
120 if(it == m_map.end()) 214 if(it == m_map.end())
121 return false; 215 return false;
122 value = it.value(); 216 value = it.value();
@@ -128,19 +222,29 @@ void RamIoBackend::DeleteAll()
128 m_map.clear(); 222 m_map.clear();
129} 223}
130 224
131bool RamIoBackend::WriteRegister(const QString& name, soc_word_t value, WriteMode mode) 225bool RamIoBackend::WriteRegister(soc_addr_t addr, soc_word_t value,
226 unsigned width, WriteMode mode)
132{ 227{
228 Q_UNUSED(width);
133 switch(mode) 229 switch(mode)
134 { 230 {
135 case Write: m_map[name] = value; return true; 231 case Write: m_map[addr] = value; return true;
136 case Set: m_map[name] |= value; return true; 232 case Set: m_map[addr] |= value; return true;
137 case Clear: m_map[name] &= ~value; return true; 233 case Clear: m_map[addr] &= ~value; return true;
138 case Toggle: m_map[name] ^= value; return true; 234 case Toggle: m_map[addr] ^= value; return true;
139 default: return false; 235 default: return false;
140 } 236 }
141} 237}
142 238
239bool RamIoBackend::IsDirty()
240{
241 return false;
242}
143 243
244bool RamIoBackend::Commit()
245{
246 return false;
247}
144 248
145/** 249/**
146 * FileIoBackend 250 * FileIoBackend
@@ -154,6 +258,10 @@ FileIoBackend::FileIoBackend(const QString& filename, const QString& soc_name)
154 Reload(); 258 Reload();
155} 259}
156 260
261bool FileIoBackend::IsValid()
262{
263 return m_valid;
264}
157 265
158bool FileIoBackend::Reload() 266bool FileIoBackend::Reload()
159{ 267{
@@ -170,25 +278,27 @@ bool FileIoBackend::Reload()
170 int idx = line.indexOf('='); 278 int idx = line.indexOf('=');
171 if(idx == -1) 279 if(idx == -1)
172 continue; 280 continue;
173 QString key = line.left(idx).trimmed(); 281 QString key_str = line.left(idx).trimmed();
174 bool ok; 282 QString val_str = line.mid(idx + 1).trimmed();
175 soc_word_t val = line.mid(idx + 1).trimmed().toULong(&ok, 0); 283 bool key_ok,val_ok;
176 if(key == "HW") 284 soc_word_t val = val_str.toULong(&val_ok, 0);
177 m_soc = line.mid(idx + 1).trimmed(); 285 soc_word_t key = key_str.toULong(&key_ok, 0);
178 else if(ok) 286 if(key_str == "soc")
179 RamIoBackend::WriteRegister(key, val, Write); 287 m_soc = val_str;
288 else if(key_ok && val_ok)
289 RamIoBackend::WriteRegister(key, val, 32, Write);
180 } 290 }
181
182 m_readonly = !QFileInfo(file).isWritable(); 291 m_readonly = !QFileInfo(file).isWritable();
183 m_dirty = false; 292 m_dirty = false;
184 m_valid = true; 293 m_valid = true;
185 return true; 294 return true;
186} 295}
187 296
188bool FileIoBackend::WriteRegister(const QString& name, soc_word_t value, WriteMode mode) 297bool FileIoBackend::WriteRegister(soc_addr_t addr, soc_word_t value,
298 unsigned width, WriteMode mode)
189{ 299{
190 m_dirty = true; 300 m_dirty = true;
191 return RamIoBackend::WriteRegister(name, value, mode); 301 return RamIoBackend::WriteRegister(addr, value, width, mode);
192} 302}
193 303
194bool FileIoBackend::Commit() 304bool FileIoBackend::Commit()
@@ -199,17 +309,32 @@ bool FileIoBackend::Commit()
199 if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) 309 if(!file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text))
200 return false; 310 return false;
201 QTextStream out(&file); 311 QTextStream out(&file);
202 out << "HW = " << m_soc << "\n"; 312 out << "soc = " << m_soc << "\n";
203 QMapIterator< QString, soc_word_t > it(m_map); 313 QMapIterator< soc_addr_t, soc_word_t > it(m_map);
204 while(it.hasNext()) 314 while(it.hasNext())
205 { 315 {
206 it.next(); 316 it.next();
207 out << it.key() << " = " << hex << showbase << it.value() << "\n"; 317 out << hex << showbase << it.key() << " = " << hex << showbase << it.value() << "\n";
208 } 318 }
209 out.flush(); 319 out.flush();
210 return file.flush(); 320 return file.flush();
211} 321}
212 322
323bool FileIoBackend::IsReadOnly()
324{
325 return m_readonly;
326}
327
328bool FileIoBackend::IsDirty()
329{
330 return m_dirty;
331}
332
333QString FileIoBackend::GetFileName()
334{
335 return m_filename;
336}
337
213#ifdef HAVE_HWSTUB 338#ifdef HAVE_HWSTUB
214/** 339/**
215 * HWStubDevice 340 * HWStubDevice
@@ -355,6 +480,8 @@ HWStubIoBackend::HWStubIoBackend(HWStubDevice *dev)
355 else 480 else
356 m_soc = QString("pp%1").arg(pp.wChipID, 4, 16, QChar('0')); 481 m_soc = QString("pp%1").arg(pp.wChipID, 4, 16, QChar('0'));
357 } 482 }
483 else if(target.dID == HWSTUB_TARGET_ATJ)
484 m_soc = "atj213x";
358 else 485 else
359 m_soc = target.bName; 486 m_soc = target.bName;
360} 487}
@@ -369,13 +496,44 @@ HWStubIoBackend::~HWStubIoBackend()
369 delete m_dev; 496 delete m_dev;
370} 497}
371 498
372bool HWStubIoBackend::ReadRegister(soc_addr_t addr, soc_word_t& value) 499bool HWStubIoBackend::IsValid()
500{
501 return m_dev->IsValid();
502}
503
504bool HWStubIoBackend::IsReadOnly()
505{
506 return false;
507}
508
509bool HWStubIoBackend::IsDirty()
373{ 510{
374 return m_dev->ReadMem(addr, sizeof(value), &value); 511 return false;
375} 512}
376 513
377bool HWStubIoBackend::WriteRegister(soc_addr_t addr, soc_word_t value, WriteMode mode) 514bool HWStubIoBackend::Commit()
378{ 515{
516 return true;
517}
518
519HWStubDevice *HWStubIoBackend::GetDevice()
520{
521 return m_dev;
522}
523
524bool HWStubIoBackend::ReadRegister(soc_addr_t addr, soc_word_t& value,
525 unsigned width)
526{
527 if(width != 8 && width != 16 && width != 32)
528 return false;
529 return m_dev->ReadMem(addr, width / 8, &value);
530}
531
532bool HWStubIoBackend::WriteRegister(soc_addr_t addr, soc_word_t value,
533 unsigned width, WriteMode mode)
534{
535 if(width != 8 && width != 16 && width != 32)
536 return false;
379 switch(mode) 537 switch(mode)
380 { 538 {
381 case Set: addr += 4; break; 539 case Set: addr += 4; break;
@@ -383,7 +541,7 @@ bool HWStubIoBackend::WriteRegister(soc_addr_t addr, soc_word_t value, WriteMode
383 case Toggle: addr += 12; break; 541 case Toggle: addr += 12; break;
384 default: break; 542 default: break;
385 } 543 }
386 return m_dev->WriteMem(addr, sizeof(value), &value); 544 return m_dev->WriteMem(addr, width / 8, &value);
387} 545}
388 546
389bool HWStubIoBackend::Reload() 547bool HWStubIoBackend::Reload()
@@ -486,146 +644,146 @@ lib_usb_init __lib_usb_init;
486 * BackendHelper 644 * BackendHelper
487 */ 645 */
488 646
489BackendHelper::BackendHelper(IoBackend *io_backend, const SocRef& soc) 647BackendHelper::BackendHelper(IoBackend *io_backend, const soc_desc::soc_ref_t& soc)
490 :m_io_backend(io_backend), m_soc(soc) 648 :m_io_backend(io_backend), m_soc(soc)
491{ 649{
492} 650}
493 651
494bool BackendHelper::ReadRegister(const QString& dev, const QString& reg, soc_word_t& v) 652QString BackendHelper::GetPath(const soc_desc::node_inst_t& inst)
495{ 653{
496 if(m_io_backend->SupportAccess(IoBackend::ByName)) 654 if(!inst.valid() || inst.is_root())
497 return m_io_backend->ReadRegister("HW." + dev + "." + reg, v); 655 return QString();
498 if(m_io_backend->SupportAccess(IoBackend::ByAddress)) 656 QString s = GetPath(inst.parent());
499 { 657 if(!s.isEmpty())
500 soc_addr_t addr; 658 s += ".";
501 if(GetRegisterAddress(dev, reg, addr)) 659 s += inst.name().c_str();
502 return m_io_backend->ReadRegister(addr, v); 660 if(inst.is_indexed())
503 } 661 s = QString("%1[%2]").arg(s).arg(inst.index());
504 return false; 662 return s;
505}
506
507bool BackendHelper::WriteRegister(const QString& dev, const QString& reg,
508 soc_word_t v, IoBackend::WriteMode mode)
509{
510 if(m_io_backend->SupportAccess(IoBackend::ByName))
511 return m_io_backend->WriteRegister("HW." + dev + "." + reg, v, mode);
512 if(m_io_backend->SupportAccess(IoBackend::ByAddress))
513 {
514 soc_addr_t addr;
515 if(GetRegisterAddress(dev, reg, addr))
516 return m_io_backend->WriteRegister(addr, v, mode);
517 }
518 return false;
519} 663}
520 664
521bool BackendHelper::GetDevRef(const QString& sdev, SocDevRef& ref) 665soc_desc::node_inst_t BackendHelper::ParsePath(const QString& path)
522{ 666{
523 for(size_t i = 0; i < m_soc.GetSoc().dev.size(); i++) 667 soc_desc::node_inst_t inst = m_soc.root_inst();
668 /* empty path is root */
669 if(path.isEmpty())
670 return inst;
671 int pos = 0;
672 while(pos < path.size())
524 { 673 {
525 const soc_dev_t& dev = m_soc.GetSoc().dev[i]; 674 /* try to find the next separator */
526 for(size_t j = 0; j < dev.addr.size(); j++) 675 int next = path.indexOf('.', pos);
527 if(dev.addr[j].name.c_str() == sdev) 676 if(next == -1)
528 { 677 next = path.size();
529 ref = SocDevRef(m_soc, i, j); 678 /* try to find the index, if any */
530 return true; 679 int lidx = path.indexOf('[', pos);
531 } 680 if(lidx == -1 || lidx > next)
681 lidx = next;
682 /* extract name */
683 std::string name = path.mid(pos, lidx - pos).toStdString();
684 /* and index */
685 if(lidx < next)
686 {
687 int ridx = path.indexOf(']', lidx + 1);
688 /* syntax error ? */
689 if(ridx == -1 || ridx > next)
690 return soc_desc::node_inst_t();
691 /* invalid number ? */
692 bool ok = false;
693 size_t idx = path.mid(lidx + 1, ridx - lidx - 1).toUInt(&ok);
694 if(ok)
695 inst = inst.child(name, idx);
696 else
697 inst = soc_desc::node_inst_t();
698 }
699 else
700 inst = inst.child(name);
701 /* advance right after the separator */
702 pos = next + 1;
532 } 703 }
533 return false; 704 return inst;
534} 705}
535 706
536bool BackendHelper::GetRegRef(const SocDevRef& dev, const QString& sreg, SocRegRef& ref) 707bool BackendHelper::ReadRegister(const soc_desc::node_inst_t& inst,
708 soc_word_t& v)
537{ 709{
538 const soc_dev_t& sdev = dev.GetDev(); 710 soc_addr_t addr;
539 for(size_t i = 0; i < sdev.reg.size(); i++) 711 if(!GetRegisterAddress(inst, addr))
540 { 712 return false;
541 const soc_reg_t& reg = sdev.reg[i]; 713 return m_io_backend->ReadRegister(addr, v, inst.node().reg().get()->width);
542 for(size_t j = 0; j < reg.addr.size(); j++)
543 {
544 if(reg.addr[j].name.c_str() == sreg)
545 {
546 ref = SocRegRef(dev, i, j);
547 return true;
548 }
549 }
550 }
551 return false;
552} 714}
553 715
554bool BackendHelper::GetFieldRef(const SocRegRef& reg, const QString& sfield, SocFieldRef& ref) 716bool BackendHelper::WriteRegister(const soc_desc::node_inst_t& inst,
717 soc_word_t v, IoBackend::WriteMode mode)
555{ 718{
556 for(size_t i = 0; i < reg.GetReg().field.size(); i++) 719 soc_addr_t addr;
557 if(reg.GetReg().field[i].name.c_str() == sfield) 720 if(!GetRegisterAddress(inst, addr))
558 { 721 return false;
559 ref = SocFieldRef(reg, i); 722 return m_io_backend->WriteRegister(addr, v, inst.node().reg().get()->width, mode);
560 return true;
561 }
562 return false;
563} 723}
564 724
565bool BackendHelper::GetRegisterAddress(const QString& dev, const QString& reg, 725bool BackendHelper::GetRegisterAddress(const soc_desc::node_inst_t& inst,
566 soc_addr_t& addr) 726 soc_addr_t& addr)
567{ 727{
568 SocDevRef dev_ref; 728 if(!inst.valid())
569 SocRegRef reg_ref;
570 if(!GetDevRef(dev, dev_ref) || !GetRegRef(dev_ref, reg, reg_ref))
571 return false; 729 return false;
572 addr = dev_ref.GetDevAddr().addr + reg_ref.GetRegAddr().addr; 730 addr = inst.addr();
573 return true; 731 return true;
574} 732}
575 733
576bool BackendHelper::ReadRegisterField(const QString& dev, const QString& reg, 734bool BackendHelper::ReadRegisterField(const soc_desc::node_inst_t& inst,
577 const QString& field, soc_word_t& v) 735 const QString& field, soc_word_t& v)
578{ 736{
579 SocDevRef dev_ref; 737 soc_desc::field_ref_t ref = inst.node().reg().field(field.toStdString());
580 SocRegRef reg_ref; 738 if(!ref.valid())
581 SocFieldRef field_ref;
582 if(!GetDevRef(dev, dev_ref) || !GetRegRef(dev_ref, reg, reg_ref) ||
583 !GetFieldRef(reg_ref, field, field_ref))
584 return false; 739 return false;
585 if(!ReadRegister(dev, reg, v)) 740 if(!ReadRegister(inst, v))
586 return false; 741 return false;
587 v = (v & field_ref.GetField().bitmask()) >> field_ref.GetField().first_bit; 742 v = (v & ref.get()->bitmask()) >> ref.get()->pos;
588 return true; 743 return true;
589} 744}
590 745
591bool BackendHelper::DumpAllRegisters(const QString& filename, bool ignore_errors) 746bool BackendHelper::DumpAllRegisters(const QString& filename, bool ignore_errors)
592{ 747{
593 FileIoBackend b(filename, QString::fromStdString(m_soc.GetSoc().name)); 748 FileIoBackend b(filename, QString::fromStdString(m_soc.get()->name));
594 bool ret = DumpAllRegisters(&b, ignore_errors); 749 bool ret = DumpAllRegisters(&b, ignore_errors);
595 return ret && b.Commit(); 750 return ret && b.Commit();
596} 751}
597 752
598bool BackendHelper::DumpAllRegisters(IoBackend *backend, bool ignore_errors) 753bool BackendHelper::DumpAllRegisters(IoBackend *backend, bool ignore_errors)
599{ 754{
600 BackendHelper bh(backend, m_soc); 755 BackendHelper helper(backend, m_soc);
756 return DumpAllRegisters(&helper, m_soc.root_inst(), ignore_errors);
757}
758
759bool BackendHelper::DumpAllRegisters(BackendHelper *bh,
760 const soc_desc::node_inst_t& inst, bool ignore_errors)
761{
601 bool ret = true; 762 bool ret = true;
602 for(size_t i = 0; i < m_soc.GetSoc().dev.size(); i++) 763 if(inst.node().reg().valid())
764 {
765 soc_word_t val;
766 if(!ReadRegister(inst, val))
767 {
768 ret = false;
769 if(!ignore_errors)
770 return false;
771 }
772 else if(!bh->WriteRegister(inst, val))
773 {
774 ret = false;
775 if(!ignore_errors)
776 return false;
777 }
778 }
779 std::vector< soc_desc::node_inst_t > list = inst.children();
780 for(size_t i = 0; i < list.size(); i++)
603 { 781 {
604 const soc_dev_t& dev = m_soc.GetSoc().dev[i]; 782 if(!DumpAllRegisters(bh, list[i], ignore_errors))
605 for(size_t j = 0; j < dev.addr.size(); j++)
606 { 783 {
607 QString devname = QString::fromStdString(dev.addr[j].name); 784 ret = false;
608 for(size_t k = 0; k < dev.reg.size(); k++) 785 if(!ignore_errors)
609 { 786 return false;
610 const soc_reg_t& reg = dev.reg[k];
611 for(size_t l = 0; l < reg.addr.size(); l++)
612 {
613 QString regname = QString::fromStdString(reg.addr[l].name);
614 soc_word_t val;
615 if(!ReadRegister(devname, regname, val))
616 {
617 ret = false;
618 if(!ignore_errors)
619 return false;
620 }
621 else if(!bh.WriteRegister(devname, regname, val))
622 {
623 ret = false;
624 if(!ignore_errors)
625 return false;
626 }
627 }
628 }
629 } 787 }
630 } 788 }
631 return ret; 789 return ret;
diff --git a/utils/regtools/qeditor/backend.h b/utils/regtools/qeditor/backend.h
index 934c1c359b..17eeb44533 100644
--- a/utils/regtools/qeditor/backend.h
+++ b/utils/regtools/qeditor/backend.h
@@ -26,14 +26,17 @@
26#include <QMap> 26#include <QMap>
27#include <QVector> 27#include <QVector>
28#include <QMetaType> 28#include <QMetaType>
29#include <QAbstractItemModel>
29#ifdef HAVE_HWSTUB 30#ifdef HAVE_HWSTUB
30#include "hwstub.h" 31#include "hwstub.h"
31#endif 32#endif
32#include "soc_desc_v1.hpp" 33#include "soc_desc.hpp"
33 34
34/* we don't want to import the entire soc_desc except for a few selected 35/* we don't want to import the entire soc_desc except for a few selected
35 * pieces */ 36 * pieces */
36using namespace soc_desc_v1; 37using soc_desc::soc_word_t;
38using soc_desc::soc_addr_t;
39using soc_desc::soc_id_t;
37 40
38class IoBackend : public QObject 41class IoBackend : public QObject
39{ 42{
@@ -47,35 +50,20 @@ public:
47 Write, Set, Clear, Toggle 50 Write, Set, Clear, Toggle
48 }; 51 };
49 52
50 enum AccessType
51 {
52 ByName,
53 ByAddress,
54 };
55
56 /** Register naming convention: name based access are of the form:
57 * HW.dev.reg
58 * where <dev> is the device name (including index like APPUART1)
59 * and <reg> is the register name (including index like PRIORITY29) */
60 /* report whether backend is valid */ 53 /* report whether backend is valid */
61 virtual bool IsValid() = 0; 54 virtual bool IsValid() = 0;
62 /* report whether backend supports register access type */
63 virtual bool SupportAccess(AccessType type) = 0;
64 /* get SoC name */ 55 /* get SoC name */
65 virtual QString GetSocName() = 0; 56 virtual QString GetSocName() = 0;
66 /* read a register by name or address */ 57 /* read a register */
67 virtual bool ReadRegister(const QString& name, soc_word_t& value) = 0; 58 virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value, unsigned width) = 0;
68 virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value) = 0;
69 /* reload content (if it makes sense) */ 59 /* reload content (if it makes sense) */
70 virtual bool Reload() = 0; 60 virtual bool Reload() = 0;
71 /* check whether backend supports writing */ 61 /* check whether backend supports writing */
72 virtual bool IsReadOnly() = 0; 62 virtual bool IsReadOnly() = 0;
73 /* write a register by name or address 63 /* write a register by name or address
74 * NOTE: even on a read-only backend, a write is allowed be successful as long 64 * NOTE: even on a read-only backend, a write is allowed to be successful as long
75 * as commit fails */ 65 * as commit fails */
76 virtual bool WriteRegister(const QString& name, soc_word_t value, 66 virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, unsigned width,
77 WriteMode mode = Write) = 0;
78 virtual bool WriteRegister(soc_addr_t addr, soc_word_t value,
79 WriteMode mode = Write) = 0; 67 WriteMode mode = Write) = 0;
80 /* check whether backend contains uncommitted (ie cached) writes */ 68 /* check whether backend contains uncommitted (ie cached) writes */
81 virtual bool IsDirty() = 0; 69 virtual bool IsDirty() = 0;
@@ -87,23 +75,17 @@ class DummyIoBackend : public IoBackend
87{ 75{
88 Q_OBJECT 76 Q_OBJECT
89public: 77public:
90 DummyIoBackend() {} 78 DummyIoBackend();
91 79
92 virtual bool IsValid() { return false; } 80 virtual bool IsValid();
93 virtual bool SupportAccess(AccessType type) { Q_UNUSED(type); return false; } 81 virtual QString GetSocName();
94 virtual QString GetSocName() { return ""; } 82 virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value, unsigned width);
95 virtual bool ReadRegister(const QString& name, soc_word_t& value) 83 virtual bool Reload();
96 { Q_UNUSED(name); Q_UNUSED(value); return false; } 84 virtual bool IsReadOnly();
97 virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value) 85 virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, unsigned width,
98 { Q_UNUSED(addr); Q_UNUSED(value); return false; } 86 WriteMode mode);
99 virtual bool Reload() { return false; } 87 virtual bool IsDirty();
100 virtual bool IsReadOnly() { return true; } 88 virtual bool Commit();
101 virtual bool WriteRegister(const QString& name, soc_word_t value, WriteMode mode)
102 { Q_UNUSED(name); Q_UNUSED(value); Q_UNUSED(mode); return false; }
103 virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, WriteMode mode)
104 { Q_UNUSED(addr); Q_UNUSED(value); Q_UNUSED(mode); return false; }
105 virtual bool IsDirty() { return false; }
106 virtual bool Commit() { return false; }
107}; 89};
108 90
109/** The RAM backend doesn't have any backend storage and stores all values in 91/** The RAM backend doesn't have any backend storage and stores all values in
@@ -114,26 +96,22 @@ class RamIoBackend : public IoBackend
114public: 96public:
115 RamIoBackend(const QString& soc_name = ""); 97 RamIoBackend(const QString& soc_name = "");
116 98
117 virtual bool IsValid() { return m_soc != ""; } 99 virtual bool IsValid();
118 virtual bool SupportAccess(AccessType type) { return type == ByName; } 100 virtual QString GetSocName();
119 virtual QString GetSocName() { return m_soc; } 101 virtual void SetSocName(const QString& soc_name);
120 virtual void SetSocName(const QString& soc_name) { m_soc = soc_name; } 102 virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value, unsigned width);
121 virtual bool ReadRegister(const QString& name, soc_word_t& value); 103 virtual bool Reload();
122 virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value) 104 virtual bool IsReadOnly();
123 { Q_UNUSED(addr); Q_UNUSED(value); return false; } 105 virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, unsigned width,
124 virtual bool Reload() { return false; } 106 WriteMode mode);
125 virtual bool IsReadOnly() { return false; } 107 virtual bool IsDirty();
126 virtual bool WriteRegister(const QString& name, soc_word_t value, WriteMode mode); 108 virtual bool Commit();
127 virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, WriteMode mode)
128 { Q_UNUSED(addr); Q_UNUSED(value); Q_UNUSED(mode); return false; }
129 virtual bool IsDirty() { return false; }
130 virtual bool Commit() { return false; }
131 /* clear all entries of the backend */ 109 /* clear all entries of the backend */
132 virtual void DeleteAll(); 110 virtual void DeleteAll();
133 111
134protected: 112protected:
135 QString m_soc; 113 QString m_soc;
136 QMap< QString, soc_word_t > m_map; 114 QMap< soc_addr_t, soc_word_t > m_map;
137}; 115};
138 116
139/** NOTE the File backend makes a difference between writes and commits: 117/** NOTE the File backend makes a difference between writes and commits:
@@ -144,14 +122,14 @@ class FileIoBackend : public RamIoBackend
144public: 122public:
145 FileIoBackend(const QString& filename, const QString& soc_name = ""); 123 FileIoBackend(const QString& filename, const QString& soc_name = "");
146 124
147 virtual bool IsValid() { return m_valid; } 125 virtual bool IsValid();
148 virtual bool SupportAccess(AccessType type) { return type == ByName; }
149 virtual bool Reload(); 126 virtual bool Reload();
150 virtual bool IsReadOnly() { return m_readonly; } 127 virtual bool IsReadOnly();
151 virtual bool WriteRegister(const QString& name, soc_word_t value, WriteMode mode); 128 virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, unsigned width,
152 virtual bool IsDirty() { return m_dirty; } 129 WriteMode mode);
130 virtual bool IsDirty();
153 virtual bool Commit(); 131 virtual bool Commit();
154 QString GetFileName() { return m_filename; } 132 QString GetFileName();
155 133
156protected: 134protected:
157 QString m_filename; 135 QString m_filename;
@@ -204,20 +182,16 @@ public:
204 HWStubIoBackend(HWStubDevice *dev); 182 HWStubIoBackend(HWStubDevice *dev);
205 virtual ~HWStubIoBackend(); 183 virtual ~HWStubIoBackend();
206 184
207 virtual bool IsValid() { return m_dev->IsValid(); } 185 virtual bool IsValid();
208 virtual bool SupportAccess(AccessType type) { return type == ByAddress; }
209 virtual QString GetSocName(); 186 virtual QString GetSocName();
210 virtual bool ReadRegister(const QString& name, soc_word_t& value) 187 virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value, unsigned width);
211 { Q_UNUSED(name); Q_UNUSED(value); return false; }
212 virtual bool ReadRegister(soc_addr_t addr, soc_word_t& value);
213 virtual bool Reload(); 188 virtual bool Reload();
214 virtual bool IsReadOnly() { return false; } 189 virtual bool IsReadOnly();
215 virtual bool WriteRegister(const QString& name, soc_word_t value, WriteMode mode) 190 virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, unsigned width,
216 { Q_UNUSED(name); Q_UNUSED(value); Q_UNUSED(mode); return false; } 191 WriteMode mode);
217 virtual bool WriteRegister(soc_addr_t addr, soc_word_t value, WriteMode mode); 192 virtual bool IsDirty();
218 virtual bool IsDirty() { return false; } 193 virtual bool Commit();
219 virtual bool Commit() { return true; } 194 HWStubDevice *GetDevice();
220 HWStubDevice *GetDevice() { return m_dev; }
221 195
222protected: 196protected:
223 QString m_soc; 197 QString m_soc;
@@ -251,8 +225,6 @@ protected:
251}; 225};
252#endif 226#endif
253 227
254class SocRef;
255
256class SocFile 228class SocFile
257{ 229{
258public: 230public:
@@ -260,14 +232,14 @@ public:
260 SocFile(const QString& filename); 232 SocFile(const QString& filename);
261 bool IsValid(); 233 bool IsValid();
262 234
263 SocRef GetSocRef(); 235 soc_desc::soc_ref_t GetSocRef();
264 QString GetFilename(); 236 QString GetFilename();
265 soc_t& GetSoc() { return m_soc; } 237 soc_desc::soc_t& GetSoc() { return m_soc; }
266 238
267protected: 239protected:
268 bool m_valid; 240 bool m_valid;
269 QString m_filename; 241 QString m_filename;
270 soc_t m_soc; 242 soc_desc::soc_t m_soc;
271}; 243};
272 244
273class SocFileRef 245class SocFileRef
@@ -283,56 +255,17 @@ protected:
283 255
284Q_DECLARE_METATYPE(SocFileRef) 256Q_DECLARE_METATYPE(SocFileRef)
285 257
286class SocRef : public SocFileRef 258Q_DECLARE_METATYPE(soc_desc::instance_t::type_t)
287{ 259Q_DECLARE_METATYPE(soc_desc::range_t::type_t)
288public:
289 SocRef() {}
290 SocRef(SocFile *file):SocFileRef(file) {}
291 soc_t& GetSoc() const { return GetSocFile()->GetSoc(); }
292};
293
294Q_DECLARE_METATYPE(SocRef)
295 260
296class SocDevRef : public SocRef 261Q_DECLARE_METATYPE(soc_desc::soc_ref_t)
297{ 262Q_DECLARE_METATYPE(soc_desc::node_ref_t)
298public: 263Q_DECLARE_METATYPE(soc_desc::register_ref_t)
299 SocDevRef() {} 264Q_DECLARE_METATYPE(soc_desc::field_ref_t)
300 SocDevRef(const SocRef& soc, int dev_idx, int dev_addr_idx) 265Q_DECLARE_METATYPE(soc_desc::node_inst_t)
301 :SocRef(soc), m_dev_idx(dev_idx), m_dev_addr_idx(dev_addr_idx) {}
302 int GetDevIndex() const { return m_dev_idx; }
303 soc_dev_t& GetDev() const { return GetSoc().dev[GetDevIndex()]; }
304 int GetDevAddrIndex() const { return m_dev_addr_idx; }
305 soc_dev_addr_t& GetDevAddr() const { return GetDev().addr[GetDevAddrIndex()]; }
306protected:
307 int m_dev_idx, m_dev_addr_idx;
308};
309
310class SocRegRef : public SocDevRef
311{
312public:
313 SocRegRef() {}
314 SocRegRef(const SocDevRef& dev, int reg_idx, int reg_addr_idx)
315 :SocDevRef(dev), m_reg_idx(reg_idx), m_reg_addr_idx(reg_addr_idx) {}
316 int GetRegIndex() const { return m_reg_idx; }
317 soc_reg_t& GetReg() const { return GetDev().reg[GetRegIndex()]; }
318 int GetRegAddrIndex() const { return m_reg_addr_idx; }
319 soc_reg_addr_t& GetRegAddr() const { return GetReg().addr[GetRegAddrIndex()]; }
320protected:
321 int m_reg_idx, m_reg_addr_idx;
322};
323
324class SocFieldRef : public SocRegRef
325{
326public:
327 SocFieldRef(){}
328 SocFieldRef(const SocRegRef& reg, int field_idx)
329 :SocRegRef(reg), m_field_idx(field_idx) {}
330 int GetFieldIndex() const { return m_field_idx; }
331 soc_reg_field_t& GetField() const { return GetReg().field[GetFieldIndex()]; }
332protected:
333 int m_field_idx;
334};
335 266
267/** NOTE the Backend stores soc descriptions in a way that pointers are never
268 * invalidated */
336class Backend : public QObject 269class Backend : public QObject
337{ 270{
338 Q_OBJECT 271 Q_OBJECT
@@ -340,7 +273,7 @@ public:
340 Backend(); 273 Backend();
341 274
342 QList< SocFileRef > GetSocFileList(); 275 QList< SocFileRef > GetSocFileList();
343 QList< SocRef > GetSocList(); 276 QList< soc_desc::soc_ref_t > GetSocList();
344 bool LoadSocDesc(const QString& filename); 277 bool LoadSocDesc(const QString& filename);
345 IoBackend *CreateDummyIoBackend(); 278 IoBackend *CreateDummyIoBackend();
346 IoBackend *CreateFileIoBackend(const QString& filename); 279 IoBackend *CreateFileIoBackend(const QString& filename);
@@ -349,33 +282,38 @@ public:
349#endif 282#endif
350 283
351signals: 284signals:
352 void OnSocListChanged(); 285 void OnSocAdded(const SocFileRef& ref);
286
353private: 287private:
288 /* store them as a list so that pointers are never invalidated */
354 std::list< SocFile > m_socs; 289 std::list< SocFile > m_socs;
355}; 290};
356 291
357class BackendHelper 292class BackendHelper
358{ 293{
359public: 294public:
360 BackendHelper(IoBackend *io_backend, const SocRef& soc); 295 BackendHelper(IoBackend *io_backend, const soc_desc::soc_ref_t& soc);
361 bool ReadRegister(const QString& dev, const QString& reg, soc_word_t& v); 296 QString GetPath(const soc_desc::node_inst_t& inst);
362 bool ReadRegisterField(const QString& dev, const QString& reg, 297 soc_desc::node_inst_t ParsePath(const QString& path);
298 bool ReadRegister(const soc_desc::node_inst_t& inst, soc_word_t& v);
299 bool ReadRegisterField(const soc_desc::node_inst_t& inst,
363 const QString& field, soc_word_t& v); 300 const QString& field, soc_word_t& v);
364 bool WriteRegister(const QString& dev, const QString& reg, soc_word_t v, 301 bool WriteRegister(const soc_desc::node_inst_t& inst, soc_word_t v,
365 IoBackend::WriteMode mode = IoBackend::Write); 302 IoBackend::WriteMode mode = IoBackend::Write);
366 bool GetDevRef(const QString& dev, SocDevRef& ref); 303 bool GetRegisterAddress(const soc_desc::node_inst_t& inst, soc_addr_t& addr);
367 bool GetRegRef(const SocDevRef& dev, const QString& reg, SocRegRef& ref);
368 bool GetFieldRef(const SocRegRef& reg, const QString& field, SocFieldRef& ref);
369 bool GetRegisterAddress(const QString& dev, const QString& reg, soc_addr_t& addr);
370 /* NOTE: does not commit writes to the backend 304 /* NOTE: does not commit writes to the backend
371 * if ignore_errors is true, the dump will continue even on errors, and the 305 * if ignore_errors is true, the dump will continue even on errors, and the
372 * function will return false if one or more errors occured */ 306 * function will return false if one or more errors occured */
373 bool DumpAllRegisters(IoBackend *backend, bool ignore_errors = true); 307 bool DumpAllRegisters(IoBackend *backend, bool ignore_errors = true);
374 bool DumpAllRegisters(const QString& filename, bool ignore_errors = true); 308 bool DumpAllRegisters(const QString& filename, bool ignore_errors = true);
375 309
310protected:
311 bool DumpAllRegisters(BackendHelper *bh, const soc_desc::node_inst_t& inst,
312 bool ignore_errors);
313
376private: 314private:
377 IoBackend *m_io_backend; 315 IoBackend *m_io_backend;
378 const SocRef& m_soc; 316 const soc_desc::soc_ref_t& m_soc;
379}; 317};
380 318
381#endif /* __BACKEND_H__ */ 319#endif /* __BACKEND_H__ */
diff --git a/utils/regtools/qeditor/main.cpp b/utils/regtools/qeditor/main.cpp
index d62047e2bb..86a8b96763 100644
--- a/utils/regtools/qeditor/main.cpp
+++ b/utils/regtools/qeditor/main.cpp
@@ -20,12 +20,22 @@
20 ****************************************************************************/ 20 ****************************************************************************/
21#include <QApplication> 21#include <QApplication>
22#include <QDir> 22#include <QDir>
23#include <QTextCodec>
23#include "mainwindow.h" 24#include "mainwindow.h"
24 25
25int main(int argc, char *argv[]) 26int main(int argc, char *argv[])
26{ 27{
27 QApplication app(argc, argv); 28 QApplication app(argc, argv);
28 app.setApplicationVersion(APP_VERSION); 29 app.setApplicationVersion(APP_VERSION);
30#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
31 /** NOTE: Qt4 only
32 * use the locale codec as the C-string codec, otherwise QString::toStdString()
33 * performs as toLatin1() which breaks conversion on virtually all systems.
34 * FIXME The documentation mentions that the C-string codec should produce ASCII
35 * compatible (ie 7-bit) encodings but nowadays most system are using UTF-8
36 * so I don't see why this is a problem */
37 QTextCodec::setCodecForCStrings(QTextCodec::codecForLocale());
38#endif
29 39
30 Backend backend;; 40 Backend backend;;
31 QDir dir(QCoreApplication::applicationDirPath()); 41 QDir dir(QCoreApplication::applicationDirPath());
@@ -47,4 +57,4 @@ int main(int argc, char *argv[])
47 MainWindow win(&backend); 57 MainWindow win(&backend);
48 win.show(); 58 win.show();
49 return app.exec(); 59 return app.exec();
50} 60}
diff --git a/utils/regtools/qeditor/mainwindow.cpp b/utils/regtools/qeditor/mainwindow.cpp
index b44306d701..8b83be6bae 100644
--- a/utils/regtools/qeditor/mainwindow.cpp
+++ b/utils/regtools/qeditor/mainwindow.cpp
@@ -43,7 +43,7 @@ void DocumentTab::OnModified(bool modified)
43 m_tab->SetTabModified(this, modified); 43 m_tab->SetTabModified(this, modified);
44} 44}
45 45
46void DocumentTab::SetTabWidget(MyTabWidget *tab) 46void DocumentTab::SetTabWidget(DocumentTabWidget *tab)
47{ 47{
48 m_tab = tab; 48 m_tab = tab;
49 SetTabName(m_tabname); 49 SetTabName(m_tabname);
@@ -57,17 +57,17 @@ void DocumentTab::SetTabName(const QString& name)
57} 57}
58 58
59/** 59/**
60 * MyTabWidget 60 * DocumentTabWidget
61 */ 61 */
62 62
63MyTabWidget::MyTabWidget() 63DocumentTabWidget::DocumentTabWidget()
64{ 64{
65 setMovable(true); 65 setMovable(true);
66 setTabsClosable(true); 66 setTabsClosable(true);
67 connect(this, SIGNAL(tabCloseRequested(int)), this, SLOT(OnCloseTab(int))); 67 connect(this, SIGNAL(tabCloseRequested(int)), this, SLOT(OnCloseTab(int)));
68} 68}
69 69
70void MyTabWidget::SetTabModified(DocumentTab *doc, bool modified) 70void DocumentTabWidget::SetTabModified(DocumentTab *doc, bool modified)
71{ 71{
72 int index = indexOf(doc->GetWidget()); 72 int index = indexOf(doc->GetWidget());
73 if(modified) 73 if(modified)
@@ -76,12 +76,12 @@ void MyTabWidget::SetTabModified(DocumentTab *doc, bool modified)
76 setTabIcon(index, QIcon()); 76 setTabIcon(index, QIcon());
77} 77}
78 78
79void MyTabWidget::SetTabName(DocumentTab *doc, const QString& name) 79void DocumentTabWidget::SetTabName(DocumentTab *doc, const QString& name)
80{ 80{
81 setTabText(indexOf(doc->GetWidget()), name); 81 setTabText(indexOf(doc->GetWidget()), name);
82} 82}
83 83
84bool MyTabWidget::CloseTab(int index) 84bool DocumentTabWidget::CloseTab(int index)
85{ 85{
86 QWidget *w = this->widget(index); 86 QWidget *w = this->widget(index);
87 DocumentTab *doc = dynamic_cast< DocumentTab* >(w); 87 DocumentTab *doc = dynamic_cast< DocumentTab* >(w);
@@ -95,7 +95,7 @@ bool MyTabWidget::CloseTab(int index)
95 return false; 95 return false;
96} 96}
97 97
98void MyTabWidget::OnCloseTab(int index) 98void DocumentTabWidget::OnCloseTab(int index)
99{ 99{
100 CloseTab(index); 100 CloseTab(index);
101} 101}
@@ -135,7 +135,9 @@ MainWindow::MainWindow(Backend *backend)
135 about_menu->addAction(about_act); 135 about_menu->addAction(about_act);
136 about_menu->addAction(about_qt_act); 136 about_menu->addAction(about_qt_act);
137 137
138 m_tab = new MyTabWidget(); 138 m_tab = new DocumentTabWidget();
139 m_tab->setTabOpenable(true);
140 m_tab->setTabOpenMenu(new_submenu);
139 141
140 setCentralWidget(m_tab); 142 setCentralWidget(m_tab);
141 143
@@ -161,8 +163,8 @@ void MainWindow::OnQuit()
161 163
162void MainWindow::OnAbout() 164void MainWindow::OnAbout()
163{ 165{
164 QString soc_desc_ver = QString("%1.%2.%3").arg(MAJOR_VERSION) 166 QString soc_desc_ver = QString("%1.%2.%3").arg(soc_desc::MAJOR_VERSION)
165 .arg(MINOR_VERSION).arg(REVISION_VERSION); 167 .arg(soc_desc::MINOR_VERSION).arg(soc_desc::REVISION_VERSION);
166 QMessageBox::about(this, "About", 168 QMessageBox::about(this, "About",
167 "<h1>QEditor</h1>" 169 "<h1>QEditor</h1>"
168 "<h2>Version "APP_VERSION"</h2>" 170 "<h2>Version "APP_VERSION"</h2>"
@@ -193,7 +195,10 @@ void MainWindow::closeEvent(QCloseEvent *event)
193void MainWindow::OnLoadDesc() 195void MainWindow::OnLoadDesc()
194{ 196{
195 QFileDialog *fd = new QFileDialog(this); 197 QFileDialog *fd = new QFileDialog(this);
196 fd->setFilter("XML files (*.xml);;All files (*)"); 198 QStringList filters;
199 filters << "XML files (*.xml)";
200 filters << "All files (*)";
201 fd->setNameFilters(filters);
197 fd->setFileMode(QFileDialog::ExistingFiles); 202 fd->setFileMode(QFileDialog::ExistingFiles);
198 fd->setDirectory(Settings::Get()->value("loaddescdir", QDir::currentPath()).toString()); 203 fd->setDirectory(Settings::Get()->value("loaddescdir", QDir::currentPath()).toString());
199 if(fd->exec()) 204 if(fd->exec())
diff --git a/utils/regtools/qeditor/mainwindow.h b/utils/regtools/qeditor/mainwindow.h
index c5da66758e..5d0bf4ed06 100644
--- a/utils/regtools/qeditor/mainwindow.h
+++ b/utils/regtools/qeditor/mainwindow.h
@@ -26,8 +26,9 @@
26#include <QSettings> 26#include <QSettings>
27#include "backend.h" 27#include "backend.h"
28#include "settings.h" 28#include "settings.h"
29#include "utils.h"
29 30
30class MyTabWidget; 31class DocumentTabWidget;
31 32
32class DocumentTab 33class DocumentTab
33{ 34{
@@ -35,20 +36,20 @@ public:
35 DocumentTab() { m_tab = 0; } 36 DocumentTab() { m_tab = 0; }
36 virtual bool Quit() = 0; 37 virtual bool Quit() = 0;
37 virtual QWidget *GetWidget() = 0; 38 virtual QWidget *GetWidget() = 0;
38 void SetTabWidget(MyTabWidget *tab); 39 void SetTabWidget(DocumentTabWidget *tab);
39 40
40protected: 41protected:
41 void OnModified(bool modified); 42 void OnModified(bool modified);
42 void SetTabName(const QString& name); 43 void SetTabName(const QString& name);
43 MyTabWidget *m_tab; 44 DocumentTabWidget *m_tab;
44 QString m_tabname; 45 QString m_tabname;
45}; 46};
46 47
47class MyTabWidget : public QTabWidget 48class DocumentTabWidget : public YTabWidget
48{ 49{
49 Q_OBJECT 50 Q_OBJECT
50public: 51public:
51 MyTabWidget(); 52 DocumentTabWidget();
52 bool CloseTab(int index); 53 bool CloseTab(int index);
53 void SetTabModified(DocumentTab *tab, bool mod); 54 void SetTabModified(DocumentTab *tab, bool mod);
54 void SetTabName(DocumentTab *tab, const QString& name); 55 void SetTabName(DocumentTab *tab, const QString& name);
@@ -83,7 +84,7 @@ private slots:
83 void OnNewRegEdit(); 84 void OnNewRegEdit();
84 85
85private: 86private:
86 MyTabWidget *m_tab; 87 DocumentTabWidget *m_tab;
87 Backend *m_backend; 88 Backend *m_backend;
88}; 89};
89 90
diff --git a/utils/regtools/qeditor/qeditor.pro b/utils/regtools/qeditor/qeditor.pro
index 265cc93171..0ec7c3dde1 100644
--- a/utils/regtools/qeditor/qeditor.pro
+++ b/utils/regtools/qeditor/qeditor.pro
@@ -12,7 +12,7 @@ libsocdesc.commands = cd ../lib && make
12QMAKE_EXTRA_TARGETS += libsocdesc 12QMAKE_EXTRA_TARGETS += libsocdesc
13PRE_TARGETDEPS += libsocdesc 13PRE_TARGETDEPS += libsocdesc
14 14
15VERSION = 2.1.0 15VERSION = 3.0.0
16 16
17DEFINES += APP_VERSION=\\\"$$VERSION\\\" 17DEFINES += APP_VERSION=\\\"$$VERSION\\\"
18 18
diff --git a/utils/regtools/qeditor/regdisplaypanel.cpp b/utils/regtools/qeditor/regdisplaypanel.cpp
index 167c776cce..a72d280d6c 100644
--- a/utils/regtools/qeditor/regdisplaypanel.cpp
+++ b/utils/regtools/qeditor/regdisplaypanel.cpp
@@ -21,36 +21,26 @@
21#include "regdisplaypanel.h" 21#include "regdisplaypanel.h"
22#include <QHeaderView> 22#include <QHeaderView>
23#include <QDebug> 23#include <QDebug>
24 24#include <QStandardItemModel>
25/**
26 * RegItemEditorCreator
27 */
28
29QWidget *RegItemEditorCreator::createWidget(QWidget * parent) const
30{
31 return new RegLineEdit(parent);
32}
33
34QByteArray RegItemEditorCreator::valuePropertyName () const
35{
36 return QByteArray("text");
37}
38 25
39/** 26/**
40 * SocDisplayPanel 27 * SocDisplayPanel
41 */ 28 */
42SocDisplayPanel::SocDisplayPanel(QWidget *parent, const SocRef& dev_ref) 29SocDisplayPanel::SocDisplayPanel(QWidget *parent, IoBackend *io_backend,
43 :QGroupBox(parent), m_soc(dev_ref) 30 const soc_desc::soc_ref_t& ref)
31 :QGroupBox(parent), m_soc(ref)
44{ 32{
33 Q_UNUSED(io_backend)
45 QVBoxLayout *right_layout = new QVBoxLayout; 34 QVBoxLayout *right_layout = new QVBoxLayout;
46 35
47 m_name = new QLabel(this); 36 m_name = new QLabel(this);
48 m_name->setTextFormat(Qt::RichText); 37 m_name->setTextFormat(Qt::RichText);
49 m_name->setText("<h1>" + QString::fromStdString(m_soc.GetSoc().name) + "</h1>"); 38 m_name->setText("<h1>" + QString::fromStdString(m_soc.get()->name) + "</h1>");
50 39
51 m_desc = new QLabel(this); 40 m_desc = new QLabel(this);
52 m_name->setTextFormat(Qt::RichText); 41 m_name->setTextFormat(Qt::RichText);
53 m_desc->setText(QString::fromStdString(m_soc.GetSoc().desc)); 42 m_desc->setText(QString::fromStdString(m_soc.get()->desc));
43 m_desc->setVisible(m_desc->text().size() != 0);
54 44
55 right_layout->addWidget(m_name, 0); 45 right_layout->addWidget(m_name, 0);
56 right_layout->addWidget(m_desc, 0); 46 right_layout->addWidget(m_desc, 0);
@@ -71,24 +61,21 @@ QWidget *SocDisplayPanel::GetWidget()
71} 61}
72 62
73/** 63/**
74 * DevDisplayPanel 64 * NodeDisplayPanel
75 */ 65 */
76DevDisplayPanel::DevDisplayPanel(QWidget *parent, const SocDevRef& dev_ref) 66NodeDisplayPanel::NodeDisplayPanel(QWidget *parent, IoBackend *io_backend,
77 :QGroupBox(parent), m_dev(dev_ref), m_reg_font(font()) 67 const soc_desc::node_inst_t& ref)
68 :QGroupBox(parent), m_node(ref)
78{ 69{
70 BackendHelper helper(io_backend, ref.soc());
79 QVBoxLayout *right_layout = new QVBoxLayout; 71 QVBoxLayout *right_layout = new QVBoxLayout;
80 const soc_dev_addr_t& dev_addr = m_dev.GetDevAddr();
81
82 m_reg_font.setWeight(100);
83 m_reg_font.setKerning(false);
84 72
85 QString dev_name; 73 QString dev_name = helper.GetPath(ref);
86 dev_name.sprintf("HW_%s_BASE", dev_addr.name.c_str());
87 74
88 QLabel *label_names = new QLabel("<b>" + dev_name + "</b>"); 75 QLabel *label_names = new QLabel("<b>" + dev_name + "</b>");
89 label_names->setTextFormat(Qt::RichText); 76 label_names->setTextFormat(Qt::RichText);
90 77
91 QLabel *label_addr = new QLabel("<b>" + QString().sprintf("0x%03x", dev_addr.addr) + "</b>"); 78 QLabel *label_addr = new QLabel("<b>" + QString().sprintf("0x%03x", ref.addr()) + "</b>");
92 label_addr->setTextFormat(Qt::RichText); 79 label_addr->setTextFormat(Qt::RichText);
93 80
94 QHBoxLayout *top_layout = new QHBoxLayout; 81 QHBoxLayout *top_layout = new QHBoxLayout;
@@ -99,27 +86,38 @@ DevDisplayPanel::DevDisplayPanel(QWidget *parent, const SocDevRef& dev_ref)
99 86
100 m_name = new QLabel(this); 87 m_name = new QLabel(this);
101 m_name->setTextFormat(Qt::RichText); 88 m_name->setTextFormat(Qt::RichText);
102 m_name->setText("<h1>" + QString::fromStdString(m_dev.GetDev().long_name) + "</h1>"); 89 /* if instance has a title, it overrides node title.*/
103 90 std::string title = ref.get()->title;
104 m_desc = new QLabel(this); 91 if(title.empty())
105 m_name->setTextFormat(Qt::RichText); 92 title = ref.node().get()->title;
106 m_desc->setText(QString::fromStdString(m_dev.GetDev().desc)); 93 m_name->setText("<h1>" + QString::fromStdString(title) + "</h1>");
94
95 /* put description from the node and from the instance */
96 m_node_desc = new QLabel(this);
97 m_node_desc->setTextFormat(Qt::RichText);
98 m_node_desc->setText(QString::fromStdString(ref.node().get()->desc));
99 m_node_desc->setVisible(m_node_desc->text().size() != 0);
100 m_inst_desc = new QLabel(this);
101 m_inst_desc->setTextFormat(Qt::RichText);
102 m_inst_desc->setText(QString::fromStdString(ref.get()->desc));
103 m_inst_desc->setVisible(m_inst_desc->text().size() != 0);
107 104
108 right_layout->addWidget(m_name, 0); 105 right_layout->addWidget(m_name, 0);
109 right_layout->addLayout(top_layout, 0); 106 right_layout->addLayout(top_layout, 0);
110 right_layout->addWidget(m_desc, 0); 107 right_layout->addWidget(m_node_desc, 0);
108 right_layout->addWidget(m_inst_desc, 0);
111 right_layout->addStretch(1); 109 right_layout->addStretch(1);
112 110
113 setTitle("Device Description"); 111 setTitle("Device Description");
114 setLayout(right_layout); 112 setLayout(right_layout);
115} 113}
116 114
117void DevDisplayPanel::AllowWrite(bool en) 115void NodeDisplayPanel::AllowWrite(bool en)
118{ 116{
119 Q_UNUSED(en); 117 Q_UNUSED(en);
120} 118}
121 119
122QWidget *DevDisplayPanel::GetWidget() 120QWidget *NodeDisplayPanel::GetWidget()
123{ 121{
124 return this; 122 return this;
125} 123}
@@ -128,34 +126,29 @@ QWidget *DevDisplayPanel::GetWidget()
128 * RegDisplayPanel 126 * RegDisplayPanel
129 */ 127 */
130 128
131RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const SocRegRef& reg_ref) 129RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend,
132 :QGroupBox(parent), m_io_backend(io_backend), m_reg(reg_ref), m_reg_font(font()) 130 const soc_desc::node_inst_t& ref)
131 :QGroupBox(parent), m_io_backend(io_backend), m_node(ref), m_reg_font(font())
133{ 132{
134 bool read_only = m_io_backend->IsReadOnly(); 133 bool read_only = m_io_backend->IsReadOnly();
134 BackendHelper helper(m_io_backend, ref.soc());
135 135
136 QVBoxLayout *right_layout = new QVBoxLayout; 136 QVBoxLayout *right_layout = new QVBoxLayout;
137 137
138 const soc_dev_addr_t& dev_addr = m_reg.GetDevAddr();
139 const soc_reg_t& reg = m_reg.GetReg();
140 const soc_reg_addr_t& reg_addr = m_reg.GetRegAddr();
141
142 m_reg_font.setWeight(100); 138 m_reg_font.setWeight(100);
143 m_reg_font.setKerning(false); 139 m_reg_font.setKerning(false);
144 140
145 QString reg_name; 141 QString reg_name = helper.GetPath(ref);
146 reg_name.sprintf("HW_%s_%s", dev_addr.name.c_str(), reg_addr.name.c_str());
147 QStringList names; 142 QStringList names;
148 QVector< soc_addr_t > addresses; 143 QVector< soc_addr_t > addresses;
149 names.append(reg_name); 144 names.append(reg_name);
150 addresses.append(reg_addr.addr); 145 addresses.append(ref.addr());
151 if(reg.flags & REG_HAS_SCT) 146
147 std::vector< soc_desc::variant_ref_t > variants = ref.node().reg().variants();
148 for(size_t i = 0; i < variants.size(); i++)
152 { 149 {
153 names.append(reg_name + "_SET"); 150 names.append(reg_name + "/" + QString::fromStdString(variants[i].get()->type));
154 names.append(reg_name + "_CLR"); 151 addresses.append(ref.addr() + variants[i].get()->offset);
155 names.append(reg_name + "_TOG");
156 addresses.append(reg_addr.addr + 4);
157 addresses.append(reg_addr.addr + 8);
158 addresses.append(reg_addr.addr + 12);
159 } 152 }
160 153
161 QString str; 154 QString str;
@@ -188,7 +181,7 @@ RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const S
188 m_raw_val_edit->SetReadOnly(read_only); 181 m_raw_val_edit->SetReadOnly(read_only);
189 m_raw_val_edit->GetLineEdit()->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); 182 m_raw_val_edit->GetLineEdit()->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter);
190 m_raw_val_edit->GetLineEdit()->setValidator(new SocFieldValidator(m_raw_val_edit)); 183 m_raw_val_edit->GetLineEdit()->setValidator(new SocFieldValidator(m_raw_val_edit));
191 m_raw_val_edit->EnableSCT(!!(reg.flags & REG_HAS_SCT)); 184 //m_raw_val_edit->EnableSCT(!!(reg.flags & REG_HAS_SCT));
192 m_raw_val_edit->GetLineEdit()->setFont(m_reg_font); 185 m_raw_val_edit->GetLineEdit()->setFont(m_reg_font);
193 QHBoxLayout *raw_val_layout = new QHBoxLayout; 186 QHBoxLayout *raw_val_layout = new QHBoxLayout;
194 raw_val_layout->addStretch(); 187 raw_val_layout->addStretch();
@@ -198,9 +191,13 @@ RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const S
198 191
199 m_value_table = new GrowingTableView(); 192 m_value_table = new GrowingTableView();
200 m_value_model = new RegFieldTableModel(m_value_table); // view takes ownership 193 m_value_model = new RegFieldTableModel(m_value_table); // view takes ownership
201 m_value_model->SetRegister(m_reg.GetReg()); 194 m_value_model->SetRegister(*m_node.node().reg().get());
202 m_value_model->SetReadOnly(read_only); 195 m_value_model->SetReadOnly(read_only);
203 m_value_table->setModel(m_value_model); 196 RegFieldProxyModel *proxy_model = new RegFieldProxyModel(this);
197 proxy_model->setSourceModel(m_value_model);
198 m_value_table->setModel(proxy_model);
199 m_value_table->setSortingEnabled(true);
200 m_value_table->sortByColumn(0, Qt::DescendingOrder);
204 m_value_table->verticalHeader()->setVisible(false); 201 m_value_table->verticalHeader()->setVisible(false);
205 m_value_table->resizeColumnsToContents(); 202 m_value_table->resizeColumnsToContents();
206 m_value_table->horizontalHeader()->setStretchLastSection(true); 203 m_value_table->horizontalHeader()->setStretchLastSection(true);
@@ -217,17 +214,36 @@ RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const S
217 m_table_delegate->setItemEditorFactory(m_table_edit_factory); 214 m_table_delegate->setItemEditorFactory(m_table_edit_factory);
218 m_value_table->setItemDelegate(m_table_delegate); 215 m_value_table->setItemDelegate(m_table_delegate);
219 216
220 m_sexy_display2 = new Unscroll<RegSexyDisplay2>(this); 217 m_sexy_display2 = new Unscroll<YRegDisplay>(this);
221 m_sexy_display2->setFont(m_reg_font); 218 m_sexy_display2->setFont(m_reg_font);
222 m_sexy_display2->setModel(m_value_model); 219 m_sexy_display2->setModel(m_value_model);
220 m_sexy_display2->setWidth(m_node.node().reg().get()->width);
223 m_sexy_display2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 221 m_sexy_display2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
224 222
223 m_name = new QLabel(this);
224 m_name->setTextFormat(Qt::RichText);
225 m_name->setText("<h1>" + QString::fromStdString(ref.node().get()->title) + "</h1>");
226
227 /* put description from the node, from the instance and register */
228 m_node_desc = new QLabel(this);
229 m_node_desc->setTextFormat(Qt::RichText);
230 m_node_desc->setText(QString::fromStdString(ref.node().get()->desc));
231 m_node_desc->setVisible(m_node_desc->text().size() != 0);
232 m_inst_desc = new QLabel(this);
233 m_inst_desc->setTextFormat(Qt::RichText);
234 m_inst_desc->setText(QString::fromStdString(ref.get()->desc));
235 m_inst_desc->setVisible(m_inst_desc->text().size() != 0);
225 m_desc = new QLabel(this); 236 m_desc = new QLabel(this);
226 m_desc->setTextFormat(Qt::RichText); 237 m_desc->setTextFormat(Qt::RichText);
227 m_desc->setText(QString::fromStdString(m_reg.GetReg().desc)); 238 m_desc->setText(QString::fromStdString(m_node.node().reg().get()->desc));
239 m_desc->setVisible(m_desc->text().size() != 0);
228 240
241 right_layout->addWidget(m_name);
229 right_layout->addWidget(m_desc); 242 right_layout->addWidget(m_desc);
230 right_layout->addLayout(top_layout); 243 right_layout->addLayout(top_layout);
244 right_layout->addWidget(m_node_desc);
245 right_layout->addWidget(m_inst_desc);
246 right_layout->addWidget(m_desc);
231 if(raw_val_layout) 247 if(raw_val_layout)
232 right_layout->addLayout(raw_val_layout); 248 right_layout->addLayout(raw_val_layout);
233 right_layout->addWidget(m_sexy_display2); 249 right_layout->addWidget(m_sexy_display2);
@@ -252,8 +268,10 @@ RegDisplayPanel::RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const S
252 268
253 connect(m_raw_val_edit->GetLineEdit(), SIGNAL(returnPressed()), this, 269 connect(m_raw_val_edit->GetLineEdit(), SIGNAL(returnPressed()), this,
254 SLOT(OnRawRegValueReturnPressed())); 270 SLOT(OnRawRegValueReturnPressed()));
255 connect(m_value_table->model(), SIGNAL(OnValueModified(int)), this, 271 connect(m_value_model, SIGNAL(OnValueModified(int)), this,
256 SLOT(OnRegValueChanged(int))); 272 SLOT(OnRegValueChanged(int)));
273 connect(m_sexy_display2, SIGNAL(clicked(const QModelIndex&)), this,
274 SLOT(OnRegFieldActivated(const QModelIndex&)));
257} 275}
258 276
259RegDisplayPanel::~RegDisplayPanel() 277RegDisplayPanel::~RegDisplayPanel()
@@ -263,12 +281,9 @@ RegDisplayPanel::~RegDisplayPanel()
263 281
264void RegDisplayPanel::Reload() 282void RegDisplayPanel::Reload()
265{ 283{
266 const soc_dev_addr_t& dev_addr = m_reg.GetDevAddr();
267 const soc_reg_t& reg = m_reg.GetReg();
268 const soc_reg_addr_t& reg_addr = m_reg.GetRegAddr();
269 soc_word_t value; 284 soc_word_t value;
270 BackendHelper helper(m_io_backend, m_reg); 285 BackendHelper helper(m_io_backend, m_node.soc());
271 bool has_value = helper.ReadRegister(dev_addr.name.c_str(), reg_addr.name.c_str(), value); 286 bool has_value = helper.ReadRegister(m_node, value);
272 287
273 if(has_value) 288 if(has_value)
274 { 289 {
@@ -296,7 +311,6 @@ void RegDisplayPanel::AllowWrite(bool en)
296 m_raw_val_edit->SetReadOnly(m_io_backend->IsReadOnly() || !m_allow_write); 311 m_raw_val_edit->SetReadOnly(m_io_backend->IsReadOnly() || !m_allow_write);
297 m_value_model->SetReadOnly(m_io_backend->IsReadOnly() || !m_allow_write); 312 m_value_model->SetReadOnly(m_io_backend->IsReadOnly() || !m_allow_write);
298 } 313 }
299 Reload();
300} 314}
301 315
302IoBackend::WriteMode RegDisplayPanel::EditModeToWriteMode(RegLineEdit::EditMode mode) 316IoBackend::WriteMode RegDisplayPanel::EditModeToWriteMode(RegLineEdit::EditMode mode)
@@ -320,9 +334,8 @@ void RegDisplayPanel::OnRawRegValueReturnPressed()
320 if(state != QValidator::Acceptable) 334 if(state != QValidator::Acceptable)
321 return; 335 return;
322 IoBackend::WriteMode mode = EditModeToWriteMode(m_raw_val_edit->GetMode()); 336 IoBackend::WriteMode mode = EditModeToWriteMode(m_raw_val_edit->GetMode());
323 BackendHelper helper(m_io_backend, m_reg); 337 BackendHelper helper(m_io_backend, m_node.soc());
324 helper.WriteRegister(m_reg.GetDevAddr().name.c_str(), m_reg.GetRegAddr().name.c_str(), 338 helper.WriteRegister(m_node, val, mode);
325 val, mode);
326 // register write can change all fields 339 // register write can change all fields
327 Reload(); 340 Reload();
328} 341}
@@ -332,13 +345,17 @@ void RegDisplayPanel::OnRegValueChanged(int index)
332 QVariant var = m_value_model->GetValue(index); 345 QVariant var = m_value_model->GetValue(index);
333 if(!var.isValid()) 346 if(!var.isValid())
334 return; 347 return;
335 BackendHelper helper(m_io_backend, m_reg); 348 BackendHelper helper(m_io_backend, m_node.soc());
336 helper.WriteRegister(m_reg.GetDevAddr().name.c_str(), m_reg.GetRegAddr().name.c_str(), 349 helper.WriteRegister(m_node, var.value< soc_word_t >(), IoBackend::Write);
337 var.value< soc_word_t >(), IoBackend::Write);
338 // register write can change all fields 350 // register write can change all fields
339 Reload(); 351 Reload();
340} 352}
341 353
354void RegDisplayPanel::OnRegFieldActivated(const QModelIndex& index)
355{
356 Q_UNUSED(index);
357}
358
342QWidget *RegDisplayPanel::GetWidget() 359QWidget *RegDisplayPanel::GetWidget()
343{ 360{
344 return this; 361 return this;
diff --git a/utils/regtools/qeditor/regdisplaypanel.h b/utils/regtools/qeditor/regdisplaypanel.h
index 9a692778fe..a34b9319d5 100644
--- a/utils/regtools/qeditor/regdisplaypanel.h
+++ b/utils/regtools/qeditor/regdisplaypanel.h
@@ -35,19 +35,12 @@
35#include "utils.h" 35#include "utils.h"
36#include "regtab.h" 36#include "regtab.h"
37 37
38class RegItemEditorCreator : public QItemEditorCreatorBase
39{
40public:
41 RegItemEditorCreator() {}
42 virtual QWidget *createWidget(QWidget * parent) const;
43 virtual QByteArray valuePropertyName () const;
44};
45
46class SocDisplayPanel : public QGroupBox, public RegTabPanel 38class SocDisplayPanel : public QGroupBox, public RegTabPanel
47{ 39{
48 Q_OBJECT 40 Q_OBJECT
49public: 41public:
50 SocDisplayPanel(QWidget *parent, const SocRef& reg); 42 SocDisplayPanel(QWidget *parent, IoBackend *io_backend,
43 const soc_desc::soc_ref_t& reg);
51 void Reload(); 44 void Reload();
52 void AllowWrite(bool en); 45 void AllowWrite(bool en);
53 QWidget *GetWidget(); 46 QWidget *GetWidget();
@@ -55,16 +48,17 @@ public:
55 48
56protected: 49protected:
57 50
58 const SocRef& m_soc; 51 soc_desc::soc_ref_t m_soc;
59 QLabel *m_name; 52 QLabel *m_name;
60 QLabel *m_desc; 53 QLabel *m_desc;
61}; 54};
62 55
63class DevDisplayPanel : public QGroupBox, public RegTabPanel 56class NodeDisplayPanel : public QGroupBox, public RegTabPanel
64{ 57{
65 Q_OBJECT 58 Q_OBJECT
66public: 59public:
67 DevDisplayPanel(QWidget *parent, const SocDevRef& reg); 60 NodeDisplayPanel(QWidget *parent, IoBackend *io_backend,
61 const soc_desc::node_inst_t& reg);
68 void Reload(); 62 void Reload();
69 void AllowWrite(bool en); 63 void AllowWrite(bool en);
70 QWidget *GetWidget(); 64 QWidget *GetWidget();
@@ -72,17 +66,18 @@ public:
72 66
73protected: 67protected:
74 68
75 const SocDevRef& m_dev; 69 soc_desc::node_inst_t m_node;
76 QFont m_reg_font;
77 QLabel *m_name; 70 QLabel *m_name;
78 QLabel *m_desc; 71 QLabel *m_node_desc;
72 QLabel *m_inst_desc;
79}; 73};
80 74
81class RegDisplayPanel : public QGroupBox, public RegTabPanel 75class RegDisplayPanel : public QGroupBox, public RegTabPanel
82{ 76{
83 Q_OBJECT 77 Q_OBJECT
84public: 78public:
85 RegDisplayPanel(QWidget *parent, IoBackend *io_backend, const SocRegRef& reg); 79 RegDisplayPanel(QWidget *parent, IoBackend *io_backend,
80 const soc_desc::node_inst_t& reg);
86 ~RegDisplayPanel(); 81 ~RegDisplayPanel();
87 void AllowWrite(bool en); 82 void AllowWrite(bool en);
88 void Reload(); 83 void Reload();
@@ -102,17 +97,19 @@ protected:
102 }; 97 };
103 98
104 IoBackend *m_io_backend; 99 IoBackend *m_io_backend;
105 const SocRegRef& m_reg; 100 soc_desc::node_inst_t m_node;
106 bool m_allow_write; 101 bool m_allow_write;
107 RegLineEdit *m_raw_val_edit; 102 RegLineEdit *m_raw_val_edit;
108 Unscroll< RegSexyDisplay2 > *m_sexy_display2; 103 Unscroll< YRegDisplay > *m_sexy_display2;
109 GrowingTableView *m_value_table; 104 GrowingTableView *m_value_table;
110 RegFieldTableModel *m_value_model; 105 RegFieldTableModel *m_value_model;
111 QStyledItemDelegate *m_table_delegate; 106 QStyledItemDelegate *m_table_delegate;
112 QItemEditorFactory *m_table_edit_factory; 107 QItemEditorFactory *m_table_edit_factory;
113 RegItemEditorCreator *m_regedit_creator;
114 QLabel *m_raw_val_name; 108 QLabel *m_raw_val_name;
115 QFont m_reg_font; 109 QFont m_reg_font;
110 QLabel *m_name;
111 QLabel *m_node_desc;
112 QLabel *m_inst_desc;
116 QLabel *m_desc; 113 QLabel *m_desc;
117 QWidget *m_viewport; 114 QWidget *m_viewport;
118 QScrollArea *m_scroll; 115 QScrollArea *m_scroll;
@@ -120,6 +117,7 @@ protected:
120private slots: 117private slots:
121 void OnRawRegValueReturnPressed(); 118 void OnRawRegValueReturnPressed();
122 void OnRegValueChanged(int index); 119 void OnRegValueChanged(int index);
120 void OnRegFieldActivated(const QModelIndex& index);
123}; 121};
124 122
125#endif /* REGDISPLAYPANEL_H */ 123#endif /* REGDISPLAYPANEL_H */
diff --git a/utils/regtools/qeditor/regedit.cpp b/utils/regtools/qeditor/regedit.cpp
index 8b4bfb7c49..826452fdbd 100644
--- a/utils/regtools/qeditor/regedit.cpp
+++ b/utils/regtools/qeditor/regedit.cpp
@@ -24,6 +24,7 @@
24#include <QHeaderView> 24#include <QHeaderView>
25#include <QMessageBox> 25#include <QMessageBox>
26#include <QInputDialog> 26#include <QInputDialog>
27#include <QStandardItemModel>
27 28
28/** 29/**
29 * EmptyEditPanel 30 * EmptyEditPanel
@@ -36,863 +37,1300 @@ EmptyEditPanel::EmptyEditPanel(QWidget *parent)
36/** 37/**
37 * SocEditPanel 38 * SocEditPanel
38 */ 39 */
39SocEditPanel::SocEditPanel(SocRef ref, QWidget *parent) 40
41namespace
42{
43
44template< typename T >
45void my_remove_at(std::vector< T >& v, size_t at)
46{
47 v.erase(v.begin() + at);
48}
49
50enum
51{
52 SocEditPanelDelType = QTableWidgetItem::UserType,
53 SocEditPanelAddType,
54};
55
56}
57
58SocEditPanel::SocEditPanel(const soc_desc::soc_ref_t& ref, QWidget *parent)
40 :QWidget(parent), m_ref(ref) 59 :QWidget(parent), m_ref(ref)
41{ 60{
42 m_name_group = new QGroupBox("Name", this); 61 QLineEdit *name_edit = new QLineEdit(this);
43 m_name_edit = new QLineEdit(this); 62 QLineEdit *title_edit = new QLineEdit(this);
44 m_name_edit->setText(QString::fromStdString(ref.GetSoc().name)); 63 QLineEdit *isa_edit = new QLineEdit(this);
45 QVBoxLayout *name_group_layout = new QVBoxLayout; 64 QLineEdit *version_edit = new QLineEdit(this);
46 name_group_layout->addWidget(m_name_edit); 65
47 m_name_group->setLayout(name_group_layout); 66 m_authors_list = new QTableWidget(this);
67 QGroupBox *authors_group = Misc::EncloseInBox("Authors", m_authors_list);
48 68
49 m_desc_group = new QGroupBox("Description", this);
50 QHBoxLayout *group_layout = new QHBoxLayout;
51 m_desc_edit = new MyTextEditor(this); 69 m_desc_edit = new MyTextEditor(this);
52 m_desc_edit->SetTextHtml(QString::fromStdString(ref.GetSoc().desc)); 70
53 group_layout->addWidget(m_desc_edit); 71 QGroupBox *desc_group = Misc::EncloseInBox("Description", m_desc_edit);
54 m_desc_group->setLayout(group_layout); 72
73 QFormLayout *banner_left_layout = new QFormLayout;
74 banner_left_layout->addRow("Name:", name_edit);
75 banner_left_layout->addRow("Title:", title_edit);
76 banner_left_layout->addRow("Instruction Set:", isa_edit);
77 banner_left_layout->addRow("Version:", version_edit);
78
79 QGroupBox *banner_left_group = new QGroupBox("Information");
80 banner_left_group->setLayout(banner_left_layout);
81
82 QHBoxLayout *banner_layout = new QHBoxLayout;
83 banner_layout->addWidget(banner_left_group);
84 banner_layout->addWidget(authors_group);
85 banner_layout->addStretch(0);
55 86
56 QVBoxLayout *layout = new QVBoxLayout; 87 QVBoxLayout *layout = new QVBoxLayout;
57 layout->addWidget(m_name_group); 88 layout->addLayout(banner_layout);
58 layout->addWidget(m_desc_group); 89 layout->addWidget(desc_group);
59 layout->addStretch(1); 90 layout->addStretch(1);
60 91
61 connect(m_name_edit, SIGNAL(textChanged(const QString&)), this, SLOT(OnNameEdited(const QString&))); 92 /* fill data */
93 name_edit->setText(QString::fromStdString(ref.get()->name));
94 title_edit->setText(QString::fromStdString(ref.get()->title));
95 isa_edit->setText(QString::fromStdString(ref.get()->isa));
96 version_edit->setText(QString::fromStdString(ref.get()->version));
97 m_desc_edit->SetTextHtml(QString::fromStdString(ref.get()->desc));
98
99 m_authors_list->setColumnCount(2);
100 m_authors_list->setHorizontalHeaderItem(0, new QTableWidgetItem(""));
101 m_authors_list->setHorizontalHeaderItem(1, new QTableWidgetItem("Name"));
102 m_authors_list->horizontalHeader()->setVisible(false);
103 m_authors_list->verticalHeader()->setVisible(false);
104 m_authors_list->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
105 std::vector< std::string >& authors = ref.get()->author;
106 m_authors_list->setRowCount(authors.size() + 1);
107 for(size_t i = 0; i < authors.size(); i++)
108 {
109 QTableWidgetItem *item = new QTableWidgetItem(
110 QIcon::fromTheme("list-remove"), "", SocEditPanelDelType);
111 item->setFlags(Qt::ItemIsEnabled);
112 m_authors_list->setItem(i, 0, item);
113 item = new QTableWidgetItem(QString::fromStdString(authors[i]));
114 m_authors_list->setItem(i, 1, item);
115 }
116 QTableWidgetItem *new_item = new QTableWidgetItem(
117 QIcon::fromTheme("list-add"), "", SocEditPanelAddType);
118 new_item->setFlags(Qt::ItemIsEnabled);
119 m_authors_list->setItem(authors.size(), 0, new_item);
120 new_item = new QTableWidgetItem("New author...", QTableWidgetItem::UserType);
121 new_item->setFlags(Qt::ItemIsEnabled);
122 QFont font = new_item->font();
123 font.setItalic(true);
124 new_item->setFont(font);
125 m_authors_list->setItem(authors.size(), 1, new_item);
126 m_authors_list->resizeColumnsToContents();
127 m_authors_list->horizontalHeader()->setStretchLastSection(true);
128
129 connect(name_edit, SIGNAL(textChanged(const QString&)), this,
130 SLOT(OnNameEdited(const QString&)));
62 connect(m_desc_edit, SIGNAL(OnTextChanged()), this, SLOT(OnTextEdited())); 131 connect(m_desc_edit, SIGNAL(OnTextChanged()), this, SLOT(OnTextEdited()));
132 connect(title_edit, SIGNAL(textChanged(const QString&)), this,
133 SLOT(OnTitleEdited(const QString&)));
134 connect(version_edit, SIGNAL(textChanged(const QString&)), this,
135 SLOT(OnVersionEdited(const QString&)));
136 connect(isa_edit, SIGNAL(textChanged(const QString&)), this,
137 SLOT(OnIsaEdited(const QString&)));
138 connect(m_authors_list, SIGNAL(itemActivated(QTableWidgetItem *)), this,
139 SLOT(OnAuthorActivated(QTableWidgetItem *)));
140 connect(m_authors_list, SIGNAL(itemChanged(QTableWidgetItem *)), this,
141 SLOT(OnAuthorChanged(QTableWidgetItem *)));
63 142
64 setLayout(layout); 143 setLayout(layout);
65} 144}
66 145
67void SocEditPanel::OnNameEdited(const QString& text) 146void SocEditPanel::OnNameEdited(const QString& text)
68{ 147{
69 m_ref.GetSoc().name = text.toStdString(); 148 m_ref.get()->name = text.toStdString();
70 OnModified(m_name_edit->isModified()); 149 OnModified();
71} 150}
72 151
73void SocEditPanel::OnTextEdited() 152void SocEditPanel::OnTitleEdited(const QString& text)
74{ 153{
75 m_ref.GetSoc().desc = m_desc_edit->GetTextHtml().toStdString(); 154 m_ref.get()->title = text.toStdString();
76 OnModified(m_desc_edit->IsModified()); 155 OnModified();
77} 156}
78 157
79/** 158void SocEditPanel::OnVersionEdited(const QString& text)
80 * DevEditPanel
81 */
82DevEditPanel::DevEditPanel(SocDevRef ref, QWidget *parent)
83 :QWidget(parent), m_ref(ref)
84{ 159{
85 m_name_group = new QGroupBox("Name", this); 160 m_ref.get()->version = text.toStdString();
86 m_name_edit = new QLineEdit(this); 161 OnModified();
87 m_name_edit->setText(QString::fromStdString(ref.GetDev().name)); 162}
88 QVBoxLayout *name_group_layout = new QVBoxLayout;
89 name_group_layout->addWidget(m_name_edit);
90 m_name_group->setLayout(name_group_layout);
91
92 m_long_name_group = new QGroupBox("Long Name", this);
93 m_long_name_edit = new QLineEdit(this);
94 m_long_name_edit->setText(QString::fromStdString(ref.GetDev().long_name));
95 QVBoxLayout *long_name_group_layout = new QVBoxLayout;
96 long_name_group_layout->addWidget(m_long_name_edit);
97 m_long_name_group->setLayout(long_name_group_layout);
98
99 m_version_group = new QGroupBox("Version", this);
100 m_version_edit = new QLineEdit(this);
101 m_version_edit->setText(QString::fromStdString(ref.GetDev().version));
102 QVBoxLayout *version_group_layout = new QVBoxLayout;
103 version_group_layout->addWidget(m_version_edit);
104 m_version_group->setLayout(version_group_layout);
105
106 QVBoxLayout *name_ver_layout = new QVBoxLayout;
107 name_ver_layout->addWidget(m_name_group);
108 name_ver_layout->addWidget(m_long_name_group);
109 name_ver_layout->addWidget(m_version_group);
110 name_ver_layout->addStretch();
111
112 m_instances_table = new QTableWidget(this);
113 m_instances_table->setRowCount(ref.GetDev().addr.size() + 1);
114 m_instances_table->setColumnCount(3);
115 for(size_t row = 0; row < ref.GetDev().addr.size(); row++)
116 FillRow(row, ref.GetDev().addr[row]);
117 CreateNewRow(ref.GetDev().addr.size());
118 m_instances_table->setHorizontalHeaderItem(0, new QTableWidgetItem(""));
119 m_instances_table->setHorizontalHeaderItem(1, new QTableWidgetItem("Name"));
120 m_instances_table->setHorizontalHeaderItem(2, new QTableWidgetItem("Address"));
121 m_instances_table->verticalHeader()->setVisible(false);
122 m_instances_table->resizeColumnsToContents();
123 m_instances_table->horizontalHeader()->setStretchLastSection(true);
124 m_instances_table->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
125 m_instances_group = new QGroupBox("Instances", this);
126 QHBoxLayout *instances_group_layout = new QHBoxLayout;
127 instances_group_layout->addWidget(m_instances_table);
128 m_instances_group->setLayout(instances_group_layout);
129
130 QHBoxLayout *top_layout = new QHBoxLayout;
131 top_layout->addWidget(m_instances_group);
132 top_layout->addLayout(name_ver_layout);
133 top_layout->addStretch();
134
135 m_desc_group = new QGroupBox("Description", this);
136 QHBoxLayout *group_layout = new QHBoxLayout;
137 m_desc_edit = new MyTextEditor(this);
138 m_desc_edit->SetTextHtml(QString::fromStdString(ref.GetDev().desc));
139 group_layout->addWidget(m_desc_edit);
140 m_desc_group->setLayout(group_layout);
141
142 QVBoxLayout *layout = new QVBoxLayout;
143 layout->addLayout(top_layout, 0);
144 layout->addWidget(m_desc_group, 1);
145
146 setLayout(layout);
147 163
148 SocFieldItemDelegate *m_table_delegate = new SocFieldItemDelegate(this); 164void SocEditPanel::OnIsaEdited(const QString& text)
149 QItemEditorFactory *m_table_edit_factory = new QItemEditorFactory(); 165{
150 SocFieldEditorCreator *m_table_edit_creator = new SocFieldEditorCreator(); 166 m_ref.get()->isa = text.toStdString();
151 m_table_edit_factory->registerEditor(QVariant::UInt, m_table_edit_creator); 167 OnModified();
152 m_table_delegate->setItemEditorFactory(m_table_edit_factory);
153 m_instances_table->setItemDelegate(m_table_delegate);
154
155 connect(m_instances_table, SIGNAL(cellActivated(int,int)), this, SLOT(OnInstActivated(int,int)));
156 connect(m_instances_table, SIGNAL(cellChanged(int,int)), this, SLOT(OnInstChanged(int,int)));
157 connect(m_name_edit, SIGNAL(textChanged(const QString&)), this, SLOT(OnNameEdited(const QString&)));
158 connect(m_long_name_edit, SIGNAL(textChanged(const QString&)), this, SLOT(OnLongNameEdited(const QString&)));
159 connect(m_version_edit, SIGNAL(textChanged(const QString&)), this, SLOT(OnVersionEdited(const QString&)));
160 connect(m_desc_edit, SIGNAL(OnTextChanged()), this, SLOT(OnDescEdited()));
161} 168}
162 169
163void DevEditPanel::OnNameEdited(const QString& text) 170void SocEditPanel::OnTextEdited()
164{ 171{
165 m_ref.GetDev().name = text.toStdString(); 172 m_ref.get()->desc = m_desc_edit->GetTextHtml().toStdString();
166 OnModified(m_name_edit->isModified()); 173 OnModified();
167} 174}
168 175
169void DevEditPanel::OnLongNameEdited(const QString& text) 176void SocEditPanel::OnAuthorActivated(QTableWidgetItem *item)
170{ 177{
171 m_ref.GetDev().long_name = text.toStdString(); 178 if(item->type() == SocEditPanelDelType)
172 OnModified(m_long_name_edit->isModified()); 179 {
180 int row = item->row();
181 my_remove_at(m_ref.get()->author, row);
182 m_authors_list->removeRow(row);
183 OnModified();
184 }
185 else if(item->type() == SocEditPanelAddType)
186 {
187 int row = m_ref.get()->author.size();
188 m_ref.get()->author.push_back("Anonymous");
189 m_authors_list->insertRow(row);
190 QTableWidgetItem *item = new QTableWidgetItem(
191 QIcon::fromTheme("list-remove"), "", SocEditPanelDelType);
192 item->setFlags(Qt::ItemIsEnabled);
193 m_authors_list->setItem(row, 0, item);
194 item = new QTableWidgetItem(QString::fromStdString(m_ref.get()->author.back()));
195 m_authors_list->setItem(row, 1, item);
196 OnModified();
197 }
173} 198}
174 199
175void DevEditPanel::OnVersionEdited(const QString& text) 200void SocEditPanel::OnAuthorChanged(QTableWidgetItem *item)
176{ 201{
177 m_ref.GetDev().version = text.toStdString(); 202 if((size_t)item->row() >= m_ref.get()->author.size())
178 OnModified(m_version_edit->isModified()); 203 return;
204 if(item->column() == 1)
205 m_ref.get()->author[item->row()] = item->text().toStdString();
206 OnModified();
179} 207}
180 208
181void DevEditPanel::OnDescEdited() 209/**
210 * NodeInstanceEditPanel
211 */
212
213namespace
182{ 214{
183 m_ref.GetDev().desc = m_desc_edit->GetTextHtml().toStdString(); 215
184 OnModified(m_desc_edit->IsModified()); 216template< typename T >
217soc_id_t GetFreshId(const std::vector< T >& list)
218{
219 soc_id_t id = 0;
220 for(size_t i = 0; i < list.size(); i++)
221 id = std::max(id, list[i].id);
222 return id + 1;
185} 223}
186 224
187void DevEditPanel::CreateNewRow(int row) 225template< typename T >
226int GetIndexById(const std::vector< T >& list, soc_id_t id)
188{ 227{
189 QTableWidgetItem *item = new QTableWidgetItem(QIcon::fromTheme("list-add"), "", DevInstNewType); 228 for(size_t i = 0; i < list.size(); i++)
190 item->setToolTip("New?"); 229 if(list[i].id == id)
191 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); 230 return i;
192 m_instances_table->setItem(row, DevInstIconColumn, item); 231 return -1;
193 item = new QTableWidgetItem("New instance...");
194 QFont font = item->font();
195 font.setItalic(true);
196 item->setFont(font);
197 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
198 m_instances_table->setItem(row, DevInstNameColumn, item);
199 item = new QTableWidgetItem("");
200 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
201 m_instances_table->setItem(row, DevInstAddrColumn, item);
202} 232}
203 233
204void DevEditPanel::FillRow(int row, const soc_dev_addr_t& addr) 234soc_desc::instance_t *GetInstanceById(const soc_desc::node_ref_t& node, soc_id_t id)
205{ 235{
206 QTableWidgetItem *item = new QTableWidgetItem(QString::fromStdString(addr.name)); 236 std::vector< soc_desc::instance_t >& inst_list = node.get()->instance;
207 item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter); 237 for(size_t i = 0; i < inst_list.size(); i++)
208 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable); 238 if(inst_list[i].id == id)
209 m_instances_table->setItem(row, DevInstNameColumn, item); 239 return &inst_list[i];
210 item = new QTableWidgetItem(); 240 return 0;
211 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable);
212 item->setData(Qt::DisplayRole, QVariant(addr.addr));
213 m_instances_table->setItem(row, DevInstAddrColumn, item);
214 item = new QTableWidgetItem(QIcon::fromTheme("list-remove"), "", DevInstDeleteType);
215 item->setToolTip("Remove?");
216 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
217 m_instances_table->setItem(row, DevInstIconColumn, item);
218} 241}
219 242
220void DevEditPanel::OnInstActivated(int row, int column) 243bool RemoveInstanceById(const soc_desc::node_ref_t& node, soc_id_t id)
221{ 244{
222 if(column != 0) 245 std::vector< soc_desc::instance_t >& inst_list = node.get()->instance;
223 return; 246 for(size_t i = 0; i < inst_list.size(); i++)
224 int type = m_instances_table->item(row, column)->type(); 247 if(inst_list[i].id == id)
225 if(type == DevInstDeleteType) 248 {
226 { 249 my_remove_at(inst_list, i);
227 m_ref.GetDev().addr.erase(m_ref.GetDev().addr.begin() + row); 250 return true;
228 m_instances_table->removeRow(row); 251 }
229 OnModified(true); 252 return false;
230 }
231 else if(type == DevInstNewType)
232 {
233 m_instances_table->insertRow(row);
234 soc_dev_addr_t addr;
235 addr.name = QString("UNNAMED_%1").arg(row).toStdString();
236 addr.addr = 0;
237 m_ref.GetDev().addr.push_back(addr);
238 FillRow(row, addr);
239 }
240} 253}
241 254
242void DevEditPanel::OnInstChanged(int row, int column) 255enum
243{ 256{
244 /* ignore extra row for addition */ 257 InstTypeSingle,
245 if(row >= (int)m_ref.GetDev().addr.size()) 258 InstTypeRangeStride,
246 return; 259 InstTypeRangeFormula,
247 QTableWidgetItem *item = m_instances_table->item(row, column); 260 InstTypeRangeList
248 if(column == DevInstNameColumn) 261};
262
263enum
264{
265 NodeInstEditPanelDelType = QTableWidgetItem::UserType,
266 NodeInstEditPanelAddType
267};
268
269}
270
271NodeInstanceEditPanel::NodeInstanceEditPanel(const soc_desc::node_ref_t& ref,
272 soc_id_t inst_id, QWidget *parent)
273 :QWidget(parent), m_ref(ref), m_id(inst_id)
274{
275 QLineEdit *name_edit = new QLineEdit(this);
276 QLineEdit *title_edit = new QLineEdit(this);
277 m_type_combo = new QComboBox(this);
278 QLabel *type_label = new QLabel("Type:", this);
279 QFont f = type_label->font();
280 f.setBold(true);
281 type_label->setFont(f);
282
283 QHBoxLayout *type_layout = new QHBoxLayout;
284 type_layout->addWidget(type_label);
285 type_layout->addWidget(m_type_combo);
286 type_layout->addStretch(0);
287
288 soc_desc::field_t fake_field;
289 fake_field.pos = 0;
290 fake_field.width = 32;
291
292 m_single_group = new QWidget(this);
293 QHBoxLayout *sg_layout = new QHBoxLayout;
294 sg_layout->addWidget(new QLabel("Address:", m_single_group));
295 SocFieldEditor *addr_edit = new SocFieldEditor(fake_field, m_single_group);
296 sg_layout->addWidget(addr_edit);
297 m_single_group->setLayout(sg_layout);
298
299 m_range_group = new QWidget(this);
300 QGridLayout *rg_layout = new QGridLayout;
301 rg_layout->addWidget(new QLabel("First:", m_range_group), 0, 0);
302 QSpinBox *first_spin = new QSpinBox(m_range_group);
303 rg_layout->addWidget(first_spin, 0, 1);
304 rg_layout->addWidget(new QLabel("Count:", m_range_group), 1, 0);
305 QSpinBox *count_spin = new QSpinBox(m_range_group);
306 rg_layout->addWidget(count_spin, 1, 1);
307 m_range_group->setLayout(rg_layout);
308
309 m_stride_group = new QWidget(m_range_group);
310 QGridLayout *rsg_layout = new QGridLayout;
311 rsg_layout->addWidget(new QLabel("Base:", m_stride_group), 0, 0);
312 SocFieldEditor *base_edit = new SocFieldEditor(fake_field, m_stride_group);
313 rsg_layout->addWidget(base_edit, 0, 1);
314 rsg_layout->addWidget(new QLabel("Stride:", m_stride_group), 1, 0);
315 SocFieldEditor *stride_edit = new SocFieldEditor(fake_field, m_stride_group);
316 rsg_layout->addWidget(stride_edit, 1, 1);
317 m_stride_group->setLayout(rsg_layout);
318
319 m_formula_group = new QWidget(m_range_group);
320 QGridLayout *fsg_layout = new QGridLayout;
321 fsg_layout->addWidget(new QLabel("Variable:", m_formula_group), 0, 0);
322 QLineEdit *variable_edit = new QLineEdit(m_formula_group);
323 fsg_layout->addWidget(variable_edit, 0, 1);
324 fsg_layout->addWidget(new QLabel("Formula:", m_formula_group), 1, 0);
325 QLineEdit *formula_edit = new QLineEdit(m_formula_group);
326 fsg_layout->addWidget(formula_edit, 1, 1);
327 m_formula_group->setLayout(fsg_layout);
328
329 QTableWidget *addr_list = new QTableWidget(m_range_group);
330 m_list_group = addr_list;
331
332 QHBoxLayout *inst_layout = new QHBoxLayout;
333 inst_layout->addWidget(m_single_group);
334 inst_layout->addWidget(m_range_group);
335 inst_layout->addWidget(m_stride_group);
336 inst_layout->addWidget(m_formula_group);
337 inst_layout->addWidget(m_list_group);
338 inst_layout->addStretch(0);
339
340 QGroupBox *inst_groupbox = new QGroupBox(this);
341 inst_groupbox->setLayout(inst_layout);
342
343 MyTextEditor *desc_edit = new MyTextEditor(this);
344 QVBoxLayout *ii_layout = new QVBoxLayout;
345
346 QFormLayout *info_layout = new QFormLayout();
347 info_layout->addRow("Name", name_edit);
348 info_layout->addRow("Title", title_edit);
349
350 QGroupBox *info_group = Misc::EncloseInBox("Information", info_layout);
351 QGroupBox *desc_group = Misc::EncloseInBox("Description", desc_edit);
352 QHBoxLayout *name_title_desc_layout = new QHBoxLayout;
353 name_title_desc_layout->addWidget(info_group, 1);
354 name_title_desc_layout->addWidget(desc_group, 2);
355
356 ii_layout->addLayout(name_title_desc_layout);
357 ii_layout->addLayout(type_layout);
358 ii_layout->addWidget(inst_groupbox);
359 ii_layout->addStretch(1);
360
361 m_type_combo->addItem("Single", QVariant(InstTypeSingle));
362 m_type_combo->addItem("Range > Stride", QVariant(InstTypeRangeStride));
363 m_type_combo->addItem("Range > Formula", QVariant(InstTypeRangeFormula));
364 m_type_combo->addItem("Range > List", QVariant(InstTypeRangeList));
365
366 /* fill info */
367 soc_desc::instance_t& inst = GetInstance();
368 name_edit->setText(QString::fromStdString(inst.name));
369 title_edit->setText(QString::fromStdString(inst.title));
370 desc_edit->SetTextHtml(QString::fromStdString(inst.desc));
371 addr_edit->setField(inst.addr);
372 base_edit->setField(inst.range.base);
373 stride_edit->setField(inst.range.stride);
374 first_spin->setValue(inst.range.first);
375 count_spin->setValue(inst.range.count);
376 formula_edit->setText(QString::fromStdString(inst.range.formula));
377 variable_edit->setText(QString::fromStdString(inst.range.variable));
378 addr_list->setColumnCount(2);
379 addr_list->setHorizontalHeaderItem(0, new QTableWidgetItem(""));
380 addr_list->setHorizontalHeaderItem(1, new QTableWidgetItem("Address"));
381 addr_list->horizontalHeader()->setVisible(false);
382 addr_list->verticalHeader()->setVisible(false);
383 addr_list->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
384 std::vector< soc_word_t >& addrs = inst.range.list;
385 addr_list->setRowCount(addrs.size() + 1);
386 for(size_t i = 0; i < addrs.size(); i++)
249 { 387 {
250 m_ref.GetDev().addr[row].name = item->text().toStdString(); 388 QTableWidgetItem *item = new QTableWidgetItem(
251 OnModified(true); 389 QIcon::fromTheme("list-remove"), "", NodeInstEditPanelDelType);
390 item->setFlags(Qt::ItemIsEnabled);
391 addr_list->setItem(i, 0, item);
392 item = new QTableWidgetItem();
393 item->setData(Qt::EditRole, QVariant::fromValue(addrs[i]));
394 addr_list->setItem(i, 1, item);
252 } 395 }
253 else if(column == DevInstAddrColumn) 396 QTableWidgetItem *new_item = new QTableWidgetItem(
397 QIcon::fromTheme("list-add"), "", NodeInstEditPanelAddType);
398 new_item->setFlags(Qt::ItemIsEnabled);
399 addr_list->setItem(addrs.size(), 0, new_item);
400 new_item = new QTableWidgetItem("New address...", QTableWidgetItem::UserType);
401 new_item->setFlags(Qt::ItemIsEnabled);
402 QFont font = new_item->font();
403 font.setItalic(true);
404 new_item->setFont(font);
405 addr_list->setItem(addrs.size(), 1, new_item);
406 addr_list->resizeColumnsToContents();
407 addr_list->horizontalHeader()->setStretchLastSection(true);
408 m_table_delegate = new SocFieldItemDelegate(this);
409 m_table_delegate->setItemEditorFactory(new QItemEditorFactory);
410 m_table_edit_factory = new SocFieldEditorCreator;
411 m_table_delegate->itemEditorFactory()->registerEditor(QVariant::UInt, m_table_edit_factory);
412 addr_list->setItemDelegate(m_table_delegate);
413
414 setLayout(ii_layout);
415
416 connect(name_edit, SIGNAL(textChanged(const QString&)), this,
417 SLOT(OnNameEdited(const QString&)));
418 connect(desc_edit, SIGNAL(OnTextChanged(const QString&)), this,
419 SLOT(OnDescEdited(const QString&)));
420 connect(title_edit, SIGNAL(textChanged(const QString&)), this,
421 SLOT(OnTitleEdited(const QString&)));
422 connect(addr_edit, SIGNAL(editingFinished(uint)), this, SLOT(OnAddrChanged(uint)));
423 connect(base_edit, SIGNAL(editingFinished(uint)), this, SLOT(OnBaseChanged(uint)));
424 connect(stride_edit, SIGNAL(editingFinished(uint)), this, SLOT(OnStrideChanged(uint)));
425 connect(first_spin, SIGNAL(valueChanged(int)), this, SLOT(OnFirstChanged(int)));
426 connect(count_spin, SIGNAL(valueChanged(int)), this, SLOT(OnCountChanged(int)));
427 connect(formula_edit, SIGNAL(textChanged(const QString&)), this,
428 SLOT(OnFormulaChanged(const QString&)));
429 connect(variable_edit, SIGNAL(textChanged(const QString&)), this,
430 SLOT(OnVariableChanged(const QString&)));
431 connect(m_type_combo, SIGNAL(currentIndexChanged(int)),
432 this, SLOT(OnTypeChanged(int)));
433 connect(addr_list, SIGNAL(itemActivated(QTableWidgetItem *)), this,
434 SLOT(OnAddressActivated(QTableWidgetItem *)));
435 connect(addr_list, SIGNAL(itemChanged(QTableWidgetItem *)), this,
436 SLOT(OnAddressChanged(QTableWidgetItem *)));
437
438 /* fill info */
439 int combo_type;
440 if(inst.type == soc_desc::instance_t::RANGE)
254 { 441 {
255 m_ref.GetDev().addr[row].addr = item->data(Qt::DisplayRole).toUInt(); 442 if(inst.range.type == soc_desc::range_t::STRIDE)
256 OnModified(true); 443 combo_type = InstTypeRangeStride;
444 else if(inst.range.type == soc_desc::range_t::FORMULA)
445 combo_type = InstTypeRangeFormula;
446 else /* LIST */
447 combo_type = InstTypeRangeList;
257 } 448 }
449 else
450 combo_type = InstTypeSingle;
451 m_type_combo->setCurrentIndex(m_type_combo->findData(QVariant(combo_type)));
452 UpdateType(combo_type);
258} 453}
259 454
260/** 455soc_desc::instance_t& NodeInstanceEditPanel::GetInstance()
261 * RegEditPanel 456{
262 */ 457 return *GetInstanceById(m_ref, m_id);
458}
263 459
264RegEditPanel::RegEditPanel(SocRegRef ref, QWidget *parent) 460void NodeInstanceEditPanel::OnNameEdited(const QString& text)
265 :QWidget(parent), m_ref(ref), m_reg_font(font())
266{ 461{
267 m_reg_font.setWeight(100); 462 GetInstance().name = text.toStdString();
268 m_reg_font.setKerning(false); 463 OnModified();
464}
269 465
270 m_name_group = new QGroupBox("Name", this); 466void NodeInstanceEditPanel::OnTitleEdited(const QString& text)
271 m_name_edit = new QLineEdit(this); 467{
272 m_name_edit->setText(QString::fromStdString(ref.GetReg().name)); 468 GetInstance().title = text.toStdString();
273 QVBoxLayout *name_group_layout = new QVBoxLayout; 469 OnModified();
274 name_group_layout->addWidget(m_name_edit); 470}
275 m_name_group->setLayout(name_group_layout);
276
277 m_instances_table = new QTableWidget(this);
278 m_instances_table->setRowCount(ref.GetReg().addr.size() + 1);
279 m_instances_table->setColumnCount(RegInstNrColumns);
280 for(size_t row = 0; row < ref.GetReg().addr.size(); row++)
281 FillRow(row, ref.GetReg().addr[row]);
282 CreateNewAddrRow(ref.GetReg().addr.size());
283 m_instances_table->setHorizontalHeaderItem(RegInstIconColumn, new QTableWidgetItem(""));
284 m_instances_table->setHorizontalHeaderItem(RegInstNameColumn, new QTableWidgetItem("Name"));
285 m_instances_table->setHorizontalHeaderItem(RegInstAddrColumn, new QTableWidgetItem("Address"));
286 m_instances_table->verticalHeader()->setVisible(false);
287 m_instances_table->resizeColumnsToContents();
288 m_instances_table->horizontalHeader()->setStretchLastSection(true);
289 m_instances_table->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
290 m_instances_group = new QGroupBox("Instances", this);
291 QHBoxLayout *instances_group_layout = new QHBoxLayout;
292 instances_group_layout->addWidget(m_instances_table);
293 m_instances_group->setLayout(instances_group_layout);
294
295 m_desc_group = new QGroupBox("Description", this);
296 QHBoxLayout *group_layout = new QHBoxLayout;
297 m_desc_edit = new MyTextEditor(this);
298 m_desc_edit->SetTextHtml(QString::fromStdString(ref.GetReg().desc));
299 group_layout->addWidget(m_desc_edit);
300 m_desc_group->setLayout(group_layout);
301
302 bool has_sct = m_ref.GetReg().flags & REG_HAS_SCT;
303 m_sct_check = new QCheckBox("Set/Clear/Toggle", this);
304 m_sct_check->setCheckState(has_sct ? Qt::Checked : Qt::Unchecked);
305 QHBoxLayout *flags_layout = new QHBoxLayout;
306 flags_layout->addWidget(m_sct_check);
307 flags_layout->addStretch();
308 m_flags_group = new QGroupBox("Flags", this);
309 m_flags_group->setLayout(flags_layout);
310
311 m_formula_combo = new QComboBox(this);
312 m_formula_combo->addItem("None", QVariant(REG_FORMULA_NONE));
313 m_formula_combo->addItem("String", QVariant(REG_FORMULA_STRING));
314 m_formula_combo->setCurrentIndex(m_formula_combo->findData(QVariant(m_ref.GetReg().formula.type)));
315 m_formula_type_label = new QLabel("Type:", this);
316 QHBoxLayout *formula_top_layout = new QHBoxLayout;
317 formula_top_layout->addWidget(m_formula_type_label);
318 formula_top_layout->addWidget(m_formula_combo);
319 m_formula_string_edit = new QLineEdit(QString::fromStdString(ref.GetReg().formula.string), this);
320 QVBoxLayout *formula_layout = new QVBoxLayout;
321 formula_layout->addLayout(formula_top_layout);
322 formula_layout->addWidget(m_formula_string_edit);
323 m_formula_string_gen = new QPushButton("Generate", this);
324 formula_layout->addWidget(m_formula_string_gen);
325 m_formula_group = new QGroupBox("Formula", this);
326 m_formula_group->setLayout(formula_layout);
327
328 QVBoxLayout *name_layout = new QVBoxLayout;
329 name_layout->addWidget(m_name_group);
330 name_layout->addWidget(m_flags_group);
331 name_layout->addWidget(m_formula_group);
332 name_layout->addStretch();
333
334 QHBoxLayout *top_layout = new QHBoxLayout;
335 top_layout->addWidget(m_instances_group);
336 top_layout->addLayout(name_layout);
337 top_layout->addWidget(m_desc_group, 1);
338
339 m_value_table = new QTableView(this);
340 m_value_model = new RegFieldTableModel(m_value_table); // view takes ownership
341 m_value_model->SetRegister(m_ref.GetReg());
342 m_value_model->SetReadOnly(true);
343 m_value_table->setModel(m_value_model);
344 m_value_table->verticalHeader()->setVisible(false);
345 m_value_table->horizontalHeader()->setStretchLastSection(true);
346 m_value_table->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
347 // FIXME we cannot use setAlternatingRowColors() because we override the
348 // background color, should it be part of the model ?
349 m_table_delegate = new SocFieldCachedItemDelegate(this);
350 m_value_table->setItemDelegate(m_table_delegate);
351 m_value_table->resizeColumnsToContents();
352
353 m_sexy_display2 = new Unscroll<RegSexyDisplay2>(this);
354 m_sexy_display2->setFont(m_reg_font);
355 m_sexy_display2->setModel(m_value_model);
356 m_sexy_display2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
357 471
358 QHBoxLayout *field_layout = new QHBoxLayout; 472void NodeInstanceEditPanel::OnDescEdited(const QString& text)
359 field_layout->addWidget(m_value_table); 473{
360 m_field_group = new QGroupBox("Flags", this); 474 GetInstance().desc = text.toStdString();
361 m_field_group->setLayout(field_layout); 475 OnModified();
476}
362 477
363 QVBoxLayout *layout = new QVBoxLayout; 478void NodeInstanceEditPanel::OnAddrChanged(uint addr)
364 layout->addLayout(top_layout, 0); 479{
365 layout->addWidget(m_sexy_display2, 0); 480 GetInstance().addr = addr;
366 layout->addWidget(m_field_group); 481 OnModified();
482}
367 483
368 UpdateFormula(); 484void NodeInstanceEditPanel::OnBaseChanged(uint base)
485{
486 GetInstance().range.base = base;
487 OnModified();
488}
369 489
370 setLayout(layout); 490void NodeInstanceEditPanel::OnStrideChanged(uint stride)
491{
492 GetInstance().range.stride = stride;
493 OnModified();
494}
371 495
372 SocFieldItemDelegate *m_table_delegate = new SocFieldItemDelegate(this); 496void NodeInstanceEditPanel::OnFirstChanged(int first)
373 QItemEditorFactory *m_table_edit_factory = new QItemEditorFactory(); 497{
374 SocFieldEditorCreator *m_table_edit_creator = new SocFieldEditorCreator(); 498 GetInstance().range.first = first;
375 m_table_edit_factory->registerEditor(QVariant::UInt, m_table_edit_creator); 499 OnModified();
376 m_table_delegate->setItemEditorFactory(m_table_edit_factory); 500}
377 m_instances_table->setItemDelegate(m_table_delegate);
378 501
379 connect(m_instances_table, SIGNAL(cellActivated(int,int)), this, SLOT(OnInstActivated(int,int))); 502void NodeInstanceEditPanel::OnCountChanged(int count)
380 connect(m_instances_table, SIGNAL(cellChanged(int,int)), this, SLOT(OnInstChanged(int,int))); 503{
381 connect(m_name_edit, SIGNAL(textChanged(const QString&)), this, SLOT(OnNameEdited(const QString&))); 504 GetInstance().range.count = count;
382 connect(m_desc_edit, SIGNAL(OnTextChanged()), this, SLOT(OnDescEdited())); 505 OnModified();
383 connect(m_sct_check, SIGNAL(stateChanged(int)), this, SLOT(OnSctEdited(int)));
384 connect(m_formula_combo, SIGNAL(currentIndexChanged(int)), this, SLOT(OnFormulaChanged(int)));
385 connect(m_formula_string_edit, SIGNAL(textChanged(const QString&)), this,
386 SLOT(OnFormulaStringChanged(const QString&)));
387 connect(m_formula_string_gen, SIGNAL(clicked(bool)), this, SLOT(OnFormulaGenerate(bool)));
388} 506}
389 507
390void RegEditPanel::UpdateWarning(int row) 508void NodeInstanceEditPanel::OnFormulaChanged(const QString& formula)
391{ 509{
392 Q_UNUSED(row); 510 GetInstance().range.formula = formula.toStdString();
511 OnModified();
393} 512}
394 513
395void RegEditPanel::OnFormulaStringChanged(const QString& text) 514void NodeInstanceEditPanel::OnVariableChanged(const QString& variable)
396{ 515{
397 m_ref.GetReg().formula.string = text.toStdString(); 516 GetInstance().range.variable = variable.toStdString();
398 OnModified(true); 517 OnModified();
399} 518}
400 519
401void RegEditPanel::OnFormulaGenerate(bool checked) 520void NodeInstanceEditPanel::OnAddressActivated(QTableWidgetItem *item)
402{ 521{
403 Q_UNUSED(checked); 522 QTableWidget *table = item->tableWidget();
404 bool ok; 523 soc_desc::instance_t& inst = GetInstance();
405 int count = QInputDialog::getInt(this, "Instance generator", "Number of instances", 524 if(item->type() == NodeInstEditPanelDelType)
406 0, 0, 100, 1, &ok);
407 if(!ok)
408 return;
409 std::string name(m_ref.GetReg().name);
410 size_t pos = name.find('n');
411 if(pos == std::string::npos)
412 {
413 name.push_back('n');
414 pos = name.size() - 1;
415 }
416 std::map< std::string, soc_word_t > map;
417 std::vector< std::pair< std::string, soc_word_t > > list;
418 std::string formula = m_ref.GetReg().formula.string;
419 for(int n = 0; n < count; n++)
420 { 525 {
421 map["n"] = n; 526 int row = item->row();
422 std::string err; 527 my_remove_at(inst.range.list, row);
423 soc_word_t res; 528 table->removeRow(row);
424 if(!evaluate_formula(formula, map, res, err)) 529 OnModified();
425 {
426 qDebug() << "Cannot evaluator " << QString::fromStdString(formula)
427 << "for n=" << n << ": " << QString::fromStdString(err);
428 return;
429 }
430 std::string regname = name;
431 std::string strn = QString("%1").arg(n).toStdString();
432 regname.replace(pos, 1, strn);
433 list.push_back(std::make_pair(regname, res));
434 } 530 }
435 // everything went good, commit result 531 else if(item->type() == NodeInstEditPanelAddType)
436 while(m_instances_table->rowCount() > 1)
437 m_instances_table->removeRow(0);
438 m_ref.GetReg().addr.resize(list.size());
439 for(size_t i = 0; i < list.size(); i++)
440 { 532 {
441 m_instances_table->insertRow(i); 533 int row = inst.range.list.size();
442 m_ref.GetReg().addr[i].name = list[i].first; 534 soc_word_t new_addr = 0;
443 m_ref.GetReg().addr[i].addr = list[i].second; 535 GetInstance().range.list.push_back(new_addr);
444 FillRow(i, m_ref.GetReg().addr[i]); 536 table->insertRow(row);
537 QTableWidgetItem *item = new QTableWidgetItem(
538 QIcon::fromTheme("list-remove"), "", NodeInstEditPanelDelType);
539 item->setFlags(Qt::ItemIsEnabled);
540 table->setItem(row, 0, item);
541 item = new QTableWidgetItem();
542 item->setData(Qt::EditRole, QVariant(new_addr));
543 table->setItem(row, 1, item);
544 OnModified();
445 } 545 }
446} 546}
447 547
448void RegEditPanel::OnFormulaChanged(int index) 548void NodeInstanceEditPanel::OnAddressChanged(QTableWidgetItem *item)
449{ 549{
450 if(index == -1) 550 soc_desc::instance_t& inst = GetInstance();
551 if((size_t)item->row() >= inst.range.list.size())
451 return; 552 return;
452 m_ref.GetReg().formula.type = static_cast< soc_reg_formula_type_t >(m_formula_combo->itemData(index).toInt()); 553 soc_word_t& addr = inst.range.list[item->row()];
453 UpdateFormula(); 554 if(item->column() == 1)
454 OnModified(true); 555 addr = item->data(Qt::EditRole).value< soc_word_t >();
556 OnModified();
455} 557}
456 558
457void RegEditPanel::UpdateFormula() 559void NodeInstanceEditPanel::UpdateType(int type)
458{ 560{
459 m_formula_string_edit->hide(); 561 m_single_group->hide();
460 m_formula_string_gen->hide(); 562 m_range_group->hide();
461 switch(m_ref.GetReg().formula.type) 563 m_stride_group->hide();
564 m_formula_group->hide();
565 m_list_group->hide();
566
567 switch(type)
462 { 568 {
463 case REG_FORMULA_STRING: 569 case InstTypeSingle:
464 m_formula_string_edit->show(); 570 m_single_group->show();
465 m_formula_string_gen->show(); 571 GetInstance().type = soc_desc::instance_t::SINGLE;
572 break;
573 case InstTypeRangeStride:
574 m_range_group->show();
575 m_stride_group->show();
576 GetInstance().type = soc_desc::instance_t::RANGE;
577 GetInstance().range.type = soc_desc::range_t::STRIDE;
578 break;
579 case InstTypeRangeFormula:
580 m_range_group->show();
581 m_formula_group->show();
582 GetInstance().type = soc_desc::instance_t::RANGE;
583 GetInstance().range.type = soc_desc::range_t::FORMULA;
584 break;
585 case InstTypeRangeList:
586 m_range_group->show();
587 m_formula_group->hide();
588 m_list_group->show();
589 GetInstance().type = soc_desc::instance_t::RANGE;
590 GetInstance().range.type = soc_desc::range_t::LIST;
466 break; 591 break;
467 case REG_FORMULA_NONE:
468 default: 592 default:
469 break; 593 break;
470 } 594 }
471} 595}
472 596
473void RegEditPanel::OnSctEdited(int state) 597void NodeInstanceEditPanel::OnTypeChanged(int index)
474{ 598{
475 if(state == Qt::Checked) 599 if(index == -1)
476 m_ref.GetReg().flags |= REG_HAS_SCT; 600 return;
477 else 601 UpdateType(m_type_combo->itemData(index).toInt());
478 m_ref.GetReg().flags &= ~REG_HAS_SCT; 602 OnModified();
479 OnModified(true);
480}
481
482void RegEditPanel::FillRow(int row, const soc_reg_addr_t& addr)
483{
484 QTableWidgetItem *item = new QTableWidgetItem(QString::fromStdString(addr.name));
485 item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter);
486 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable);
487 m_instances_table->setItem(row, RegInstNameColumn, item);
488 item = new QTableWidgetItem();
489 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable);
490 item->setData(Qt::DisplayRole, QVariant(addr.addr));
491 m_instances_table->setItem(row, RegInstAddrColumn, item);
492 item = new QTableWidgetItem(QIcon::fromTheme("list-remove"), "", RegInstDeleteType);
493 item->setToolTip("Remove?");
494 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
495 m_instances_table->setItem(row, RegInstIconColumn, item);
496}
497
498void RegEditPanel::CreateNewAddrRow(int row)
499{
500 QTableWidgetItem *item = new QTableWidgetItem(QIcon::fromTheme("list-add"), "", RegInstNewType);
501 item->setToolTip("New?");
502 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
503 m_instances_table->setItem(row, RegInstIconColumn, item);
504 item = new QTableWidgetItem("New instance...");
505 QFont font = item->font();
506 font.setItalic(true);
507 item->setFont(font);
508 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
509 m_instances_table->setItem(row, RegInstNameColumn, item);
510 item = new QTableWidgetItem("");
511 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
512 m_instances_table->setItem(row, RegInstAddrColumn, item);
513} 603}
514 604
515void RegEditPanel::OnNameEdited(const QString& text) 605soc_id_t NodeInstanceEditPanel::GetId()
516{ 606{
517 m_ref.GetReg().name = text.toStdString(); 607 return m_id;
518 OnModified(m_name_edit->isModified());
519} 608}
520 609
521void RegEditPanel::OnDescEdited() 610/**
522{ 611 * NodeEditPanel
523 m_ref.GetReg().desc = m_desc_edit->GetTextHtml().toStdString(); 612 */
524 OnModified(m_desc_edit->IsModified());
525}
526 613
527void RegEditPanel::OnInstActivated(int row, int column) 614NodeEditPanel::NodeEditPanel(const soc_desc::node_ref_t& ref, QWidget *parent)
615 :QWidget(parent), m_ref(ref)
528{ 616{
529 if(column != 0) 617 /* top layout: name, title then desc */
530 return; 618 QLineEdit *name_edit = new QLineEdit(this);
531 int type = m_instances_table->item(row, column)->type(); 619 name_edit->setText(QString::fromStdString(ref.get()->name));
532 if(type == RegInstDeleteType) 620
533 { 621 QLineEdit *title_edit = new QLineEdit(this);
534 m_ref.GetReg().addr.erase(m_ref.GetReg().addr.begin() + row); 622 title_edit->setText(QString::fromStdString(ref.get()->title));
535 m_instances_table->removeRow(row); 623
536 OnModified(true); 624 QFormLayout *info_layout = new QFormLayout();
537 } 625 info_layout->addRow("Name", name_edit);
538 else if(type == RegInstNewType) 626 info_layout->addRow("Title", title_edit);
627
628 QGroupBox *info_group = Misc::EncloseInBox("Information", info_layout);
629
630 m_desc_edit = new MyTextEditor(this);
631 m_desc_edit->SetTextHtml(QString::fromStdString(ref.get()->desc));
632 QGroupBox *desc_group = Misc::EncloseInBox("Description", m_desc_edit);
633
634 QHBoxLayout *name_title_desc_layout = new QHBoxLayout;
635 name_title_desc_layout->addWidget(info_group, 1);
636 name_title_desc_layout->addWidget(desc_group, 2);
637
638 /* instance tab */
639 m_instances_tab = new YTabWidget(0, this);
640 m_instances_tab->setTabOpenable(true);
641 std::vector< soc_desc::instance_t >& inst_list = m_ref.get()->instance;
642 m_instances_tab->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding);
643 m_instances_tab->setTabsClosable(true);
644 QGroupBox *instance_tab_group = Misc::EncloseInBox("Instances", m_instances_tab);
645 for(size_t i = 0; i < inst_list.size(); i++)
539 { 646 {
540 m_instances_table->insertRow(row); 647 NodeInstanceEditPanel *p = new NodeInstanceEditPanel(m_ref, inst_list[i].id, this);
541 soc_reg_addr_t addr; 648 connect(p, SIGNAL(OnModified()), this, SLOT(OnInstModified()));
542 addr.name = QString("UNNAMED_%1").arg(row).toStdString(); 649 m_instances_tab->addTab(p, QString::fromStdString(inst_list[i].name));
543 addr.addr = 0;
544 m_ref.GetReg().addr.push_back(addr);
545 FillRow(row, addr);
546 } 650 }
651
652 /* boring */
653 QVBoxLayout *layout = new QVBoxLayout;
654 layout->addLayout(name_title_desc_layout);
655 layout->addWidget(instance_tab_group);
656 layout->addStretch(1);
657
658 setLayout(layout);
659
660 connect(name_edit, SIGNAL(textChanged(const QString&)), this,
661 SLOT(OnNameEdited(const QString&)));
662 connect(m_desc_edit, SIGNAL(OnTextChanged()), this, SLOT(OnDescEdited()));
663 connect(title_edit, SIGNAL(textChanged(const QString&)), this,
664 SLOT(OnTitleEdited(const QString&)));
665 connect(m_instances_tab, SIGNAL(tabCloseRequested(int)), this,
666 SLOT(OnInstRemove(int)));
667 connect(m_instances_tab, SIGNAL(tabOpenRequested()), this, SLOT(OnInstCreate()));
547} 668}
548 669
549void RegEditPanel::OnInstChanged(int row, int column) 670void NodeEditPanel::OnNameEdited(const QString& text)
550{ 671{
551 /* ignore extra row for addition */ 672 m_ref.get()->name = text.toStdString();
552 if(row >= (int)m_ref.GetReg().addr.size()) 673 OnModified();
553 return; 674}
554 QTableWidgetItem *item = m_instances_table->item(row, column); 675
555 if(column == RegInstNameColumn) 676void NodeEditPanel::OnTitleEdited(const QString& text)
556 { 677{
557 m_ref.GetReg().addr[row].name = item->text().toStdString(); 678 m_ref.get()->title = text.toStdString();
558 OnModified(true); 679 OnModified();
559 } 680}
560 else if(column == RegInstAddrColumn) 681
682void NodeEditPanel::OnDescEdited()
683{
684 m_ref.get()->desc = m_desc_edit->GetTextHtml().toStdString();
685 OnModified();
686}
687
688void NodeEditPanel::OnInstRemove(int index)
689{
690 NodeInstanceEditPanel *panel =
691 dynamic_cast< NodeInstanceEditPanel * >(m_instances_tab->widget(index));
692 RemoveInstanceById(m_ref, panel->GetId());
693 m_instances_tab->removeTab(index);
694 delete panel;
695 OnModified();
696}
697
698void NodeEditPanel::OnInstModified()
699{
700 int index = m_instances_tab->currentIndex();
701 NodeInstanceEditPanel *panel =
702 dynamic_cast< NodeInstanceEditPanel * >(m_instances_tab->widget(index));
703 m_instances_tab->setTabText(index, QString::fromStdString(panel->GetInstance().name));
704 OnModified();
705}
706
707QString NodeEditPanel::GuessName()
708{
709 /* try to find instances named Xddd where X is the node name (case insensitive)
710 * and d are digits. */
711 int max_nr_digits = -1;
712 int max_value = -1;
713 QString node_name = QString::fromStdString(m_ref.get()->name);
714 std::vector< soc_desc::instance_t >& inst_list = m_ref.get()->instance;
715 for(size_t i = 0; i < inst_list.size(); i++)
561 { 716 {
562 m_ref.GetReg().addr[row].addr = item->data(Qt::DisplayRole).toUInt(); 717 QString inst_name = QString::fromStdString(inst_list[i].name);
563 OnModified(true); 718 /* ignore name if it doesn't start like the node name */
719 if(!inst_name.startsWith(node_name, Qt::CaseInsensitive))
720 continue;
721 /* check if the suffix is a digit */
722 QString suffix = inst_name.mid(node_name.size());
723 if(suffix.size() == 0)
724 {
725 max_nr_digits = qMax(max_nr_digits, 0);
726 continue;
727 }
728 bool ok;
729 int value = suffix.toUInt(&ok);
730 if(!ok)
731 continue;
732 max_value = qMax(max_value, value);
733 max_nr_digits = qMax(max_nr_digits, suffix.size());
564 } 734 }
735 /* if no match, use node name */
736 if(max_nr_digits == -1)
737 return node_name;
738 /* match of size 0, add "1" at the end */
739 if(max_nr_digits == 0)
740 return node_name + "1";
741 /* otherwise, pick next value */
742 return QString("%1%2").arg(node_name)
743 .arg(max_value + 1, max_nr_digits, 10, QChar('0'));
744}
745
746void NodeEditPanel::OnInstCreate()
747{
748 std::vector< soc_desc::instance_t >& inst_list = m_ref.get()->instance;
749 soc_desc::instance_t inst;
750 inst.id = GetFreshId(inst_list);
751 inst.name = GuessName().toStdString();
752 inst.type = soc_desc::instance_t::SINGLE;
753 inst.addr = 0;
754 inst.range.type = soc_desc::range_t::STRIDE;
755 inst.range.first = 0;
756 inst.range.count = 0;
757 inst.range.stride = 0;
758 inst_list.push_back(inst);
759 NodeInstanceEditPanel *p = new NodeInstanceEditPanel(m_ref, inst.id, this);
760 connect(p, SIGNAL(OnModified()), this, SLOT(OnInstModified()));
761 int idx = m_instances_tab->addTab(p, QString::fromStdString(inst.name));
762 m_instances_tab->setCurrentIndex(idx);
763 OnModified();
565} 764}
566 765
567/** 766/**
568 * FieldEditPanel 767 * RegFieldEditPanel
569 */ 768 */
570FieldEditPanel::FieldEditPanel(SocFieldRef ref, QWidget *parent) 769
770namespace
771{
772
773enum
774{
775 RegFieldEditPanelDelType = QTableWidgetItem::UserType,
776 RegFieldEditPanelAddType,
777};
778
779}
780
781RegFieldEditPanel::RegFieldEditPanel(const soc_desc::field_ref_t& ref, QWidget *parent)
571 :QWidget(parent), m_ref(ref) 782 :QWidget(parent), m_ref(ref)
572{ 783{
573 m_name_group = new QGroupBox("Name", this);
574 m_name_edit = new QLineEdit(this); 784 m_name_edit = new QLineEdit(this);
575 m_name_edit->setText(QString::fromStdString(ref.GetField().name)); 785 m_range_edit = new QLineEdit(this);
576 QVBoxLayout *name_group_layout = new QVBoxLayout; 786 m_range_validator = new SocBitRangeValidator(this);
577 name_group_layout->addWidget(m_name_edit); 787 m_range_validator->setWidth(m_ref.reg().get()->width);
578 m_name_group->setLayout(name_group_layout); 788 m_range_edit->setValidator(m_range_validator);
579
580 m_bitrange_group = new QGroupBox("Bit Range", this);
581 m_bitrange_edit = new QLineEdit(this);
582 const soc_reg_field_t& field = ref.GetField();
583 QString bits_str;
584 if(field.first_bit == field.last_bit)
585 bits_str.sprintf("%d", field.first_bit);
586 else
587 bits_str.sprintf("%d:%d", field.last_bit, field.first_bit);
588 m_bitrange_edit->setText(bits_str);
589 m_bitrange_edit->setValidator(new SocBitRangeValidator(m_bitrange_edit));
590 QVBoxLayout *bitrange_group_layout = new QVBoxLayout;
591 bitrange_group_layout->addWidget(m_bitrange_edit);
592 m_bitrange_group->setLayout(bitrange_group_layout);
593
594 m_desc_group = new QGroupBox("Description", this);
595 QHBoxLayout *group_layout = new QHBoxLayout;
596 m_desc_edit = new MyTextEditor(this); 789 m_desc_edit = new MyTextEditor(this);
597 m_desc_edit->SetTextHtml(QString::fromStdString(ref.GetField().desc)); 790 QHBoxLayout *namepos_layout = new QHBoxLayout;
598 group_layout->addWidget(m_desc_edit); 791 namepos_layout->addWidget(new QLabel("Name:"));
599 m_desc_group->setLayout(group_layout); 792 namepos_layout->addWidget(m_name_edit);
600 793 namepos_layout->addWidget(new QLabel("Range:"));
601 m_value_group = new QGroupBox("Values", this); 794 namepos_layout->addWidget(m_range_edit);
602 QHBoxLayout *value_layout = new QHBoxLayout; 795 QVBoxLayout *nameposdesc_layout = new QVBoxLayout;
603 m_value_table = new QTableWidget(this); 796 nameposdesc_layout->addWidget(Misc::EncloseInBox("Information", namepos_layout));
604 m_value_table->setRowCount(ref.GetField().value.size() + 1); 797 nameposdesc_layout->addWidget(Misc::EncloseInBox("Description", m_desc_edit));
605 m_value_table->setColumnCount(FieldValueNrColumns); 798 nameposdesc_layout->addStretch(0);
606 for(size_t row = 0; row < ref.GetField().value.size(); row++) 799
607 FillRow(row, ref.GetField().value[row]); 800 m_enum_table = new QTableWidget(this);
608 CreateNewRow(ref.GetField().value.size()); 801 m_enum_table->setColumnCount(4);
609 m_value_table->setHorizontalHeaderItem(FieldValueIconColumn, new QTableWidgetItem("")); 802 m_enum_table->setHorizontalHeaderItem(0, new QTableWidgetItem(""));
610 m_value_table->setHorizontalHeaderItem(FieldValueNameColumn, new QTableWidgetItem("Name")); 803 m_enum_table->setHorizontalHeaderItem(1, new QTableWidgetItem("Name"));
611 m_value_table->setHorizontalHeaderItem(FieldValueValueColumn, new QTableWidgetItem("Value")); 804 m_enum_table->setHorizontalHeaderItem(2, new QTableWidgetItem("Value"));
612 m_value_table->setHorizontalHeaderItem(FieldValueDescColumn, new QTableWidgetItem("Description")); 805 m_enum_table->setHorizontalHeaderItem(3, new QTableWidgetItem("Description"));
613 m_value_table->verticalHeader()->setVisible(false); 806 m_enum_table->verticalHeader()->setVisible(false);
614 m_value_table->horizontalHeader()->setStretchLastSection(true); 807 m_enum_table->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
615 value_layout->addWidget(m_value_table); 808 m_enum_delegate = new SocFieldItemDelegate(this);
616 m_value_group->setLayout(value_layout); 809 m_enum_delegate->setItemEditorFactory(new QItemEditorFactory);
617 810 m_enum_editor = new SocFieldEditorCreator;
618 QHBoxLayout *line_layout = new QHBoxLayout; 811 m_enum_delegate->itemEditorFactory()->registerEditor(QVariant::UInt, m_enum_editor);
619 line_layout->addWidget(m_name_group); 812 m_enum_table->setItemDelegate(m_enum_delegate);
620 line_layout->addWidget(m_bitrange_group);
621 line_layout->addStretch();
622
623 QVBoxLayout *left_layout = new QVBoxLayout;
624 left_layout->addLayout(line_layout);
625 left_layout->addWidget(m_desc_group);
626 left_layout->addWidget(m_value_group, 1);
627
628 UpdateDelegates();
629
630 connect(m_name_edit, SIGNAL(textChanged(const QString&)), this, SLOT(OnNameEdited(const QString&)));
631 connect(m_desc_edit, SIGNAL(OnTextChanged()), this, SLOT(OnDescEdited()));
632 connect(m_value_table, SIGNAL(cellActivated(int,int)), this, SLOT(OnValueActivated(int,int)));
633 connect(m_value_table, SIGNAL(cellChanged(int,int)), this, SLOT(OnValueChanged(int,int)));
634 connect(m_bitrange_edit, SIGNAL(textChanged(const QString&)), this, SLOT(OnBitRangeEdited(const QString&)));
635 813
636 setLayout(left_layout); 814 QHBoxLayout *field_layout = new QHBoxLayout;
815 field_layout->addLayout(nameposdesc_layout);
816 field_layout->addWidget(Misc::EncloseInBox("Special Values", m_enum_table), 1);
817
818 setLayout(field_layout);
819
820 const soc_desc::field_t& field = *m_ref.get();
821 m_name_edit->setText(QString::fromStdString(field.name));
822 m_range_edit->setText(m_range_validator->generate(
823 field.pos + field.width - 1, field.pos));
824 m_desc_edit->SetTextHtml(QString::fromStdString(field.desc));
825 m_enum_delegate->setWidth(field.width);
826 m_enum_editor->setWidth(field.width);
827 m_enum_table->setRowCount(field.enum_.size() + 1);
828 for(size_t i = 0; i < field.enum_.size(); i++)
829 {
830 QTableWidgetItem *item = new QTableWidgetItem(
831 QIcon::fromTheme("list-remove"), "", RegFieldEditPanelDelType);
832 item->setFlags(Qt::ItemIsEnabled);
833 m_enum_table->setItem(i, 0, item);
834 item = new QTableWidgetItem(QString::fromStdString(field.enum_[i].name));
835 m_enum_table->setItem(i, 1, item);
836 item = new QTableWidgetItem();
837 item->setData(Qt::EditRole, QVariant(field.enum_[i].value));
838 m_enum_table->setItem(i, 2, item);
839 item = new QTableWidgetItem(QString::fromStdString(field.enum_[i].desc));
840 m_enum_table->setItem(i, 3, item);
841 }
842 QTableWidgetItem *new_item = new QTableWidgetItem(
843 QIcon::fromTheme("list-add"), "", RegFieldEditPanelAddType);
844 new_item->setFlags(Qt::ItemIsEnabled);
845 m_enum_table->setItem(field.enum_.size(), 0, new_item);
846 new_item = new QTableWidgetItem("New field...");
847 new_item->setFlags(Qt::ItemIsEnabled);
848 QFont font = new_item->font();
849 font.setItalic(true);
850 new_item->setFont(font);
851 m_enum_table->setItem(field.enum_.size(), 1, new_item);
852 new_item = new QTableWidgetItem();
853 new_item->setFlags(Qt::ItemIsEnabled);
854 m_enum_table->setItem(field.enum_.size(), 2, new_item);
855 new_item = new QTableWidgetItem();
856 new_item->setFlags(Qt::ItemIsEnabled);
857 m_enum_table->setItem(field.enum_.size(), 3, new_item);
858 m_enum_table->resizeColumnsToContents();
859 m_enum_table->horizontalHeader()->setStretchLastSection(true);
860
861 connect(m_name_edit, SIGNAL(textChanged(const QString&)), this,
862 SLOT(OnFieldNameChanged(const QString&)));
863 connect(m_range_edit, SIGNAL(textChanged(const QString&)), this,
864 SLOT(OnFieldRangeChanged(const QString&)));
865 connect(m_desc_edit, SIGNAL(OnTextChanged(const QString&)), this,
866 SLOT(OnFieldDescChanged(const QString&)));
867 connect(m_enum_table, SIGNAL(itemActivated(QTableWidgetItem *)), this,
868 SLOT(OnFieldValueActivated(QTableWidgetItem *)));
869 connect(m_enum_table, SIGNAL(itemChanged(QTableWidgetItem *)), this,
870 SLOT(OnFieldValueChanged(QTableWidgetItem *)));
637} 871}
638 872
639void FieldEditPanel::UpdateDelegates() 873void RegFieldEditPanel::UpdateWidth()
640{ 874{
641 SocFieldItemDelegate *m_table_delegate = new SocFieldItemDelegate(m_ref.GetField(), this); 875 m_range_validator->setWidth(m_ref.reg().get()->width);
642 QItemEditorFactory *m_table_edit_factory = new QItemEditorFactory();
643 SocFieldEditorCreator *m_table_edit_creator = new SocFieldEditorCreator(m_ref.GetField());
644 m_table_edit_factory->registerEditor(QVariant::UInt, m_table_edit_creator);
645 m_table_delegate->setItemEditorFactory(m_table_edit_factory);
646 m_value_table->setItemDelegate(m_table_delegate);
647 m_value_table->resizeColumnsToContents();
648} 876}
649 877
650void FieldEditPanel::UpdateWarning(int row) 878void RegFieldEditPanel::OnFieldValueActivated(QTableWidgetItem *item)
651{ 879{
652 soc_word_t val = m_ref.GetField().value[row].value; 880 if(item->type() == RegFieldEditPanelDelType)
653 soc_word_t max = m_ref.GetField().bitmask() >> m_ref.GetField().first_bit;
654 QTableWidgetItem *item = m_value_table->item(row, FieldValueValueColumn);
655 if(val > max)
656 { 881 {
657 item->setIcon(QIcon::fromTheme("dialog-warning")); 882 int row = item->row();
658 item->setToolTip("Value is too big for the field"); 883 my_remove_at(m_ref.get()->enum_, row);
884 m_enum_table->removeRow(row);
885 OnModified();
659 } 886 }
660 else 887 else if(item->type() == RegFieldEditPanelAddType)
661 { 888 {
662 item->setIcon(QIcon()); 889 soc_desc::field_t& field = *m_ref.get();
663 item->setToolTip(""); 890 int row = field.enum_.size();
891 soc_desc::enum_t new_enum;
892 new_enum.id = GetFreshId(field.enum_);
893 new_enum.name = "UNNAMED";
894 new_enum.value = 0;
895 field.enum_.push_back(new_enum);
896 m_enum_table->insertRow(row);
897 QTableWidgetItem *item = new QTableWidgetItem(
898 QIcon::fromTheme("list-remove"), "", RegFieldEditPanelDelType);
899 item->setFlags(Qt::ItemIsEnabled);
900 m_enum_table->setItem(row, 0, item);
901 item = new QTableWidgetItem(QString::fromStdString(new_enum.name));
902 m_enum_table->setItem(row, 1, item);
903 item = new QTableWidgetItem();
904 item->setData(Qt::EditRole, QVariant(new_enum.value));
905 m_enum_table->setItem(row, 2, item);
906 item = new QTableWidgetItem(QString::fromStdString(new_enum.desc));
907 m_enum_table->setItem(row, 3, item);
908 OnModified();
664 } 909 }
665} 910}
666 911
667void FieldEditPanel::FillRow(int row, const soc_reg_field_value_t& val) 912void RegFieldEditPanel::OnFieldValueChanged(QTableWidgetItem *item)
668{ 913{
669 QTableWidgetItem *item = new QTableWidgetItem(QString::fromStdString(val.name)); 914 soc_desc::field_t& field = *m_ref.get();
670 item->setTextAlignment(Qt::AlignVCenter | Qt::AlignHCenter); 915 if((size_t)item->row() >= field.enum_.size())
671 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable); 916 return;
672 m_value_table->setItem(row, FieldValueNameColumn, item); 917 soc_desc::enum_t& enum_ = field.enum_[item->row()];
673 item = new QTableWidgetItem(); 918 if(item->column() == 1)
674 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable); 919 enum_.name = item->text().toStdString();
675 item->setData(Qt::DisplayRole, QVariant(val.value)); 920 else if(item->column() == 2)
676 m_value_table->setItem(row, FieldValueValueColumn, item); 921 enum_.value = item->data(Qt::EditRole).value< soc_word_t >();
677 item = new QTableWidgetItem(QString::fromStdString(val.desc)); 922 else if(item->column() == 3)
678 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsEditable); 923 enum_.desc = item->text().toStdString();
679 m_value_table->setItem(row, FieldValueDescColumn, item); 924 OnModified();
680 item = new QTableWidgetItem(QIcon::fromTheme("list-remove"), "", FieldValueDeleteType); 925}
681 item->setToolTip("Remove?"); 926
682 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); 927void RegFieldEditPanel::OnFieldNameChanged(const QString& name)
683 m_value_table->setItem(row, FieldValueIconColumn, item); 928{
684 UpdateWarning(row); 929 m_ref.get()->name = name.toStdString();
685} 930 OnModified();
686
687void FieldEditPanel::CreateNewRow(int row)
688{
689 QTableWidgetItem *item = new QTableWidgetItem(QIcon::fromTheme("list-add"), "", FieldValueNewType);
690 item->setToolTip("New?");
691 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
692 m_value_table->setItem(row, FieldValueIconColumn, item);
693 item = new QTableWidgetItem("New value...");
694 QFont font = item->font();
695 font.setItalic(true);
696 item->setFont(font);
697 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
698 m_value_table->setItem(row, FieldValueNameColumn, item);
699} 931}
700 932
701void FieldEditPanel::OnBitRangeEdited(const QString& input) 933void RegFieldEditPanel::OnFieldRangeChanged(const QString& range)
702{ 934{
703 const SocBitRangeValidator *validator = 935 soc_desc::field_t *field = m_ref.get();
704 dynamic_cast< const SocBitRangeValidator *>(m_bitrange_edit->validator()); 936 int last, first;
705 int first, last; 937 if(m_range_validator->parse(range, last, first) != QValidator::Acceptable)
706 QValidator::State state = validator->parse(input, last, first);
707 if(state != QValidator::Acceptable)
708 return; 938 return;
709 m_ref.GetField().first_bit = first; 939 field->pos = first;
710 m_ref.GetField().last_bit = last; 940 field->width = last - first + 1;
711 // update all warning signs 941 m_enum_delegate->setWidth(field->width);
712 for(size_t row = 0; row < m_ref.GetField().value.size(); row++) 942 m_enum_editor->setWidth(field->width);
713 UpdateWarning(row); 943 OnModified();
714 // also updates delegates because they now have the wrong view of the field
715 UpdateDelegates();
716 OnModified(true);
717} 944}
718 945
719void FieldEditPanel::OnNameEdited(const QString& text) 946void RegFieldEditPanel::OnFieldDescChanged(const QString& desc)
720{ 947{
721 m_ref.GetField().name = text.toStdString(); 948 m_ref.get()->desc = desc.toStdString();
722 OnModified(m_name_edit->isModified()); 949 OnModified();
723} 950}
724 951
725void FieldEditPanel::OnDescEdited() 952soc_desc::field_ref_t RegFieldEditPanel::GetField()
726{ 953{
727 m_ref.GetField().desc = m_desc_edit->GetTextHtml().toStdString(); 954 return m_ref;
728 OnModified(m_desc_edit->IsModified());
729} 955}
730 956
731void FieldEditPanel::OnValueActivated(int row, int column) 957/**
958 * RegEditPanel
959 */
960
961namespace
732{ 962{
733 if(column != 0) 963
734 return; 964enum
735 int type = m_value_table->item(row, column)->type(); 965{
736 if(type == FieldValueDeleteType) 966 RegVariantEditPanelDelType = QTableWidgetItem::UserType,
967 RegVariantEditPanelAddType,
968};
969
970}
971
972RegEditPanel::RegEditPanel(const soc_desc::register_ref_t& ref, QWidget *parent)
973 :QWidget(parent), m_ref(ref), m_reg_font(font())
974{
975 m_reg_font.setWeight(100);
976 m_reg_font.setKerning(false);
977
978 m_value_model = new RegFieldTableModel(this); // view takes ownership
979 m_value_model->SetRegister(*ref.get());
980 m_value_model->SetReadOnly(true);
981
982 m_sexy_display2 = new Unscroll<YRegDisplay>(this);
983 m_sexy_display2->setFont(m_reg_font);
984 m_sexy_display2->setModel(m_value_model);
985 m_sexy_display2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
986 m_sexy_display2->setContextMenuPolicy(Qt::CustomContextMenu);
987 m_sexy_display2->setWidth(m_ref.get()->width);
988
989 m_view_tab = new QTabWidget(this);
990 m_view_tab->setTabPosition(QTabWidget::West);
991
992 /* field tab */
993 m_fields_tab = new YTabWidget(0, this);
994 m_fields_tab->setTabOpenable(true);
995 std::vector< soc_desc::field_ref_t > field_list = m_ref.fields();
996 m_fields_tab->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding);
997 m_fields_tab->setTabsClosable(true);
998 m_fields_tab->setElideMode(Qt::ElideRight);
999 for(size_t i = 0; i < field_list.size(); i++)
737 { 1000 {
738 m_ref.GetField().value.erase(m_ref.GetField().value.begin() + row); 1001 RegFieldEditPanel *p = new RegFieldEditPanel(field_list[i], this);
739 m_value_table->removeRow(row); 1002 connect(p, SIGNAL(OnModified()), this, SLOT(OnFieldModified()));
740 OnModified(true); 1003 m_fields_tab->addTab(p, QString::fromStdString(field_list[i].get()->name));
741 } 1004 }
742 else if(type == FieldValueNewType) 1005
1006 m_reg_size_group = new QButtonGroup(this);
1007 QRadioButton *reg_size_32 = new QRadioButton("32-bit");
1008 QRadioButton *reg_size_16 = new QRadioButton("16-bit");
1009 QRadioButton *reg_size_8 = new QRadioButton("8-bit");
1010 m_reg_size_group->addButton(reg_size_32, 32);
1011 m_reg_size_group->addButton(reg_size_16, 16);
1012 m_reg_size_group->addButton(reg_size_8, 8);
1013 if(m_reg_size_group->button(m_ref.get()->width))
1014 m_reg_size_group->button(m_ref.get()->width)->click();
1015 QVBoxLayout *width_group_layout = new QVBoxLayout;
1016 width_group_layout->addWidget(reg_size_32);
1017 width_group_layout->addWidget(reg_size_16);
1018 width_group_layout->addWidget(reg_size_8);
1019 width_group_layout->addStretch(0);
1020 QGroupBox *width_group = new QGroupBox("Width");
1021 width_group->setLayout(width_group_layout);
1022
1023 m_variant_table = new QTableWidget;
1024 m_variant_table->setColumnCount(3);
1025 m_variant_table->setHorizontalHeaderItem(0, new QTableWidgetItem(""));
1026 m_variant_table->setHorizontalHeaderItem(1, new QTableWidgetItem("Type"));
1027 m_variant_table->setHorizontalHeaderItem(2, new QTableWidgetItem("Offset"));
1028 m_variant_table->verticalHeader()->setVisible(false);
1029 m_variant_table->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
1030 m_variant_delegate = new SocFieldItemDelegate(this);
1031 m_variant_delegate->setItemEditorFactory(new QItemEditorFactory);
1032 m_variant_editor = new SocFieldEditorCreator;
1033 m_variant_delegate->itemEditorFactory()->registerEditor(QVariant::UInt, m_variant_editor);
1034 m_variant_table->setItemDelegate(m_variant_delegate);
1035
1036 std::vector< soc_desc::variant_ref_t > variants = m_ref.variants();
1037 m_variant_table->setRowCount(variants.size() + 1);
1038 for(size_t i = 0; i < variants.size(); i++)
743 { 1039 {
744 m_value_table->insertRow(row); 1040 QTableWidgetItem *item = new QTableWidgetItem(
745 soc_reg_field_value_t val; 1041 QIcon::fromTheme("list-remove"), "", RegVariantEditPanelDelType);
746 val.name = QString("UNNAMED_%1").arg(row).toStdString(); 1042 item->setFlags(Qt::ItemIsEnabled);
747 val.value = 0; 1043 m_variant_table->setItem(i, 0, item);
748 m_ref.GetField().value.push_back(val); 1044 item = new QTableWidgetItem(QString::fromStdString(variants[i].get()->type));
749 FillRow(row, val); 1045 m_variant_table->setItem(i, 1, item);
1046 item = new QTableWidgetItem();
1047 item->setData(Qt::EditRole, QVariant(variants[i].get()->offset));
1048 m_variant_table->setItem(i, 2, item);
750 } 1049 }
1050 QTableWidgetItem *new_item = new QTableWidgetItem(
1051 QIcon::fromTheme("list-add"), "", RegVariantEditPanelAddType);
1052 new_item->setFlags(Qt::ItemIsEnabled);
1053 m_variant_table->setItem(variants.size(), 0, new_item);
1054 new_item = new QTableWidgetItem("New variant...");
1055 new_item->setFlags(Qt::ItemIsEnabled);
1056 QFont font = new_item->font();
1057 font.setItalic(true);
1058 new_item->setFont(font);
1059 m_variant_table->setItem(variants.size(), 1, new_item);
1060 new_item = new QTableWidgetItem();
1061 new_item->setFlags(Qt::ItemIsEnabled);
1062 m_variant_table->setItem(variants.size(), 2, new_item);
1063 new_item = new QTableWidgetItem();
1064 new_item->setFlags(Qt::ItemIsEnabled);
1065 m_variant_table->resizeColumnsToContents();
1066 m_variant_table->horizontalHeader()->setStretchLastSection(true);
1067
1068 m_desc_edit = new MyTextEditor(this);
1069 m_desc_edit->SetTextHtml(QString::fromStdString(ref.get()->desc));
1070
1071 QHBoxLayout *top_info_layout = new QHBoxLayout;
1072 top_info_layout->addWidget(width_group);
1073 top_info_layout->addWidget(Misc::EncloseInBox("Variants", m_variant_table));
1074 top_info_layout->addWidget(Misc::EncloseInBox("Description", m_desc_edit));
1075
1076 QWidget *reg_info = new QWidget(this);
1077 QVBoxLayout *reg_info_layout = new QVBoxLayout;
1078 reg_info_layout->addLayout(top_info_layout);
1079 reg_info_layout->addStretch(0);
1080 reg_info->setLayout(reg_info_layout);
1081
1082 m_view_tab->addTab(reg_info, "Information");
1083 m_view_tab->addTab(m_fields_tab, "Fields");
1084
1085 QVBoxLayout *main_layout = new QVBoxLayout;
1086 main_layout->addWidget(m_sexy_display2, 1);
1087 main_layout->addWidget(m_view_tab, 2);
1088
1089 m_delete_action = new QAction("&Delete", this);
1090 m_delete_action->setIcon(QIcon::fromTheme("list-remove"));
1091 m_new_action = new QAction("&New field", this);
1092 m_new_action->setIcon(QIcon::fromTheme("list-add"));
1093
1094 setLayout(main_layout);
1095
1096 OnRegFieldActivated(QModelIndex());
1097 UpdateWidthRestrictions();
1098
1099 connect(m_sexy_display2, SIGNAL(clicked(const QModelIndex&)), this,
1100 SLOT(OnRegFieldActivated(const QModelIndex&)));
1101 connect(m_sexy_display2, SIGNAL(customContextMenuRequested(QPoint)), this,
1102 SLOT(OnRegDisplayContextMenu(QPoint)));
1103 connect(m_reg_size_group, SIGNAL(buttonClicked(int)), this, SLOT(OnWidthChanged(int)));
1104 connect(m_delete_action, SIGNAL(triggered()), this, SLOT(OnRegFieldDelete()));
1105 connect(m_new_action, SIGNAL(triggered()), this, SLOT(OnRegFieldNew()));
1106 connect(m_variant_table, SIGNAL(itemActivated(QTableWidgetItem *)), this,
1107 SLOT(OnVariantActivated(QTableWidgetItem *)));
1108 connect(m_variant_table, SIGNAL(itemChanged(QTableWidgetItem *)), this,
1109 SLOT(OnVariantValueChanged(QTableWidgetItem *)));
1110 connect(m_desc_edit, SIGNAL(OnTextChanged()), this, SLOT(OnDescEdited()));
1111 connect(m_fields_tab, SIGNAL(tabCloseRequested(int)), this, SLOT(OnFieldRemove(int)));
1112 connect(m_fields_tab, SIGNAL(tabOpenRequested()), this, SLOT(OnFieldCreate()));
751} 1113}
752 1114
753void FieldEditPanel::OnValueChanged(int row, int column) 1115void RegEditPanel::UpdateWidthRestrictions()
754{ 1116{
755 /* ignore extra row for addition */ 1117 /* only allow width large enough to fit all fields */
756 if(row >= (int)m_ref.GetField().value.size()) 1118 size_t max_bit = 0;
757 return; 1119 std::vector< soc_desc::field_ref_t > field_list = m_ref.fields();
758 QTableWidgetItem *item = m_value_table->item(row, column); 1120 for(size_t i = 0; i < field_list.size(); i++)
759 if(column == FieldValueNameColumn)
760 m_ref.GetField().value[row].name = item->text().toStdString();
761 else if(column == FieldValueValueColumn)
762 { 1121 {
763 soc_word_t& fval = m_ref.GetField().value[row].value; 1122 soc_desc::field_t& f = *field_list[i].get();
764 soc_word_t new_val = item->data(Qt::DisplayRole).toUInt(); 1123 max_bit = std::max(max_bit, f.pos + f.width - 1);
765 /* avoid infinite recursion by calling UpdateWarning() when
766 * only the icon changes which would trigger this callback again */
767 if(fval != new_val)
768 {
769 fval = new_val;
770 UpdateWarning(row);
771 }
772 } 1124 }
773 else if(column == FieldValueDescColumn) 1125 /* update buttons */
774 m_ref.GetField().value[row].desc = item->text().toStdString(); 1126 m_reg_size_group->button(8)->setEnabled(max_bit < 8);
775 OnModified(true); 1127 m_reg_size_group->button(16)->setEnabled(max_bit < 16);
1128 m_reg_size_group->button(32)->setEnabled(max_bit < 32);
776} 1129}
777 1130
778namespace 1131int RegEditPanel::IndexById(soc_id_t id)
779{ 1132{
1133 for(int i = 0; i < m_fields_tab->count(); i++)
1134 {
1135 RegFieldEditPanel *p = dynamic_cast< RegFieldEditPanel * >(m_fields_tab->widget(i));
1136 if(p->GetField().get()->id == id)
1137 return i;
1138 }
1139 return -1;
1140}
780 1141
781enum 1142void RegEditPanel::OnWidthChanged(int w)
782{ 1143{
783 SocTreeSocType = QTreeWidgetItem::UserType, 1144 m_ref.get()->width = w;
784 SocTreeDevType, 1145 m_sexy_display2->setWidth(w);
785 SocTreeRegType, 1146 for(int i = 0; i < m_fields_tab->count(); i++)
786 SocTreeFieldType, 1147 dynamic_cast< RegFieldEditPanel * >(m_fields_tab->widget(i))->UpdateWidth();
787 SocTreeNewDevType, 1148 OnModified();
788 SocTreeNewRegType, 1149}
789 SocTreeNewFieldType,
790};
791
792/**
793 * SocTreeItem
794 */
795 1150
796class SocTreeItem : public QTreeWidgetItem 1151void RegEditPanel::OnDescEdited()
797{ 1152{
798public: 1153 m_ref.get()->desc = m_desc_edit->GetTextHtml().toStdString();
799 SocTreeItem(const QString& string, const SocRef& ref) 1154 OnModified();
800 :QTreeWidgetItem(QStringList(string), SocTreeSocType), m_ref(ref) {} 1155}
801 1156
802 const SocRef& GetRef() { return m_ref; } 1157void RegEditPanel::OnVariantActivated(QTableWidgetItem *item)
803private: 1158{
804 SocRef m_ref; 1159 if(item->type() == RegVariantEditPanelDelType)
805}; 1160 {
1161 int row = item->row();
1162 my_remove_at(m_ref.get()->variant, row);
1163 m_variant_table->removeRow(row);
1164 OnModified();
1165 }
1166 else if(item->type() == RegVariantEditPanelAddType)
1167 {
1168 int row = m_ref.get()->variant.size();
1169 soc_desc::variant_t& variant = *m_ref.create_variant().get();
1170 variant.type = "untyped";
1171 variant.offset = 0;
1172 m_variant_table->insertRow(row);
1173 QTableWidgetItem *item = new QTableWidgetItem(
1174 QIcon::fromTheme("list-remove"), "", RegVariantEditPanelDelType);
1175 item->setFlags(Qt::ItemIsEnabled);
1176 m_variant_table->setItem(row, 0, item);
1177 item = new QTableWidgetItem(QString::fromStdString(variant.type));
1178 m_variant_table->setItem(row, 1, item);
1179 item = new QTableWidgetItem();
1180 item->setData(Qt::EditRole, QVariant(variant.offset));
1181 m_variant_table->setItem(row, 2, item);
1182 OnModified();
1183 }
1184}
806 1185
807/** 1186void RegEditPanel::OnVariantValueChanged(QTableWidgetItem *item)
808 * NewDevTreeItem 1187{
809 */ 1188 soc_desc::register_t& reg = *m_ref.get();
1189 if((size_t)item->row() >= reg.variant.size())
1190 return;
1191 soc_desc::variant_t& var = reg.variant[item->row()];
1192 if(item->column() == 1)
1193 var.type = item->text().toStdString();
1194 else if(item->column() == 2)
1195 var.offset = item->data(Qt::EditRole).value< soc_word_t >();
1196 OnModified();
1197}
810 1198
811class NewDevTreeItem : public QTreeWidgetItem 1199void RegEditPanel::OnRegFieldActivated(const QModelIndex& index)
812{ 1200{
813public: 1201 if(!index.isValid())
814 NewDevTreeItem(const QString& string, const SocRef& ref) 1202 return;
815 :QTreeWidgetItem(QStringList(string), SocTreeNewDevType), m_ref(ref) {} 1203 m_fields_tab->setCurrentIndex(IndexById(m_ref.get()->field[index.row()].id));
1204 m_view_tab->setCurrentIndex(1);
1205}
816 1206
817 const SocRef& GetRef() { return m_ref; } 1207void RegEditPanel::OnFieldModified()
818private: 1208{
819 SocRef m_ref; 1209 int idx = m_fields_tab->currentIndex();
820}; 1210 RegFieldEditPanel *p = dynamic_cast< RegFieldEditPanel * >(m_fields_tab->widget(idx));
1211 m_fields_tab->setTabText(idx, QString::fromStdString(p->GetField().get()->name));
1212 DoModify();
1213}
821 1214
822/** 1215void RegEditPanel::DoModify()
823 * DevTreeItem 1216{
824 */ 1217 m_value_model->UpdateRegister(*m_ref.get());
1218 UpdateWidthRestrictions();
1219 OnModified();
1220}
825 1221
826class DevTreeItem : public QTreeWidgetItem 1222void RegEditPanel::OnRegFieldDelete()
827{ 1223{
828public: 1224 QModelIndex current = m_sexy_display2->currentIndex();
829 DevTreeItem(const QString& string, const SocDevRef& ref) 1225 if(!current.isValid())
830 :QTreeWidgetItem(QStringList(string), SocTreeDevType), m_ref(ref) {} 1226 return;
1227 QMessageBox msgbox(QMessageBox::Question, "Delete field ?",
1228 "Are you sure you want to delete this field ?",
1229 QMessageBox::Yes | QMessageBox::No, this);
1230 msgbox.setDefaultButton(QMessageBox::No);
1231 int ret = msgbox.exec();
1232 if(ret != QMessageBox::Yes)
1233 return;
1234 m_fields_tab->removeTab(IndexById(m_ref.get()->field[current.row()].id));
1235 my_remove_at(m_ref.get()->field, current.row());
1236 DoModify();
1237 OnRegFieldActivated(QModelIndex());
1238}
831 1239
832 const SocDevRef& GetRef() { return m_ref; } 1240void RegEditPanel::OnFieldRemove(int index)
833private: 1241{
834 SocDevRef m_ref; 1242 Q_UNUSED(index);
835}; 1243}
836 1244
837/** 1245int RegEditPanel::FindFreeBit(int preferred)
838 * NewRegTreeItem 1246{
839 */ 1247 int nr_bits = m_ref.get()->width;
1248 soc_word_t free_mask = (nr_bits == 32) ? 0xffffffff : (1 << nr_bits) - 1;
1249 soc_desc::register_t& reg = *m_ref.get();
1250 for(size_t i = 0; i < reg.field.size(); i++)
1251 free_mask &= ~reg.field[i].bitmask();
1252 /* any space ? */
1253 if(free_mask == 0)
1254 return -1;
1255 int closest_bit = -1;
1256 int closest_dist = nr_bits;
1257 for(int bit = 0; bit < nr_bits; bit++)
1258 {
1259 if(!(free_mask & (1 << bit)))
1260 continue;
1261 if(abs(bit - preferred) < closest_dist)
1262 {
1263 closest_bit = bit;
1264 closest_dist = abs(bit - preferred);
1265 }
1266 }
1267 return closest_bit;
1268}
840 1269
841class NewRegTreeItem : public QTreeWidgetItem 1270void RegEditPanel::OnRegFieldNew()
842{ 1271{
843public: 1272 int bit_col = m_sexy_display2->bitColumnAt(m_menu_point);
844 NewRegTreeItem(const QString& string, const SocDevRef& ref) 1273 /* we need to make sure the created field does not overlap something */
845 :QTreeWidgetItem(QStringList(string), SocTreeNewRegType), m_ref(ref) {} 1274 bit_col = FindFreeBit(bit_col);
1275 if(bit_col == -1)
1276 return; /* impossible to find a free position */
1277 soc_desc::field_ref_t ref = m_ref.create_field();
1278 soc_desc::field_t& field = *ref.get();
1279 field.pos = bit_col;
1280 field.width = 1;
1281 field.name = "UNNAMED";
846 1282
847 const SocDevRef& GetRef() { return m_ref; } 1283 RegFieldEditPanel *p = new RegFieldEditPanel(ref, this);
848private: 1284 connect(p, SIGNAL(OnModified()), this, SLOT(OnFieldModified()));
849 SocDevRef m_ref; 1285 m_fields_tab->addTab(p, QString::fromStdString(field.name));
850};
851 1286
852/** 1287 DoModify();
853 * RegTreeItem 1288}
854 */
855 1289
856class RegTreeItem : public QTreeWidgetItem 1290void RegEditPanel::OnFieldCreate()
857{ 1291{
858public: 1292 OnRegFieldNew();
859 RegTreeItem(const QString& string, const SocRegRef& ref) 1293}
860 :QTreeWidgetItem(QStringList(string), SocTreeRegType), m_ref(ref) {}
861
862 const SocRegRef& GetRef() { return m_ref; }
863private:
864 SocRegRef m_ref;
865};
866 1294
867/** 1295void RegEditPanel::OnRegDisplayContextMenu(QPoint point)
868 * NewFieldTreeItem 1296{
869 */ 1297 m_menu_point = point;
1298 QMenu *menu = new QMenu(this);
1299 QModelIndex item = m_sexy_display2->indexAt(point);
1300 menu->addAction(m_new_action);
1301 if(item.isValid())
1302 menu->addAction(m_delete_action);
1303 menu->popup(m_sexy_display2->viewport()->mapToGlobal(point));
1304}
870 1305
871class NewFieldTreeItem : public QTreeWidgetItem 1306namespace
872{ 1307{
873public:
874 NewFieldTreeItem(const QString& string, const SocRegRef& ref)
875 :QTreeWidgetItem(QStringList(string), SocTreeNewFieldType), m_ref(ref) {}
876 1308
877 const SocRegRef& GetRef() { return m_ref; } 1309enum
878private: 1310{
879 SocRegRef m_ref; 1311 SocTreeSocType = QTreeWidgetItem::UserType, // SocRefRole -> node_ref_t to root
1312 SocTreeNodeType, // SocRefRole -> node_ref_t
1313 SocTreeRegType, // SocRefRole -> register_ref_t
880}; 1314};
881 1315
882/** 1316enum
883 * FieldTreeItem 1317{
884 */ 1318 SocRefRole = Qt::UserRole,
1319};
885 1320
886class FieldTreeItem : public QTreeWidgetItem 1321template<typename T>
1322T SocTreeItemVal(QTreeWidgetItem *item)
887{ 1323{
888public: 1324 return item->data(0, SocRefRole).value<T>();
889 FieldTreeItem(const QString& string, const SocFieldRef& ref) 1325}
890 :QTreeWidgetItem(QStringList(string), SocTreeFieldType), m_ref(ref) {}
891 1326
892 const SocFieldRef& GetRef() { return m_ref; } 1327template<typename T>
893private: 1328QTreeWidgetItem *MakeSocTreeItem(int type, const T& val)
894 SocFieldRef m_ref; 1329{
895}; 1330 QTreeWidgetItem *item = new QTreeWidgetItem(type);
1331 item->setData(0, SocRefRole, QVariant::fromValue(val));
1332 return item;
1333}
896 1334
897} 1335}
898 1336
@@ -903,8 +1341,7 @@ RegEdit::RegEdit(Backend *backend, QWidget *parent)
903 :QWidget(parent), m_backend(backend) 1341 :QWidget(parent), m_backend(backend)
904{ 1342{
905 QVBoxLayout *m_vert_layout = new QVBoxLayout(); 1343 QVBoxLayout *m_vert_layout = new QVBoxLayout();
906 m_file_group = new QGroupBox("File selection", this); 1344 QLabel *file_static = new QLabel("File:");
907 QHBoxLayout *m_file_group_layout = new QHBoxLayout();
908 m_file_edit = new QLineEdit(this); 1345 m_file_edit = new QLineEdit(this);
909 m_file_edit->setReadOnly(true); 1346 m_file_edit->setReadOnly(true);
910 m_file_open = new QToolButton(this); 1347 m_file_open = new QToolButton(this);
@@ -913,33 +1350,53 @@ RegEdit::RegEdit(Backend *backend, QWidget *parent)
913 m_file_open->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); 1350 m_file_open->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
914 QMenu *file_open_menu = new QMenu(this); 1351 QMenu *file_open_menu = new QMenu(this);
915 QAction *new_act = file_open_menu->addAction(QIcon::fromTheme("document-new"), "New..."); 1352 QAction *new_act = file_open_menu->addAction(QIcon::fromTheme("document-new"), "New...");
1353 m_file_open->setPopupMode(QToolButton::MenuButtonPopup);
916 m_file_open->setMenu(file_open_menu); 1354 m_file_open->setMenu(file_open_menu);
917 1355
918 m_file_save = new QToolButton(this); 1356 m_file_save = new QToolButton(this);
919 m_file_save->setText("Save"); 1357 m_file_save->setText("Save");
920 m_file_save->setIcon(QIcon::fromTheme("document-save")); 1358 m_file_save->setIcon(QIcon::fromTheme("document-save"));
921 m_file_save->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); 1359 m_file_save->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
1360 m_file_save->setPopupMode(QToolButton::MenuButtonPopup);
922 QMenu *file_save_menu = new QMenu(this); 1361 QMenu *file_save_menu = new QMenu(this);
923 QAction *saveas_act = file_save_menu->addAction(QIcon::fromTheme("document-save-as"), "Save as..."); 1362 QAction *saveas_act = file_save_menu->addAction(QIcon::fromTheme("document-save-as"), "Save as...");
924 m_file_save->setMenu(file_save_menu); 1363 m_file_save->setMenu(file_save_menu);
925 m_file_group_layout->addWidget(m_file_open); 1364
926 m_file_group_layout->addWidget(m_file_save); 1365 QHBoxLayout *file_group_layout = new QHBoxLayout();
927 m_file_group_layout->addWidget(m_file_edit); 1366 file_group_layout->addWidget(m_file_open);
1367 file_group_layout->addWidget(m_file_save);
1368 file_group_layout->addWidget(file_static);
1369 file_group_layout->addWidget(m_file_edit);
928 1370
929 m_splitter = new QSplitter(this); 1371 m_splitter = new QSplitter(this);
930 m_soc_tree = new QTreeWidget(this); 1372 m_soc_tree = new QTreeWidget(this);
931 m_soc_tree->setColumnCount(1); 1373 m_soc_tree->setColumnCount(1);
932 m_soc_tree->setHeaderLabel(QString("Name")); 1374 m_soc_tree->setHeaderLabel(QString("Name"));
933 m_soc_tree->setContextMenuPolicy(Qt::ActionsContextMenu); 1375 m_soc_tree->setContextMenuPolicy(Qt::CustomContextMenu);
934 QAction *soc_tree_delete_action = new QAction("&Delete", this); 1376
935 soc_tree_delete_action->setIcon(QIcon::fromTheme("list-remove")); 1377 m_delete_action = new QAction("&Delete", this);
936 connect(soc_tree_delete_action, SIGNAL(triggered()), this, SLOT(OnSocItemDelete())); 1378 m_delete_action->setIcon(QIcon::fromTheme("list-remove"));
937 m_soc_tree->addAction(soc_tree_delete_action); 1379 m_new_action = new QAction("&New", this);
1380 m_new_action->setIcon(QIcon::fromTheme("list-add"));
1381 m_create_action = new QAction("&Create register", this);
1382 m_create_action->setIcon(QIcon::fromTheme("folder-new"));
1383
938 m_splitter->addWidget(m_soc_tree); 1384 m_splitter->addWidget(m_soc_tree);
939 m_splitter->setStretchFactor(0, 0); 1385 m_splitter->setStretchFactor(0, 0);
940 1386
941 m_file_group->setLayout(m_file_group_layout); 1387 m_msg = new MessageWidget(this);
942 m_vert_layout->addWidget(m_file_group); 1388 QWidget *splitter_right = new QWidget(this);
1389 m_right_panel_layout = new QVBoxLayout;
1390 m_right_panel_layout->addWidget(m_msg, 0);
1391 splitter_right->setLayout(m_right_panel_layout);
1392 m_splitter->addWidget(splitter_right);
1393 m_splitter->setStretchFactor(1, 2);
1394
1395 m_msg_welcome_id = SetMessage(MessageWidget::Information,
1396 "Open a description file to edit, or create a new file from scratch.");
1397 m_msg_name_error_id = 0;
1398
1399 m_vert_layout->addLayout(file_group_layout);
943 m_vert_layout->addWidget(m_splitter, 1); 1400 m_vert_layout->addWidget(m_splitter, 1);
944 1401
945 setLayout(m_vert_layout); 1402 setLayout(m_vert_layout);
@@ -949,14 +1406,17 @@ RegEdit::RegEdit(Backend *backend, QWidget *parent)
949 SetPanel(new EmptyEditPanel(this)); 1406 SetPanel(new EmptyEditPanel(this));
950 UpdateTabName(); 1407 UpdateTabName();
951 1408
1409 connect(m_soc_tree, SIGNAL(customContextMenuRequested(QPoint)), this,
1410 SLOT(OnSocTreeContextMenu(QPoint)));
1411 connect(m_delete_action, SIGNAL(triggered()), this, SLOT(OnSocItemDelete()));
1412 connect(m_new_action, SIGNAL(triggered()), this, SLOT(OnSocItemNew()));
1413 connect(m_create_action, SIGNAL(triggered()), this, SLOT(OnSocItemCreate()));
952 connect(m_file_open, SIGNAL(clicked()), this, SLOT(OnOpen())); 1414 connect(m_file_open, SIGNAL(clicked()), this, SLOT(OnOpen()));
953 connect(m_file_save, SIGNAL(clicked()), this, SLOT(OnSave())); 1415 connect(m_file_save, SIGNAL(clicked()), this, SLOT(OnSave()));
954 connect(new_act, SIGNAL(triggered()), this, SLOT(OnNew())); 1416 connect(new_act, SIGNAL(triggered()), this, SLOT(OnNew()));
955 connect(saveas_act, SIGNAL(triggered()), this, SLOT(OnSaveAs())); 1417 connect(saveas_act, SIGNAL(triggered()), this, SLOT(OnSaveAs()));
956 connect(m_soc_tree, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)), 1418 connect(m_soc_tree, SIGNAL(currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)),
957 this, SLOT(OnSocItemChanged(QTreeWidgetItem*, QTreeWidgetItem*))); 1419 this, SLOT(OnSocItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)));
958 connect(m_soc_tree, SIGNAL(itemActivated(QTreeWidgetItem*, int)),
959 this, SLOT(OnSocItemActivated(QTreeWidgetItem*, int)));
960} 1420}
961 1421
962QWidget *RegEdit::GetWidget() 1422QWidget *RegEdit::GetWidget()
@@ -968,6 +1428,16 @@ RegEdit::~RegEdit()
968{ 1428{
969} 1429}
970 1430
1431int RegEdit::SetMessage(MessageWidget::MessageType type, const QString& msg)
1432{
1433 return m_msg->SetMessage(type, msg);
1434}
1435
1436void RegEdit::HideMessage(int id)
1437{
1438 m_msg->HideMessage(id);
1439}
1440
971void RegEdit::OnSave() 1441void RegEdit::OnSave()
972{ 1442{
973 SaveSoc(); 1443 SaveSoc();
@@ -1007,7 +1477,10 @@ bool RegEdit::GetFilename(QString& filename, bool save)
1007 QFileDialog *fd = new QFileDialog(this); 1477 QFileDialog *fd = new QFileDialog(this);
1008 if(save) 1478 if(save)
1009 fd->setAcceptMode(QFileDialog::AcceptSave); 1479 fd->setAcceptMode(QFileDialog::AcceptSave);
1010 fd->setFilter("Description files (*.xml);;All files (*)"); 1480 QStringList filters;
1481 filters << "Description files (*.xml)";
1482 filters << "All files (*)";
1483 fd->setNameFilters(filters);
1011 fd->setDirectory(Settings::Get()->value("regedit/loaddescdir", QDir::currentPath()).toString()); 1484 fd->setDirectory(Settings::Get()->value("regedit/loaddescdir", QDir::currentPath()).toString());
1012 if(fd->exec()) 1485 if(fd->exec())
1013 { 1486 {
@@ -1051,15 +1524,15 @@ void RegEdit::OnNew()
1051 1524
1052bool RegEdit::SaveSocFile(const QString& filename) 1525bool RegEdit::SaveSocFile(const QString& filename)
1053{ 1526{
1054 normalize(m_cur_socfile.GetSoc()); 1527 soc_desc::error_context_t ctx;
1055 if(!produce_xml(filename.toStdString(), m_cur_socfile.GetSoc())) 1528 soc_desc::normalize(m_cur_socfile.GetSoc());
1529 if(!soc_desc::produce_xml(filename.toStdString(), m_cur_socfile.GetSoc(), ctx))
1056 { 1530 {
1057 QMessageBox::warning(this, "The description was not saved", 1531 QMessageBox::warning(this, "The description was not saved",
1058 "There was an error when saving the file"); 1532 "There was an error when saving the file");
1059 return false; 1533 return false;
1060 } 1534 }
1061 m_soc_tree->clear(); 1535 UpdateSocFile();
1062 FillSocTree();
1063 SetModified(false, false); 1536 SetModified(false, false);
1064 return true; 1537 return true;
1065} 1538}
@@ -1086,91 +1559,39 @@ void RegEdit::LoadSocFile(const QString& filename)
1086 SetModified(false, false); 1559 SetModified(false, false);
1087 UpdateSocFile(); 1560 UpdateSocFile();
1088 UpdateTabName(); 1561 UpdateTabName();
1562 m_msg_welcome_id = SetMessage(MessageWidget::Information,
1563 "Select items to edit in tree, or right-click on them to see available actions.");
1089} 1564}
1090 1565
1091void RegEdit::CreateNewFieldItem(QTreeWidgetItem *_parent) 1566void RegEdit::FillNodeTreeItem(QTreeWidgetItem *item)
1092{
1093 RegTreeItem *parent = dynamic_cast< RegTreeItem* >(_parent);
1094 NewFieldTreeItem *newdev_item = new NewFieldTreeItem("New field...", parent->GetRef());
1095 MakeItalic(newdev_item, true);
1096 newdev_item->setIcon(0, QIcon::fromTheme("list-add"));
1097 parent->addChild(newdev_item);
1098}
1099
1100void RegEdit::FillRegTreeItem(QTreeWidgetItem *_item)
1101{
1102 RegTreeItem *item = dynamic_cast< RegTreeItem* >(_item);
1103 const soc_reg_t& reg = item->GetRef().GetReg();
1104 for(size_t i = 0; i < reg.field.size(); i++)
1105 {
1106 const soc_reg_field_t& field = reg.field[i];
1107 FieldTreeItem *field_item = new FieldTreeItem(QString::fromStdString(field.name),
1108 SocFieldRef(item->GetRef(), i));
1109 FixupEmptyItem(field_item);
1110 item->addChild(field_item);
1111 }
1112 CreateNewFieldItem(item);
1113}
1114
1115void RegEdit::CreateNewRegisterItem(QTreeWidgetItem *_parent)
1116{
1117 DevTreeItem *parent = dynamic_cast< DevTreeItem* >(_parent);
1118 NewRegTreeItem *newdev_item = new NewRegTreeItem("New register...", parent->GetRef());
1119 MakeItalic(newdev_item, true);
1120 newdev_item->setIcon(0, QIcon::fromTheme("list-add"));
1121 parent->addChild(newdev_item);
1122}
1123
1124void RegEdit::FillDevTreeItem(QTreeWidgetItem *_item)
1125{ 1567{
1126 DevTreeItem *item = dynamic_cast< DevTreeItem* >(_item); 1568 soc_desc::node_ref_t node = SocTreeItemVal< soc_desc::node_ref_t >(item);
1127 const soc_dev_t& dev = item->GetRef().GetDev(); 1569 soc_desc::register_ref_t reg = node.reg();
1128 for(size_t i = 0; i < dev.reg.size(); i++) 1570 /* put register if there, otherwise offer to create one */
1571 if(reg.valid() && reg.node() == node)
1129 { 1572 {
1130 const soc_reg_t& reg = dev.reg[i]; 1573 QTreeWidgetItem *reg_item = MakeSocTreeItem(SocTreeRegType, reg);
1131 RegTreeItem *reg_item = new RegTreeItem(QString::fromStdString(reg.name), 1574 FixupItem(reg_item);
1132 SocRegRef(item->GetRef(), i, -1));
1133 FixupEmptyItem(reg_item);
1134 FillRegTreeItem(reg_item);
1135 item->addChild(reg_item); 1575 item->addChild(reg_item);
1136 } 1576 }
1137 CreateNewRegisterItem(item); 1577 std::vector< soc_desc::node_ref_t > list = node.children();
1138} 1578 for(size_t i = 0; i < list.size(); i++)
1139
1140void RegEdit::CreateNewDeviceItem(QTreeWidgetItem *_parent)
1141{
1142 SocTreeItem *parent = dynamic_cast< SocTreeItem* >(_parent);
1143 NewDevTreeItem *newdev_item = new NewDevTreeItem("New device...", parent->GetRef());
1144 MakeItalic(newdev_item, true);
1145 newdev_item->setIcon(0, QIcon::fromTheme("list-add"));
1146 parent->addChild(newdev_item);
1147}
1148
1149void RegEdit::FillSocTreeItem(QTreeWidgetItem *_item)
1150{
1151 SocTreeItem *item = dynamic_cast< SocTreeItem* >(_item);
1152 const soc_t& soc = item->GetRef().GetSoc();
1153 for(size_t i = 0; i < soc.dev.size(); i++)
1154 { 1579 {
1155 const soc_dev_t& reg = soc.dev[i]; 1580 QTreeWidgetItem *node_item = MakeSocTreeItem(SocTreeNodeType, list[i]);
1156 DevTreeItem *dev_item = new DevTreeItem(QString::fromStdString(reg.name), 1581 FixupItem(node_item);
1157 SocDevRef(item->GetRef(), i, -1)); 1582 FillNodeTreeItem(node_item);
1158 FixupEmptyItem(dev_item); 1583 item->addChild(node_item);
1159 FillDevTreeItem(dev_item);
1160 item->addChild(dev_item);
1161 } 1584 }
1162 CreateNewDeviceItem(item);
1163} 1585}
1164 1586
1165void RegEdit::FillSocTree() 1587void RegEdit::FillSocTree()
1166{ 1588{
1167 SocRef ref = m_cur_socfile.GetSocRef(); 1589 soc_desc::soc_ref_t ref = m_cur_socfile.GetSocRef();
1168 SocTreeItem *soc_item = new SocTreeItem( 1590 QTreeWidgetItem *root_item = MakeSocTreeItem(SocTreeSocType, ref.root());
1169 QString::fromStdString(ref.GetSoc().name), ref); 1591 FixupItem(root_item);
1170 FixupEmptyItem(soc_item); 1592 FillNodeTreeItem(root_item);
1171 FillSocTreeItem(soc_item); 1593 m_soc_tree->addTopLevelItem(root_item);
1172 m_soc_tree->addTopLevelItem(soc_item); 1594 root_item->setExpanded(true);
1173 soc_item->setExpanded(true);
1174} 1595}
1175 1596
1176void RegEdit::MakeItalic(QTreeWidgetItem *item, bool it) 1597void RegEdit::MakeItalic(QTreeWidgetItem *item, bool it)
@@ -1180,17 +1601,46 @@ void RegEdit::MakeItalic(QTreeWidgetItem *item, bool it)
1180 item->setFont(0, font); 1601 item->setFont(0, font);
1181} 1602}
1182 1603
1183void RegEdit::FixupEmptyItem(QTreeWidgetItem *item) 1604QIcon RegEdit::GetIconFromType(int type)
1605{
1606 switch(type)
1607 {
1608 case SocTreeSocType: return QIcon::fromTheme("computer");
1609 case SocTreeNodeType: return QIcon::fromTheme("cpu");
1610 case SocTreeRegType: return style()->standardIcon(QStyle::SP_ArrowRight);
1611 default: return QIcon();
1612 }
1613}
1614
1615bool RegEdit::ValidateName(const QString& name)
1184{ 1616{
1185 if(item->text(0).size() == 0) 1617 if(name.size() == 0)
1618 return false;
1619 for(int i = 0; i < name.size(); i++)
1620 if(!name[i].isLetterOrNumber() && name[i] != QChar('_'))
1621 return false;
1622 return true;
1623}
1624
1625void RegEdit::FixupItem(QTreeWidgetItem *item)
1626{
1627 UpdateName(item);
1628 if(!ValidateName(item->text(0)))
1186 { 1629 {
1187 item->setIcon(0, QIcon::fromTheme("dialog-error")); 1630 item->setIcon(0, QIcon::fromTheme("dialog-error"));
1188 MakeItalic(item, true); 1631 if(item->text(0).size() == 0)
1189 item->setText(0, "Unnamed"); 1632 {
1633 MakeItalic(item, true);
1634 item->setText(0, "Unnamed");
1635 }
1636 m_msg_name_error_id = SetMessage(MessageWidget::Error,
1637 "The item name is invalid. It must be non-empty and consists only "
1638 "of alphanumerical or underscore characters");
1190 } 1639 }
1191 else 1640 else
1192 { 1641 {
1193 item->setIcon(0, QIcon::fromTheme("cpu")); 1642 HideMessage(m_msg_name_error_id);
1643 item->setIcon(0, GetIconFromType(item->type()));
1194 MakeItalic(item, false); 1644 MakeItalic(item, false);
1195 } 1645 }
1196} 1646}
@@ -1206,9 +1656,9 @@ void RegEdit::SetPanel(QWidget *panel)
1206{ 1656{
1207 delete m_right_panel; 1657 delete m_right_panel;
1208 m_right_panel = panel; 1658 m_right_panel = panel;
1209 connect(m_right_panel, SIGNAL(OnModified(bool)), this, SLOT(OnSocModified(bool))); 1659 connect(m_right_panel, SIGNAL(OnModified()), this,
1210 m_splitter->addWidget(m_right_panel); 1660 SLOT(OnSocModified()));
1211 m_splitter->setStretchFactor(1, 2); 1661 m_right_panel_layout->addWidget(m_right_panel, 1);
1212} 1662}
1213 1663
1214void RegEdit::SetModified(bool add, bool mod) 1664void RegEdit::SetModified(bool add, bool mod)
@@ -1217,15 +1667,33 @@ void RegEdit::SetModified(bool add, bool mod)
1217 OnModified(mod); 1667 OnModified(mod);
1218} 1668}
1219 1669
1220namespace 1670void RegEdit::OnSocItemNew()
1221{
1222
1223template< typename T >
1224void my_remove_at(std::vector< T >& v, size_t at)
1225{ 1671{
1226 v.erase(v.begin() + at); 1672 QTreeWidgetItem *current = m_soc_tree->currentItem();
1673 if(current == 0)
1674 return;
1675 soc_desc::node_ref_t node = SocTreeItemVal< soc_desc::node_ref_t >(current);
1676 node = node.create();
1677 node.get()->name = "unnamed";
1678 QTreeWidgetItem *node_item = MakeSocTreeItem(SocTreeNodeType, node);
1679 FixupItem(node_item);
1680 current->addChild(node_item);
1681 m_soc_tree->setCurrentItem(node_item);
1227} 1682}
1228 1683
1684void RegEdit::OnSocItemCreate()
1685{
1686 QTreeWidgetItem *current = m_soc_tree->currentItem();
1687 if(current == 0)
1688 return;
1689 soc_desc::register_t reg;
1690 reg.width = 32;
1691 soc_desc::node_ref_t node = SocTreeItemVal< soc_desc::node_ref_t >(current);
1692 node.get()->register_.push_back(reg);
1693 QTreeWidgetItem *reg_item = MakeSocTreeItem(SocTreeRegType, node.reg());
1694 FixupItem(reg_item);
1695 current->insertChild(0, reg_item);
1696 m_soc_tree->setCurrentItem(reg_item);
1229} 1697}
1230 1698
1231void RegEdit::OnSocItemDelete() 1699void RegEdit::OnSocItemDelete()
@@ -1242,172 +1710,116 @@ void RegEdit::OnSocItemDelete()
1242 return; 1710 return;
1243 if(current->type() == SocTreeSocType) 1711 if(current->type() == SocTreeSocType)
1244 { 1712 {
1245 SocTreeItem *item = dynamic_cast< SocTreeItem * >(current); 1713 SocTreeItemVal< soc_desc::node_ref_t >(current).remove();
1246 item->GetRef().GetSoc().dev.clear(); 1714 current->takeChildren();
1247 item->takeChildren(); 1715 OnSocModified();
1248 FillSocTreeItem(item);
1249 m_soc_tree->expandItem(item);
1250 } 1716 }
1251 else if(current->type() == SocTreeDevType) 1717 else if(current->type() == SocTreeNodeType)
1252 { 1718 {
1253 DevTreeItem *item = dynamic_cast< DevTreeItem * >(current); 1719 SocTreeItemVal< soc_desc::node_ref_t >(current).remove();
1254 my_remove_at(item->GetRef().GetSoc().dev, item->GetRef().GetDevIndex()); 1720 current->parent()->removeChild(current);
1255 QTreeWidgetItem *parent = item->parent(); 1721 OnSocModified();
1256 parent->takeChildren();
1257 FillSocTreeItem(parent);
1258 m_soc_tree->expandItem(parent);
1259 } 1722 }
1260 else if(current->type() == SocTreeRegType) 1723 else if(current->type() == SocTreeRegType)
1261 { 1724 {
1262 RegTreeItem *item = dynamic_cast< RegTreeItem * >(current); 1725 SocTreeItemVal< soc_desc::register_ref_t >(current).remove();
1263 my_remove_at(item->GetRef().GetDev().reg, item->GetRef().GetRegIndex()); 1726 current->parent()->removeChild(current);
1264 QTreeWidgetItem *parent = item->parent(); 1727 OnSocModified();
1265 parent->takeChildren();
1266 FillDevTreeItem(parent);
1267 m_soc_tree->expandItem(parent);
1268 }
1269 else if(current->type() == SocTreeFieldType)
1270 {
1271 FieldTreeItem *item = dynamic_cast< FieldTreeItem * >(current);
1272 my_remove_at(item->GetRef().GetReg().field, item->GetRef().GetFieldIndex());
1273 QTreeWidgetItem *parent = item->parent();
1274 parent->takeChildren();
1275 FillRegTreeItem(parent);
1276 m_soc_tree->expandItem(parent);
1277 } 1728 }
1278} 1729}
1279 1730
1280void RegEdit::OnSocModified(bool modified) 1731void RegEdit::OnSocModified()
1281{ 1732{
1282 // we might need to update the name in the tree 1733 // we might need to update the name in the tree
1283 UpdateName(m_soc_tree->currentItem()); 1734 FixupItem(m_soc_tree->currentItem());
1284 if(modified) 1735 SetModified(true, true);
1285 SetModified(true, true);
1286} 1736}
1287 1737
1288void RegEdit::DisplaySoc(SocRef ref) 1738void RegEdit::DisplaySoc(const soc_desc::soc_ref_t& ref)
1289{ 1739{
1290 SetPanel(new SocEditPanel(ref, this)); 1740 SetPanel(new SocEditPanel(ref, this));
1291} 1741}
1292 1742
1293void RegEdit::DisplayDev(SocDevRef ref) 1743void RegEdit::DisplayNode(const soc_desc::node_ref_t& ref)
1294{ 1744{
1295 SetPanel(new DevEditPanel(ref, this)); 1745 SetPanel(new NodeEditPanel(ref, this));
1296} 1746}
1297 1747
1298void RegEdit::DisplayReg(SocRegRef ref) 1748void RegEdit::DisplayReg(const soc_desc::register_ref_t& ref)
1299{ 1749{
1300 SetPanel(new RegEditPanel(ref, this)); 1750 SetPanel(new RegEditPanel(ref, this));
1301} 1751}
1302 1752
1303void RegEdit::DisplayField(SocFieldRef ref)
1304{
1305 SetPanel(new FieldEditPanel(ref, this));
1306}
1307
1308void RegEdit::UpdateName(QTreeWidgetItem *current) 1753void RegEdit::UpdateName(QTreeWidgetItem *current)
1309{ 1754{
1310 if(current == 0) 1755 if(current == 0)
1311 return; 1756 return;
1757
1312 if(current->type() == SocTreeSocType) 1758 if(current->type() == SocTreeSocType)
1313 { 1759 {
1314 SocTreeItem *item = dynamic_cast< SocTreeItem * >(current); 1760 current->setText(0, QString::fromStdString(
1315 item->setText(0, QString::fromStdString(item->GetRef().GetSoc().name)); 1761 SocTreeItemVal< soc_desc::node_ref_t >(current).soc().get()->name));
1316 } 1762 }
1317 else if(current->type() == SocTreeDevType) 1763 else if(current->type() == SocTreeNodeType)
1318 { 1764 {
1319 DevTreeItem *item = dynamic_cast< DevTreeItem * >(current); 1765 current->setText(0, QString::fromStdString(
1320 item->setText(0, QString::fromStdString(item->GetRef().GetDev().name)); 1766 SocTreeItemVal< soc_desc::node_ref_t >(current).get()->name));
1321 } 1767 }
1322 else if(current->type() == SocTreeRegType) 1768 else if(current->type() == SocTreeRegType)
1323 { 1769 {
1324 RegTreeItem *item = dynamic_cast< RegTreeItem * >(current); 1770 current->setText(0, "register");
1325 item->setText(0, QString::fromStdString(item->GetRef().GetReg().name));
1326 }
1327 else if(current->type() == SocTreeFieldType)
1328 {
1329 FieldTreeItem *item = dynamic_cast< FieldTreeItem * >(current);
1330 item->setText(0, QString::fromStdString(item->GetRef().GetField().name));
1331 } 1771 }
1332 FixupEmptyItem(current);
1333} 1772}
1334 1773
1335void RegEdit::OnSocItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous) 1774void RegEdit::OnSocTreeContextMenu(QPoint point)
1336{ 1775{
1337 Q_UNUSED(previous); 1776 HideMessage(m_msg_welcome_id);
1338 if(current == 0) 1777 QTreeWidgetItem *item = m_soc_tree->itemAt(point);
1778 if(item == 0)
1339 return; 1779 return;
1340 if(current->type() == SocTreeSocType) 1780 /* customise messages with item */
1341 { 1781 m_action_item = item;
1342 SocTreeItem *item = dynamic_cast< SocTreeItem * >(current); 1782 QMenu *menu = new QMenu(this);
1343 DisplaySoc(item->GetRef()); 1783 switch(item->type())
1344 }
1345 else if(current->type() == SocTreeDevType)
1346 { 1784 {
1347 DevTreeItem *item = dynamic_cast< DevTreeItem * >(current); 1785 case SocTreeSocType:
1348 DisplayDev(item->GetRef()); 1786 m_new_action->setText("New node...");
1349 } 1787 m_delete_action->setText("Delete all nodes...");
1350 else if(current->type() == SocTreeRegType) 1788 menu->addAction(m_new_action);
1351 { 1789 menu->addAction(m_delete_action);
1352 RegTreeItem *item = dynamic_cast< RegTreeItem * >(current); 1790 break;
1353 DisplayReg(item->GetRef()); 1791 case SocTreeNodeType:
1354 } 1792 {
1355 else if(current->type() == SocTreeFieldType) 1793 m_new_action->setText("New node...");
1356 { 1794 m_delete_action->setText("Delete node...");
1357 FieldTreeItem *item = dynamic_cast< FieldTreeItem * >(current); 1795 soc_desc::node_ref_t node = SocTreeItemVal< soc_desc::node_ref_t >(item);
1358 DisplayField(item->GetRef()); 1796 if(node.reg().node() != node)
1797 menu->addAction(m_create_action);
1798 menu->addAction(m_new_action);
1799 menu->addAction(m_delete_action);
1800 break;
1801 }
1802 case SocTreeRegType:
1803 m_delete_action->setText("Delete register...");
1804 menu->addAction(m_new_action);
1805 menu->addAction(m_delete_action);
1806 break;
1359 } 1807 }
1808 menu->popup(m_soc_tree->viewport()->mapToGlobal(point));
1360} 1809}
1361 1810
1362void RegEdit::OnSocItemActivated(QTreeWidgetItem *current, int column) 1811void RegEdit::OnSocItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous)
1363{ 1812{
1364 Q_UNUSED(column); 1813 Q_UNUSED(previous);
1814 HideMessage(m_msg_welcome_id);
1365 if(current == 0) 1815 if(current == 0)
1366 return; 1816 return;
1367 if(current->type() == SocTreeNewDevType) 1817 if(current->type() == SocTreeSocType)
1368 AddDevice(current); 1818 DisplaySoc(SocTreeItemVal< soc_desc::node_ref_t >(current).soc());
1369 else if(current->type() == SocTreeNewRegType) 1819 else if(current->type() == SocTreeNodeType)
1370 AddRegister(current); 1820 DisplayNode(SocTreeItemVal< soc_desc::node_ref_t >(current));
1371 else if(current->type() == SocTreeNewFieldType) 1821 else if(current->type() == SocTreeRegType)
1372 AddField(current); 1822 DisplayReg(SocTreeItemVal< soc_desc::register_ref_t >(current));
1373}
1374
1375void RegEdit::AddDevice(QTreeWidgetItem *_item)
1376{
1377 NewDevTreeItem *item = dynamic_cast< NewDevTreeItem * >(_item);
1378 item->GetRef().GetSoc().dev.push_back(soc_dev_t());
1379 DevTreeItem *dev_item = new DevTreeItem("",
1380 SocDevRef(item->GetRef(), item->GetRef().GetSoc().dev.size() - 1, -1));
1381 FixupEmptyItem(dev_item);
1382 item->parent()->insertChild(item->parent()->indexOfChild(item), dev_item);
1383 CreateNewRegisterItem(dev_item);
1384 m_soc_tree->setCurrentItem(dev_item);
1385 OnModified(true);
1386}
1387
1388void RegEdit::AddRegister(QTreeWidgetItem *_item)
1389{
1390 NewRegTreeItem *item = dynamic_cast< NewRegTreeItem * >(_item);
1391 item->GetRef().GetDev().reg.push_back(soc_reg_t());
1392 RegTreeItem *reg_item = new RegTreeItem("",
1393 SocRegRef(item->GetRef(), item->GetRef().GetDev().reg.size() - 1, -1));
1394 FixupEmptyItem(reg_item);
1395 item->parent()->insertChild(item->parent()->indexOfChild(item), reg_item);
1396 CreateNewFieldItem(reg_item);
1397 m_soc_tree->setCurrentItem(reg_item);
1398 OnModified(true);
1399}
1400
1401void RegEdit::AddField(QTreeWidgetItem *_item)
1402{
1403 NewFieldTreeItem *item = dynamic_cast< NewFieldTreeItem * >(_item);
1404 item->GetRef().GetReg().field.push_back(soc_reg_field_t());
1405 FieldTreeItem *field_item = new FieldTreeItem("",
1406 SocFieldRef(item->GetRef(), item->GetRef().GetReg().field.size() - 1));
1407 FixupEmptyItem(field_item);
1408 item->parent()->insertChild(item->parent()->indexOfChild(item), field_item);
1409 m_soc_tree->setCurrentItem(field_item);
1410 OnModified(true);
1411} 1823}
1412 1824
1413bool RegEdit::Quit() 1825bool RegEdit::Quit()
diff --git a/utils/regtools/qeditor/regedit.h b/utils/regtools/qeditor/regedit.h
index c56f0d9026..2540500f29 100644
--- a/utils/regtools/qeditor/regedit.h
+++ b/utils/regtools/qeditor/regedit.h
@@ -38,6 +38,8 @@
38#include <QButtonGroup> 38#include <QButtonGroup>
39#include <QDebug> 39#include <QDebug>
40#include <QScrollArea> 40#include <QScrollArea>
41#include <QSpinBox>
42#include <QFormLayout>
41#include "backend.h" 43#include "backend.h"
42#include "settings.h" 44#include "settings.h"
43#include "mainwindow.h" 45#include "mainwindow.h"
@@ -48,7 +50,7 @@ class AbstractRegEditPanel
48public: 50public:
49 AbstractRegEditPanel() {} 51 AbstractRegEditPanel() {}
50 virtual ~AbstractRegEditPanel() {} 52 virtual ~AbstractRegEditPanel() {}
51 virtual void OnModified(bool mod) = 0; 53 virtual void OnModified() = 0;
52}; 54};
53 55
54class EmptyEditPanel : public QWidget, public AbstractRegEditPanel 56class EmptyEditPanel : public QWidget, public AbstractRegEditPanel
@@ -58,7 +60,7 @@ public:
58 EmptyEditPanel(QWidget *parent); 60 EmptyEditPanel(QWidget *parent);
59 61
60signals: 62signals:
61 void OnModified(bool mod); 63 void OnModified();
62 64
63protected: 65protected:
64}; 66};
@@ -67,178 +69,167 @@ class SocEditPanel : public QWidget, public AbstractRegEditPanel
67{ 69{
68 Q_OBJECT 70 Q_OBJECT
69public: 71public:
70 SocEditPanel(SocRef ref, QWidget *parent = 0); 72 SocEditPanel(const soc_desc::soc_ref_t& ref, QWidget *parent = 0);
71 73
72signals: 74signals:
73 void OnModified(bool mod); 75 void OnModified();
74 76
75protected slots: 77protected slots:
76 void OnTextEdited(); 78 void OnTextEdited();
77 void OnNameEdited(const QString& text); 79 void OnNameEdited(const QString& text);
80 void OnTitleEdited(const QString& text);
81 void OnVersionEdited(const QString& text);
82 void OnIsaEdited(const QString& text);
83 void OnAuthorActivated(QTableWidgetItem *);
84 void OnAuthorChanged(QTableWidgetItem *);
78 85
79protected: 86protected:
80 SocRef m_ref; 87 soc_desc::soc_ref_t m_ref;
81 QGroupBox *m_name_group; 88 QTableWidget *m_authors_list;
82 QLineEdit *m_name_edit;
83 QGroupBox *m_desc_group;
84 MyTextEditor *m_desc_edit; 89 MyTextEditor *m_desc_edit;
85}; 90};
86 91
87class DevEditPanel : public QWidget, public AbstractRegEditPanel 92class NodeInstanceEditPanel : public QWidget
88{ 93{
89 Q_OBJECT 94 Q_OBJECT
90public: 95public:
91 DevEditPanel(SocDevRef ref, QWidget *parent = 0); 96 NodeInstanceEditPanel(const soc_desc::node_ref_t& ref, soc_id_t inst_id,
97 QWidget *parent = 0);
98 soc_id_t GetId();
99 soc_desc::instance_t& GetInstance();
92 100
93signals: 101signals:
94 void OnModified(bool mod); 102 void OnModified();
95 103
96protected slots: 104protected slots:
97 void OnInstActivated(int row, int column);
98 void OnInstChanged(int row, int column);
99 void OnNameEdited(const QString& text); 105 void OnNameEdited(const QString& text);
100 void OnLongNameEdited(const QString& text); 106 void OnTitleEdited(const QString& text);
101 void OnVersionEdited(const QString& text); 107 void OnDescEdited(const QString& text);
102 void OnDescEdited(); 108 void OnTypeChanged(int index);
109 void OnAddrChanged(uint addr);
110 void OnBaseChanged(uint base);
111 void OnStrideChanged(uint stride);
112 void OnFirstChanged(int first);
113 void OnCountChanged(int count);
114 void OnFormulaChanged(const QString& formula);
115 void OnVariableChanged(const QString& variable);
116 void OnAddressActivated(QTableWidgetItem *);
117 void OnAddressChanged(QTableWidgetItem *);
103 118
104protected: 119protected:
105 void FillRow(int row, const soc_dev_addr_t& addr); 120 void UpdateType(int type);
106 void CreateNewRow(int row); 121
107 122 soc_desc::node_ref_t m_ref;
108 enum 123 soc_id_t m_id;
109 { 124 QComboBox *m_type_combo;
110 DevInstDeleteType = QTableWidgetItem::UserType, 125 QWidget *m_single_group;
111 DevInstNewType 126 QWidget *m_range_group;
112 }; 127 QWidget *m_formula_group;
113 128 QWidget *m_stride_group;
114 enum 129 QWidget *m_list_group;
115 { 130 QStyledItemDelegate *m_table_delegate;
116 DevInstIconColumn = 0, 131 SocFieldEditorCreator *m_table_edit_factory;
117 DevInstNameColumn = 1,
118 DevInstAddrColumn = 2,
119 };
120
121 SocDevRef m_ref;
122 QGroupBox *m_name_group;
123 QLineEdit *m_name_edit;
124 QGroupBox *m_long_name_group;
125 QLineEdit *m_long_name_edit;
126 QGroupBox *m_version_group;
127 QLineEdit *m_version_edit;
128 QGroupBox *m_instances_group;
129 QTableWidget *m_instances_table;
130 QGroupBox *m_desc_group;
131 MyTextEditor *m_desc_edit;
132}; 132};
133 133
134class RegEditPanel : public QWidget, public AbstractRegEditPanel 134class NodeEditPanel : public QWidget, public AbstractRegEditPanel
135{ 135{
136 Q_OBJECT 136 Q_OBJECT
137public: 137public:
138 RegEditPanel(SocRegRef ref, QWidget *parent = 0); 138 NodeEditPanel(const soc_desc::node_ref_t& ref, QWidget *parent = 0);
139 139
140signals: 140signals:
141 void OnModified(bool mod); 141 void OnModified();
142 142
143protected slots: 143protected slots:
144 void OnInstActivated(int row, int column);
145 void OnInstChanged(int row, int column);
146 void OnNameEdited(const QString& text); 144 void OnNameEdited(const QString& text);
145 void OnTitleEdited(const QString& text);
147 void OnDescEdited(); 146 void OnDescEdited();
148 void OnSctEdited(int state); 147 void OnInstRemove(int index);
149 void OnFormulaChanged(int index); 148 void OnInstCreate();
150 void OnFormulaStringChanged(const QString& text); 149 void OnInstModified();
151 void OnFormulaGenerate(bool checked); 150
151protected:
152 soc_desc::instance_t *GetInstanceById(soc_id_t id);
153 soc_desc::instance_t *GetInstanceByRow(int row);
154 QString GuessName();
155
156 soc_desc::node_ref_t m_ref;
157 MyTextEditor *m_desc_edit;
158 YTabWidget *m_instances_tab;
159};
160
161class RegFieldEditPanel : public QWidget
162{
163 Q_OBJECT
164public:
165 RegFieldEditPanel(const soc_desc::field_ref_t& ref, QWidget *parent = 0);
166 soc_desc::field_ref_t GetField();
167 void UpdateWidth();
168
169signals:
170 void OnModified();
171
172protected slots:
173 void OnFieldNameChanged(const QString& name);
174 void OnFieldRangeChanged(const QString& range);
175 void OnFieldDescChanged(const QString& name);
176 void OnFieldValueActivated(QTableWidgetItem *item);
177 void OnFieldValueChanged(QTableWidgetItem *item);
152 178
153protected: 179protected:
154 void CreateNewAddrRow(int row); 180
155 void FillRow(int row, const soc_reg_addr_t& addr); 181 soc_desc::field_ref_t m_ref;
156 void UpdateFormula();
157 void UpdateWarning(int row);
158
159 enum
160 {
161 RegInstDeleteType = QTableWidgetItem::UserType,
162 RegInstNewType
163 };
164
165 enum
166 {
167 RegInstIconColumn = 0,
168 RegInstNameColumn,
169 RegInstAddrColumn,
170 RegInstNrColumns,
171 };
172
173 SocRegRef m_ref;
174 QGroupBox *m_name_group;
175 QLineEdit *m_name_edit; 182 QLineEdit *m_name_edit;
176 QGroupBox *m_instances_group; 183 QLineEdit *m_range_edit;
177 QTableWidget *m_instances_table; 184 SocBitRangeValidator *m_range_validator;
178 QGroupBox *m_desc_group;
179 QGroupBox *m_flags_group;
180 QCheckBox *m_sct_check;
181 QFont m_reg_font;
182 QGroupBox *m_formula_group;
183 QButtonGroup *m_formula_radio_group;
184 QLabel *m_formula_type_label;
185 QComboBox *m_formula_combo;
186 QLineEdit *m_formula_string_edit;
187 QPushButton *m_formula_string_gen;
188 Unscroll< RegSexyDisplay2 > *m_sexy_display2;
189 MyTextEditor *m_desc_edit; 185 MyTextEditor *m_desc_edit;
190 QGroupBox *m_field_group; 186 QTableWidget *m_enum_table;
191 QTableView *m_value_table; 187 SocFieldItemDelegate *m_enum_delegate;
192 RegFieldTableModel *m_value_model; 188 SocFieldEditorCreator *m_enum_editor;
193 QStyledItemDelegate *m_table_delegate;
194}; 189};
195 190
196class FieldEditPanel : public QWidget, public AbstractRegEditPanel 191class RegEditPanel : public QWidget, public AbstractRegEditPanel
197{ 192{
198 Q_OBJECT 193 Q_OBJECT
199public: 194public:
200 FieldEditPanel(SocFieldRef ref, QWidget *parent = 0); 195 RegEditPanel(const soc_desc::register_ref_t& ref, QWidget *parent = 0);
201 196
202signals: 197signals:
203 void OnModified(bool mod); 198 void OnModified();
204 199
205protected slots: 200protected slots:
201 void OnRegFieldActivated(const QModelIndex& index);
202 void OnRegDisplayContextMenu(QPoint point);
203 void OnRegFieldDelete();
204 void OnRegFieldNew();
205 void OnWidthChanged(int size);
206 void OnFieldModified();
206 void OnDescEdited(); 207 void OnDescEdited();
207 void OnNameEdited(const QString& text); 208 void OnVariantActivated(QTableWidgetItem *item);
208 void OnBitRangeEdited(const QString& string); 209 void OnVariantValueChanged(QTableWidgetItem *item);
209 void OnValueActivated(int row, int column); 210 void OnFieldRemove(int index);
210 void OnValueChanged(int row, int column); 211 void OnFieldCreate();
211 212
212protected: 213protected:
213 void CreateNewRow(int row); 214 void DoModify();
214 void FillRow(int row, const soc_reg_field_value_t& val); 215 int FindFreeBit(int preferred);
215 void UpdateWarning(int row); 216 int IndexById(soc_id_t id); // tab index
216 void UpdateDelegates(); 217 void UpdateWidthRestrictions();
217 218
218 enum
219 {
220 FieldValueDeleteType = QTableWidgetItem::UserType,
221 FieldValueNewType,
222 };
223
224 enum
225 {
226 FieldValueIconColumn = 0,
227 FieldValueNameColumn,
228 FieldValueValueColumn,
229 FieldValueDescColumn,
230 FieldValueNrColumns,
231 };
232
233 SocFieldRef m_ref;
234 QGroupBox *m_name_group;
235 QLineEdit *m_name_edit;
236 QGroupBox *m_bitrange_group;
237 QLineEdit *m_bitrange_edit;
238 QGroupBox *m_desc_group;
239 MyTextEditor *m_desc_edit; 219 MyTextEditor *m_desc_edit;
240 QGroupBox *m_value_group; 220 soc_desc::register_ref_t m_ref;
241 QTableWidget *m_value_table; 221 QFont m_reg_font;
222 Unscroll< YRegDisplay > *m_sexy_display2;
223 RegFieldTableModel *m_value_model;
224 YTabWidget *m_fields_tab;
225 QTabWidget *m_view_tab;
226 QTableWidget *m_variant_table;
227 QAction *m_new_action;
228 QAction *m_delete_action;
229 QPoint m_menu_point;
230 SocFieldItemDelegate *m_variant_delegate;
231 SocFieldEditorCreator *m_variant_editor;
232 QButtonGroup *m_reg_size_group;
242}; 233};
243 234
244class RegEdit : public QWidget, public DocumentTab 235class RegEdit : public QWidget, public DocumentTab
@@ -252,43 +243,50 @@ public:
252 243
253protected slots: 244protected slots:
254 void OnSocItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous); 245 void OnSocItemChanged(QTreeWidgetItem *current, QTreeWidgetItem *previous);
255 void OnSocItemActivated(QTreeWidgetItem *current, int column);
256 void OnOpen(); 246 void OnOpen();
257 void OnSave(); 247 void OnSave();
258 void OnSaveAs(); 248 void OnSaveAs();
259 void OnSocModified(bool modified); 249 void OnSocModified();
260 void OnNew(); 250 void OnNew();
261 void OnSocItemDelete(); 251 void OnSocItemDelete();
252 void OnSocItemNew();
253 void OnSocItemCreate();
254 void OnSocTreeContextMenu(QPoint point);
262 255
263protected: 256protected:
264 void LoadSocFile(const QString& filename); 257 void LoadSocFile(const QString& filename);
265 void UpdateSocFile(); 258 void UpdateSocFile();
266 void FillSocTree(); 259 void FillSocTree();
267 void FillSocTreeItem(QTreeWidgetItem *_item); 260 void FillNodeTreeItem(QTreeWidgetItem *item);
268 void FillDevTreeItem(QTreeWidgetItem *_item);
269 void FillRegTreeItem(QTreeWidgetItem *_item);
270 void SetPanel(QWidget *panel); 261 void SetPanel(QWidget *panel);
271 void DisplaySoc(SocRef ref); 262 void DisplaySoc(const soc_desc::soc_ref_t& ref);
272 void DisplayDev(SocDevRef ref); 263 void DisplayNode(const soc_desc::node_ref_t& ref);
273 void DisplayReg(SocRegRef ref); 264 void DisplayReg(const soc_desc::register_ref_t& ref);
274 void DisplayField(SocFieldRef ref);
275 bool CloseSoc(); 265 bool CloseSoc();
276 bool SaveSoc(); 266 bool SaveSoc();
277 bool SaveSocAs(); 267 bool SaveSocAs();
278 bool SaveSocFile(const QString& filename); 268 bool SaveSocFile(const QString& filename);
279 bool GetFilename(QString& filename, bool save); 269 bool GetFilename(QString& filename, bool save);
280 void SetModified(bool add, bool mod); 270 void SetModified(bool add, bool mod);
281 void FixupEmptyItem(QTreeWidgetItem *item); 271 void FixupItem(QTreeWidgetItem *item);
272 QIcon GetIconFromType(int type);
282 void MakeItalic(QTreeWidgetItem *item, bool it); 273 void MakeItalic(QTreeWidgetItem *item, bool it);
283 void AddDevice(QTreeWidgetItem *item); 274 void AddDevice(QTreeWidgetItem *item);
284 void AddRegister(QTreeWidgetItem *_item); 275 void AddRegister(QTreeWidgetItem *_item);
285 void UpdateName(QTreeWidgetItem *current); 276 void UpdateName(QTreeWidgetItem *current);
286 void AddField(QTreeWidgetItem *_item); 277 void AddField(QTreeWidgetItem *_item);
287 void CreateNewDeviceItem(QTreeWidgetItem *parent); 278 void CreateNewNodeItem(QTreeWidgetItem *parent);
288 void CreateNewRegisterItem(QTreeWidgetItem *parent); 279 void CreateNewRegisterItem(QTreeWidgetItem *parent);
289 void CreateNewFieldItem(QTreeWidgetItem *parent); 280 void CreateNewFieldItem(QTreeWidgetItem *parent);
290 void UpdateTabName(); 281 void UpdateTabName();
291 282 bool ValidateName(const QString& name);
283 int SetMessage(MessageWidget::MessageType type, const QString& msg);
284 void HideMessage(int id);
285
286 QAction *m_delete_action;
287 QAction *m_new_action;
288 QAction *m_create_action;
289 QTreeWidgetItem *m_action_item;
292 QGroupBox *m_file_group; 290 QGroupBox *m_file_group;
293 QToolButton *m_file_open; 291 QToolButton *m_file_open;
294 QToolButton *m_file_save; 292 QToolButton *m_file_save;
@@ -299,6 +297,10 @@ protected:
299 bool m_modified; 297 bool m_modified;
300 SocFile m_cur_socfile; 298 SocFile m_cur_socfile;
301 QWidget *m_right_panel; 299 QWidget *m_right_panel;
300 MessageWidget *m_msg;
301 QVBoxLayout *m_right_panel_layout;
302 int m_msg_welcome_id;
303 int m_msg_name_error_id;
302}; 304};
303 305
304#endif /* REGEDIT_H */ 306#endif /* REGEDIT_H */
diff --git a/utils/regtools/qeditor/regtab.cpp b/utils/regtools/qeditor/regtab.cpp
index a82070e3f8..2653908d41 100644
--- a/utils/regtools/qeditor/regtab.cpp
+++ b/utils/regtools/qeditor/regtab.cpp
@@ -35,42 +35,7 @@ namespace
35 35
36enum 36enum
37{ 37{
38 RegTreeDevType = QTreeWidgetItem::UserType, 38 NodeInstRole = Qt::UserRole,
39 RegTreeRegType,
40 RegTreeSocType
41};
42
43class SocTreeItem : public QTreeWidgetItem
44{
45public:
46 SocTreeItem(const QString& string, const SocRef& ref)
47 :QTreeWidgetItem(QStringList(string), RegTreeSocType), m_ref(ref) {}
48
49 const SocRef& GetRef() { return m_ref; }
50private:
51 SocRef m_ref;
52};
53
54class DevTreeItem : public QTreeWidgetItem
55{
56public:
57 DevTreeItem(const QString& string, const SocDevRef& ref)
58 :QTreeWidgetItem(QStringList(string), RegTreeDevType), m_ref(ref) {}
59
60 const SocDevRef& GetRef() { return m_ref; }
61private:
62 SocDevRef m_ref;
63};
64
65class RegTreeItem : public QTreeWidgetItem
66{
67public:
68 RegTreeItem(const QString& string, const SocRegRef& ref)
69 :QTreeWidgetItem(QStringList(string), RegTreeRegType), m_ref(ref) {}
70
71 const SocRegRef& GetRef() { return m_ref; }
72private:
73 SocRegRef m_ref;
74}; 39};
75 40
76} 41}
@@ -165,7 +130,8 @@ RegTab::RegTab(Backend *backend, QWidget *parent)
165 130
166 connect(m_soc_selector, SIGNAL(currentIndexChanged(int)), 131 connect(m_soc_selector, SIGNAL(currentIndexChanged(int)),
167 this, SLOT(OnSocChanged(int))); 132 this, SLOT(OnSocChanged(int)));
168 connect(m_backend, SIGNAL(OnSocListChanged()), this, SLOT(OnSocListChanged())); 133 connect(m_backend, SIGNAL(OnSocAdded(const SocFileRef&)), this,
134 SLOT(OnSocAdded(const SocFileRef&)));
169 connect(m_reg_tree, SIGNAL(itemClicked(QTreeWidgetItem*, int)), 135 connect(m_reg_tree, SIGNAL(itemClicked(QTreeWidgetItem*, int)),
170 this, SLOT(OnRegItemClicked(QTreeWidgetItem*, int))); 136 this, SLOT(OnRegItemClicked(QTreeWidgetItem*, int)));
171 connect(m_data_soc_label, SIGNAL(linkActivated(const QString&)), this, 137 connect(m_data_soc_label, SIGNAL(linkActivated(const QString&)), this,
@@ -183,7 +149,9 @@ RegTab::RegTab(Backend *backend, QWidget *parent)
183 "You can browse the registers. Select a data source to analyse the values."); 149 "You can browse the registers. Select a data source to analyse the values.");
184 m_msg_error_id = 0; 150 m_msg_error_id = 0;
185 151
186 OnSocListChanged(); 152 QList< SocFileRef > socs = m_backend->GetSocFileList();
153 for(int i = 0; i < socs.size(); i++)
154 OnSocAdded(socs[i]);
187 SetDataSocName(""); 155 SetDataSocName("");
188 UpdateTabName(); 156 UpdateTabName();
189} 157}
@@ -286,21 +254,7 @@ void RegTab::OnRegItemClicked(QTreeWidgetItem *current, int col)
286 Q_UNUSED(col); 254 Q_UNUSED(col);
287 if(current == 0) 255 if(current == 0)
288 return; 256 return;
289 if(current->type() == RegTreeSocType) 257 DisplayNode(NodeInst(current));
290 {
291 SocTreeItem *item = dynamic_cast< SocTreeItem * >(current);
292 DisplaySoc(item->GetRef());
293 }
294 if(current->type() == RegTreeRegType)
295 {
296 RegTreeItem *item = dynamic_cast< RegTreeItem * >(current);
297 DisplayRegister(item->GetRef());
298 }
299 else if(current->type() == RegTreeDevType)
300 {
301 DevTreeItem *item = dynamic_cast< DevTreeItem * >(current);
302 DisplayDevice(item->GetRef());
303 }
304} 258}
305 259
306void RegTab::OnAnalyserClicked(QListWidgetItem *current) 260void RegTab::OnAnalyserClicked(QListWidgetItem *current)
@@ -311,19 +265,14 @@ void RegTab::OnAnalyserClicked(QListWidgetItem *current)
311 SetPanel(ana->Create(m_cur_soc, m_io_backend)); 265 SetPanel(ana->Create(m_cur_soc, m_io_backend));
312} 266}
313 267
314void RegTab::DisplayRegister(const SocRegRef& ref) 268void RegTab::DisplayNode(const soc_desc::node_inst_t& ref)
315{
316 SetPanel(new RegDisplayPanel(this, m_io_backend, ref));
317}
318
319void RegTab::DisplayDevice(const SocDevRef& ref)
320{ 269{
321 SetPanel(new DevDisplayPanel(this, ref)); 270 if(ref.node().is_root())
322} 271 SetPanel(new SocDisplayPanel(this, m_io_backend, ref.soc()));
323 272 else if(ref.node().reg().valid())
324void RegTab::DisplaySoc(const SocRef& ref) 273 SetPanel(new RegDisplayPanel(this, m_io_backend, ref));
325{ 274 else
326 SetPanel(new SocDisplayPanel(this, ref)); 275 SetPanel(new NodeDisplayPanel(this, m_io_backend, ref));
327} 276}
328 277
329int RegTab::SetMessage(MessageWidget::MessageType type, const QString& msg) 278int RegTab::SetMessage(MessageWidget::MessageType type, const QString& msg)
@@ -344,56 +293,45 @@ void RegTab::SetPanel(RegTabPanel *panel)
344 m_right_panel->addWidget(m_right_content->GetWidget(), 1); 293 m_right_panel->addWidget(m_right_content->GetWidget(), 1);
345} 294}
346 295
347void RegTab::OnSocListChanged() 296void RegTab::OnSocAdded(const SocFileRef& ref)
348{ 297{
349 m_soc_selector->clear(); 298 soc_desc::soc_ref_t soc = ref.GetSocFile()->GetSocRef();
350 QList< SocRef > socs = m_backend->GetSocList(); 299 QVariant v;
351 for(int i = 0; i < socs.size(); i++) 300 v.setValue(soc);
352 { 301 m_soc_selector->addItem(QString::fromStdString(soc.get()->name), v);
353 QVariant v;
354 v.setValue(socs[i]);
355 m_soc_selector->addItem(QString::fromStdString(socs[i].GetSoc().name), v);
356 }
357} 302}
358 303
359void RegTab::FillDevSubTree(QTreeWidgetItem *_item) 304QTreeWidgetItem *RegTab::MakeNode(const soc_desc::node_inst_t& inst, const QString& s)
360{ 305{
361 DevTreeItem *item = dynamic_cast< DevTreeItem* >(_item); 306 QTreeWidgetItem *item = new QTreeWidgetItem(QStringList(s));
362 const soc_dev_t& dev = item->GetRef().GetDev(); 307 item->setData(0, NodeInstRole, QVariant::fromValue(inst));
363 for(size_t i = 0; i < dev.reg.size(); i++) 308 return item;
364 { 309}
365 const soc_reg_t& reg = dev.reg[i]; 310
366 for(size_t j = 0; j < reg.addr.size(); j++) 311soc_desc::node_inst_t RegTab::NodeInst(QTreeWidgetItem *item)
367 { 312{
368 RegTreeItem *reg_item = new RegTreeItem(reg.addr[j].name.c_str(), 313 return item->data(0, NodeInstRole).value< soc_desc::node_inst_t >();
369 SocRegRef(item->GetRef(), i, j));
370 item->addChild(reg_item);
371 }
372 }
373} 314}
374 315
375void RegTab::FillSocSubTree(QTreeWidgetItem *_item) 316void RegTab::FillSubTree(QTreeWidgetItem *item)
376{ 317{
377 SocTreeItem *item = dynamic_cast< SocTreeItem* >(_item); 318 std::vector< soc_desc::node_inst_t > list = NodeInst(item).children();
378 const soc_t& soc = item->GetRef().GetSoc(); 319 for(size_t i = 0; i < list.size(); i++)
379 for(size_t i = 0; i < soc.dev.size(); i++)
380 { 320 {
381 const soc_dev_t& dev = soc.dev[i]; 321 QString name = QString::fromStdString(list[i].name());
382 for(size_t j = 0; j < dev.addr.size(); j++) 322 if(list[i].is_indexed())
383 { 323 name = QString("%1[%2]").arg(name).arg(list[i].index());
384 DevTreeItem *dev_item = new DevTreeItem(dev.addr[j].name.c_str(), 324 QTreeWidgetItem *child = MakeNode(list[i], name);
385 SocDevRef(m_cur_soc, i, j)); 325 FillSubTree(child);
386 FillDevSubTree(dev_item); 326 item->addChild(child);
387 item->addChild(dev_item);
388 }
389 } 327 }
390} 328}
391 329
392void RegTab::FillRegTree() 330void RegTab::FillRegTree()
393{ 331{
394 SocTreeItem *soc_item = new SocTreeItem(m_cur_soc.GetSoc().name.c_str(), 332 QTreeWidgetItem *soc_item = MakeNode(m_cur_soc.root_inst(),
395 m_cur_soc); 333 QString::fromStdString(m_cur_soc.get()->name));
396 FillSocSubTree(soc_item); 334 FillSubTree(soc_item);
397 m_reg_tree->addTopLevelItem(soc_item); 335 m_reg_tree->addTopLevelItem(soc_item);
398 m_reg_tree->expandItem(soc_item); 336 m_reg_tree->expandItem(soc_item);
399} 337}
@@ -401,7 +339,8 @@ void RegTab::FillRegTree()
401void RegTab::FillAnalyserList() 339void RegTab::FillAnalyserList()
402{ 340{
403 m_analysers_list->clear(); 341 m_analysers_list->clear();
404 m_analysers_list->addItems(AnalyserFactory::GetAnalysersForSoc(m_cur_soc.GetSoc().name.c_str())); 342 m_analysers_list->addItems(AnalyserFactory::GetAnalysersForSoc(
343 QString::fromStdString(m_cur_soc.get()->name)));
405} 344}
406 345
407void RegTab::OnSocChanged(int index) 346void RegTab::OnSocChanged(int index)
@@ -409,7 +348,7 @@ void RegTab::OnSocChanged(int index)
409 if(index == -1) 348 if(index == -1)
410 return; 349 return;
411 m_reg_tree->clear(); 350 m_reg_tree->clear();
412 m_cur_soc = m_soc_selector->itemData(index).value< SocRef >(); 351 m_cur_soc = m_soc_selector->itemData(index).value< soc_desc::soc_ref_t >();
413 FillRegTree(); 352 FillRegTree();
414 FillAnalyserList(); 353 FillAnalyserList();
415} 354}
@@ -426,7 +365,10 @@ void RegTab::OnDumpRegs(bool c)
426 Q_UNUSED(c); 365 Q_UNUSED(c);
427 QFileDialog *fd = new QFileDialog(this); 366 QFileDialog *fd = new QFileDialog(this);
428 fd->setAcceptMode(QFileDialog::AcceptSave); 367 fd->setAcceptMode(QFileDialog::AcceptSave);
429 fd->setFilter("Textual files (*.txt);;All files (*)"); 368 QStringList filters;
369 filters << "Textual files (*.txt)";
370 filters << "All files (*)";
371 fd->setNameFilters(filters);
430 fd->setDirectory(Settings::Get()->value("regtab/loaddatadir", QDir::currentPath()).toString()); 372 fd->setDirectory(Settings::Get()->value("regtab/loaddatadir", QDir::currentPath()).toString());
431 if(!fd->exec()) 373 if(!fd->exec())
432 return; 374 return;
diff --git a/utils/regtools/qeditor/regtab.h b/utils/regtools/qeditor/regtab.h
index a0fd5f305a..b56747f4d1 100644
--- a/utils/regtools/qeditor/regtab.h
+++ b/utils/regtools/qeditor/regtab.h
@@ -66,14 +66,13 @@ public:
66 virtual QWidget *GetWidget(); 66 virtual QWidget *GetWidget();
67 67
68protected: 68protected:
69 void FillDevSubTree(QTreeWidgetItem *item); 69 QTreeWidgetItem *MakeNode(const soc_desc::node_inst_t& inst, const QString& s);
70 void FillSocSubTree(QTreeWidgetItem *item); 70 soc_desc::node_inst_t NodeInst(QTreeWidgetItem *item);
71 void FillSubTree(QTreeWidgetItem *item);
71 void FillRegTree(); 72 void FillRegTree();
72 void FillAnalyserList(); 73 void FillAnalyserList();
73 void UpdateSocList(); 74 void UpdateSocList();
74 void DisplayRegister(const SocRegRef& ref); 75 void DisplayNode(const soc_desc::node_inst_t& ref);
75 void DisplayDevice(const SocDevRef& ref);
76 void DisplaySoc(const SocRef& ref);
77 void SetDataSocName(const QString& socname); 76 void SetDataSocName(const QString& socname);
78 void SetPanel(RegTabPanel *panel); 77 void SetPanel(RegTabPanel *panel);
79 void UpdateSocFilename(); 78 void UpdateSocFilename();
@@ -85,7 +84,7 @@ protected:
85 BackendSelector *m_backend_selector; 84 BackendSelector *m_backend_selector;
86 Backend *m_backend; 85 Backend *m_backend;
87 QTreeWidget *m_reg_tree; 86 QTreeWidget *m_reg_tree;
88 SocRef m_cur_soc; 87 soc_desc::soc_ref_t m_cur_soc;
89 QVBoxLayout *m_right_panel; 88 QVBoxLayout *m_right_panel;
90 RegTabPanel *m_right_content; 89 RegTabPanel *m_right_content;
91 QCheckBox *m_readonly_check; 90 QCheckBox *m_readonly_check;
@@ -102,7 +101,7 @@ protected:
102private slots: 101private slots:
103 void SetReadOnlyIndicator(); 102 void SetReadOnlyIndicator();
104 void OnSocChanged(int index); 103 void OnSocChanged(int index);
105 void OnSocListChanged(); 104 void OnSocAdded(const SocFileRef& ref);
106 void OnRegItemClicked(QTreeWidgetItem *clicked, int col); 105 void OnRegItemClicked(QTreeWidgetItem *clicked, int col);
107 void OnBackendSelect(IoBackend *backend); 106 void OnBackendSelect(IoBackend *backend);
108 void OnDataChanged(); 107 void OnDataChanged();
diff --git a/utils/regtools/qeditor/std_analysers.cpp b/utils/regtools/qeditor/std_analysers.cpp
index 0fb2050cf0..05a90f9d5b 100644
--- a/utils/regtools/qeditor/std_analysers.cpp
+++ b/utils/regtools/qeditor/std_analysers.cpp
@@ -19,13 +19,44 @@
19 * 19 *
20 ****************************************************************************/ 20 ****************************************************************************/
21#include "std_analysers.h" 21#include "std_analysers.h"
22#include <QDebug>
23
24/**
25 * AnalyserEx
26 */
27
28AnalyserEx::AnalyserEx(const soc_desc::soc_ref_t& soc, IoBackend *backend)
29 :Analyser(soc, backend), m_helper(backend, soc)
30{
31}
32
33bool AnalyserEx::ReadRegister(const QString& path, soc_word_t& val)
34{
35 return m_helper.ReadRegister(m_helper.ParsePath(path), val);
36}
37
38bool AnalyserEx::ReadRegisterOld(const QString& dev, const QString& reg, soc_word_t& val)
39{
40 return ReadRegister(dev + "." + reg, val);
41}
42
43bool AnalyserEx::ReadField(const QString& path, const QString& field, soc_word_t& val)
44{
45 return m_helper.ReadRegisterField(m_helper.ParsePath(path), field, val);
46}
47
48bool AnalyserEx::ReadFieldOld(const QString& dev, const QString& reg,
49 const QString& field, soc_word_t& val)
50{
51 return ReadField(dev + "." + reg, field, val);
52}
22 53
23/** 54/**
24 * Clock analyser 55 * Clock analyser
25 */ 56 */
26 57
27ClockAnalyser::ClockAnalyser(const SocRef& soc, IoBackend *backend) 58ClockAnalyser::ClockAnalyser(const soc_desc::soc_ref_t& soc, IoBackend *backend)
28 :Analyser(soc, backend) 59 :AnalyserEx(soc, backend)
29{ 60{
30 m_group = new QGroupBox("Clock Analyser"); 61 m_group = new QGroupBox("Clock Analyser");
31 QVBoxLayout *layout = new QVBoxLayout; 62 QVBoxLayout *layout = new QVBoxLayout;
@@ -75,7 +106,8 @@ QString ClockAnalyser::GetFreq(unsigned freq)
75 return QString().sprintf("%d Hz", freq); 106 return QString().sprintf("%d Hz", freq);
76} 107}
77 108
78QTreeWidgetItem *ClockAnalyser::AddClock(QTreeWidgetItem *parent, const QString& name, int freq, int mul, int div) 109QTreeWidgetItem *ClockAnalyser::AddClock(QTreeWidgetItem *parent, const QString& name,
110 int freq, int mul, int div)
79{ 111{
80 if(freq == FROM_PARENT) 112 if(freq == FROM_PARENT)
81 { 113 {
@@ -102,9 +134,9 @@ int ClockAnalyser::GetClockFreq(QTreeWidgetItem *item)
102void ClockAnalyser::FillTree() 134void ClockAnalyser::FillTree()
103{ 135{
104 m_tree_widget->clear(); 136 m_tree_widget->clear();
105 if(m_soc.GetSoc().name == "imx233") FillTreeIMX233(); 137 if(m_soc.get()->name == "imx233") FillTreeIMX233();
106 else if(m_soc.GetSoc().name == "rk27xx") FillTreeRK27XX(); 138 else if(m_soc.get()->name == "rk27xx") FillTreeRK27XX();
107 else if(m_soc.GetSoc().name == "atj213x") FillTreeATJ213X(); 139 else if(m_soc.get()->name == "atj213x") FillTreeATJ213X();
108 m_tree_widget->expandAll(); 140 m_tree_widget->expandAll();
109 m_tree_widget->resizeColumnToContents(0); 141 m_tree_widget->resizeColumnToContents(0);
110} 142}
@@ -113,17 +145,15 @@ void ClockAnalyser::FillTreeATJ213X()
113{ 145{
114 soc_word_t pllbypass, pllclk, en, coreclks, tmp0, tmp1, tmp2, tmp3; 146 soc_word_t pllbypass, pllclk, en, coreclks, tmp0, tmp1, tmp2, tmp3;
115 147
116 BackendHelper helper(m_io_backend, m_soc);
117
118 // system oscillators 32.768k and 24M 148 // system oscillators 32.768k and 24M
119 QTreeWidgetItem *losc_clk = AddClock(0, "losc clk", 32768); 149 QTreeWidgetItem *losc_clk = AddClock(0, "losc clk", 32768);
120 QTreeWidgetItem *hosc_clk = AddClock(0, "hosc clk", 24000000); 150 QTreeWidgetItem *hosc_clk = AddClock(0, "hosc clk", 24000000);
121 151
122 // core pll 152 // core pll
123 QTreeWidgetItem *corepll = 0; 153 QTreeWidgetItem *corepll = 0;
124 if (helper.ReadRegisterField("CMU", "COREPLL", "CPEN", en) && 154 if(ReadFieldOld("CMU", "COREPLL", "CPEN", en) &&
125 helper.ReadRegisterField("CMU", "COREPLL", "CPBY", pllbypass) && 155 ReadFieldOld("CMU", "COREPLL", "CPBY", pllbypass) &&
126 helper.ReadRegisterField("CMU", "COREPLL", "CPCK", pllclk)) 156 ReadFieldOld("CMU", "COREPLL", "CPCK", pllclk))
127 { 157 {
128 corepll = AddClock(hosc_clk, "core pll", en ? FROM_PARENT : DISABLED, 158 corepll = AddClock(hosc_clk, "core pll", en ? FROM_PARENT : DISABLED,
129 pllbypass ? 1 : pllclk, pllbypass ? 1 : 4); 159 pllbypass ? 1 : pllclk, pllbypass ? 1 : 4);
@@ -135,8 +165,8 @@ void ClockAnalyser::FillTreeATJ213X()
135 165
136 // dsp pll 166 // dsp pll
137 QTreeWidgetItem *dsppll = 0; 167 QTreeWidgetItem *dsppll = 0;
138 if (helper.ReadRegisterField("CMU", "DSPPLL", "DPEN", en) && 168 if(ReadFieldOld("CMU", "DSPPLL", "DPEN", en) &&
139 helper.ReadRegisterField("CMU", "DSPPLL", "DPCK", pllclk)) 169 ReadFieldOld("CMU", "DSPPLL", "DPCK", pllclk))
140 { 170 {
141 dsppll = AddClock(hosc_clk, "dsp pll", en ? FROM_PARENT : DISABLED, 171 dsppll = AddClock(hosc_clk, "dsp pll", en ? FROM_PARENT : DISABLED,
142 pllbypass ? 1 : pllclk, pllbypass ? 1 : 4); 172 pllbypass ? 1 : pllclk, pllbypass ? 1 : 4);
@@ -149,11 +179,11 @@ void ClockAnalyser::FillTreeATJ213X()
149 // audio pll 179 // audio pll
150 QTreeWidgetItem *adcpll = 0; 180 QTreeWidgetItem *adcpll = 0;
151 QTreeWidgetItem *dacpll = 0; 181 QTreeWidgetItem *dacpll = 0;
152 if (helper.ReadRegisterField("CMU", "AUDIOPLL", "APEN", en) && 182 if(ReadFieldOld("CMU", "AUDIOPLL", "APEN", en) &&
153 helper.ReadRegisterField("CMU", "AUDIOPLL", "ADCCLK", tmp0) && 183 ReadFieldOld("CMU", "AUDIOPLL", "ADCCLK", tmp0) &&
154 helper.ReadRegisterField("CMU", "AUDIOPLL", "DACCLK", tmp1)) 184 ReadFieldOld("CMU", "AUDIOPLL", "DACCLK", tmp1))
155 { 185 {
156 if (en) 186 if(en)
157 { 187 {
158 adcpll = AddClock(hosc_clk, "audio adc pll", tmp0 ? 22579200 : 24576000); 188 adcpll = AddClock(hosc_clk, "audio adc pll", tmp0 ? 22579200 : 24576000);
159 dacpll = AddClock(hosc_clk, "audio dac pll", tmp1 ? 22579200 : 24576000); 189 dacpll = AddClock(hosc_clk, "audio dac pll", tmp1 ? 22579200 : 24576000);
@@ -173,8 +203,8 @@ void ClockAnalyser::FillTreeATJ213X()
173 // audio clocks 203 // audio clocks
174 QTreeWidgetItem *adcclk = 0; 204 QTreeWidgetItem *adcclk = 0;
175 QTreeWidgetItem *dacclk = 0; 205 QTreeWidgetItem *dacclk = 0;
176 if (helper.ReadRegisterField("CMU", "AUDIOPLL", "ADCCLK", tmp0) && 206 if(ReadFieldOld("CMU", "AUDIOPLL", "ADCCLK", tmp0) &&
177 helper.ReadRegisterField("CMU", "AUDIOPLL", "DACCLK", tmp1)) 207 ReadFieldOld("CMU", "AUDIOPLL", "DACCLK", tmp1))
178 { 208 {
179 adcclk = AddClock(adcpll, "audio adc clk", FROM_PARENT, 1, tmp0+1); 209 adcclk = AddClock(adcpll, "audio adc clk", FROM_PARENT, 1, tmp0+1);
180 dacclk = AddClock(dacpll, "audio dac clk", FROM_PARENT, 1, tmp1+1); 210 dacclk = AddClock(dacpll, "audio dac clk", FROM_PARENT, 1, tmp1+1);
@@ -187,14 +217,14 @@ void ClockAnalyser::FillTreeATJ213X()
187 217
188 // cpu clock 218 // cpu clock
189 QTreeWidgetItem *cpuclk = 0; 219 QTreeWidgetItem *cpuclk = 0;
190 if (helper.ReadRegisterField("CMU", "BUSCLK", "CORECLKS", coreclks) && 220 if(ReadFieldOld("CMU", "BUSCLK", "CORECLKS", coreclks) &&
191 helper.ReadRegisterField("CMU", "BUSCLK", "CCLKDIV", tmp0)) 221 ReadFieldOld("CMU", "BUSCLK", "CCLKDIV", tmp0))
192 { 222 {
193 if (coreclks == 0) 223 if(coreclks == 0)
194 cpuclk = AddClock(losc_clk, "cpu clk", FROM_PARENT, 1, tmp0+1); 224 cpuclk = AddClock(losc_clk, "cpu clk", FROM_PARENT, 1, tmp0+1);
195 else if (coreclks == 1) 225 else if(coreclks == 1)
196 cpuclk = AddClock(hosc_clk, "cpu clk", FROM_PARENT, 1, tmp0+1); 226 cpuclk = AddClock(hosc_clk, "cpu clk", FROM_PARENT, 1, tmp0+1);
197 else if (coreclks == 2) 227 else if(coreclks == 2)
198 cpuclk = AddClock(corepll, "cpu clk", FROM_PARENT, 1, tmp0+1); 228 cpuclk = AddClock(corepll, "cpu clk", FROM_PARENT, 1, tmp0+1);
199 else 229 else
200 cpuclk = AddClock(corepll, "cpu clk", INVALID); 230 cpuclk = AddClock(corepll, "cpu clk", INVALID);
@@ -206,24 +236,24 @@ void ClockAnalyser::FillTreeATJ213X()
206 236
207 // system clock 237 // system clock
208 QTreeWidgetItem *sysclk = 0; 238 QTreeWidgetItem *sysclk = 0;
209 if (helper.ReadRegisterField("CMU", "BUSCLK", "SCLKDIV", tmp0)) 239 if(ReadFieldOld("CMU", "BUSCLK", "SCLKDIV", tmp0))
210 sysclk = AddClock(cpuclk, "system clk", FROM_PARENT, 1, tmp0+1); 240 sysclk = AddClock(cpuclk, "system clk", FROM_PARENT, 1, tmp0+1);
211 else 241 else
212 sysclk = AddClock(cpuclk, "system clk", INVALID); 242 sysclk = AddClock(cpuclk, "system clk", INVALID);
213 243
214 // peripherial clk 244 // peripherial clk
215 QTreeWidgetItem *pclk = 0; 245 QTreeWidgetItem *pclk = 0;
216 if (helper.ReadRegisterField("CMU", "BUSCLK", "PCLKDIV", tmp0)) 246 if(ReadFieldOld("CMU", "BUSCLK", "PCLKDIV", tmp0))
217 pclk = AddClock(sysclk, "peripherial clk", FROM_PARENT, 1, tmp0 ? tmp0+1 : 2); 247 pclk = AddClock(sysclk, "peripherial clk", FROM_PARENT, 1, tmp0 ? tmp0+1 : 2);
218 else 248 else
219 pclk = AddClock(sysclk, "peripherial clk", INVALID); 249 pclk = AddClock(sysclk, "peripherial clk", INVALID);
220 250
221 // sdram clk 251 // sdram clk
222 QTreeWidgetItem *sdrclk = 0; 252 QTreeWidgetItem *sdrclk = 0;
223 if (helper.ReadRegisterField("CMU", "DEVCLKEN", "SDRC", en) && 253 if(ReadFieldOld("CMU", "DEVCLKEN", "SDRC", en) &&
224 helper.ReadRegisterField("CMU", "DEVCLKEN", "SDRM", tmp0) && 254 ReadFieldOld("CMU", "DEVCLKEN", "SDRM", tmp0) &&
225 helper.ReadRegisterField("SDR", "EN", "EN", tmp1) && 255 ReadFieldOld("SDR", "EN", "EN", tmp1) &&
226 helper.ReadRegisterField("CMU", "SDRCLK", "SDRDIV", tmp2)) 256 ReadFieldOld("CMU", "SDRCLK", "SDRDIV", tmp2))
227 { 257 {
228 en &= tmp0 & tmp1; 258 en &= tmp0 & tmp1;
229 sdrclk = AddClock(sysclk, "sdram clk", en ? FROM_PARENT: DISABLED, 1, tmp2+1); 259 sdrclk = AddClock(sysclk, "sdram clk", en ? FROM_PARENT: DISABLED, 1, tmp2+1);
@@ -233,18 +263,18 @@ void ClockAnalyser::FillTreeATJ213X()
233 263
234 // nand clk 264 // nand clk
235 QTreeWidgetItem *nandclk = 0; 265 QTreeWidgetItem *nandclk = 0;
236 if (helper.ReadRegisterField("CMU", "DEVCLKEN", "NAND", en) && 266 if(ReadFieldOld("CMU", "DEVCLKEN", "NAND", en) &&
237 helper.ReadRegisterField("CMU", "NANDCLK", "NANDDIV", tmp0)) 267 ReadFieldOld("CMU", "NANDCLK", "NANDDIV", tmp0))
238 nandclk = AddClock(corepll, "nand clk", en ? FROM_PARENT : DISABLED, 1, tmp0+1); 268 nandclk = AddClock(corepll, "nand clk", en ? FROM_PARENT : DISABLED, 1, tmp0+1);
239 else 269 else
240 nandclk = AddClock(corepll, "nand clk", INVALID); 270 nandclk = AddClock(corepll, "nand clk", INVALID);
241 271
242 // sd clk 272 // sd clk
243 QTreeWidgetItem *sdclk = 0; 273 QTreeWidgetItem *sdclk = 0;
244 if (helper.ReadRegisterField("CMU", "DEVCLKEN", "SD", tmp0) && 274 if(ReadFieldOld("CMU", "DEVCLKEN", "SD", tmp0) &&
245 helper.ReadRegisterField("CMU", "SDCLK", "CKEN" , tmp1) && 275 ReadFieldOld("CMU", "SDCLK", "CKEN" , tmp1) &&
246 helper.ReadRegisterField("CMU", "SDCLK", "D128" , tmp2) && 276 ReadFieldOld("CMU", "SDCLK", "D128" , tmp2) &&
247 helper.ReadRegisterField("CMU", "SDCLK", "SDDIV" , tmp3)) 277 ReadFieldOld("CMU", "SDCLK", "SDDIV" , tmp3))
248 { 278 {
249 en = tmp0 & tmp1; 279 en = tmp0 & tmp1;
250 sdclk = AddClock(corepll, "sd clk", en ? FROM_PARENT : DISABLED, 280 sdclk = AddClock(corepll, "sd clk", en ? FROM_PARENT : DISABLED,
@@ -255,8 +285,8 @@ void ClockAnalyser::FillTreeATJ213X()
255 285
256 // mha clk 286 // mha clk
257 QTreeWidgetItem *mhaclk = 0; 287 QTreeWidgetItem *mhaclk = 0;
258 if (helper.ReadRegisterField("CMU", "DEVCLKEN", "MHA", en) && 288 if(ReadFieldOld("CMU", "DEVCLKEN", "MHA", en) &&
259 helper.ReadRegisterField("CMU", "MHACLK", "MHADIV", tmp1)) 289 ReadFieldOld("CMU", "MHACLK", "MHADIV", tmp1))
260 mhaclk = AddClock(corepll, "mha clk", en ? FROM_PARENT : DISABLED, 290 mhaclk = AddClock(corepll, "mha clk", en ? FROM_PARENT : DISABLED,
261 1, tmp1+1); 291 1, tmp1+1);
262 else 292 else
@@ -264,8 +294,8 @@ void ClockAnalyser::FillTreeATJ213X()
264 294
265 // mca clk 295 // mca clk
266 QTreeWidgetItem *mcaclk = 0; 296 QTreeWidgetItem *mcaclk = 0;
267 if (helper.ReadRegisterField("CMU", "DEVCLKEN", "MCA", en) && 297 if(ReadFieldOld("CMU", "DEVCLKEN", "MCA", en) &&
268 helper.ReadRegisterField("CMU", "MCACLK", "MCADIV", tmp1)) 298 ReadFieldOld("CMU", "MCACLK", "MCADIV", tmp1))
269 mcaclk = AddClock(corepll, "mca clk", en ? FROM_PARENT : DISABLED, 299 mcaclk = AddClock(corepll, "mca clk", en ? FROM_PARENT : DISABLED,
270 1, tmp1+1); 300 1, tmp1+1);
271 else 301 else
@@ -273,11 +303,11 @@ void ClockAnalyser::FillTreeATJ213X()
273 303
274 // backlight pwm 304 // backlight pwm
275 QTreeWidgetItem *pwmclk = 0; 305 QTreeWidgetItem *pwmclk = 0;
276 if (helper.ReadRegisterField("CMU", "FMCLK", "BCKE", en) && 306 if(ReadFieldOld("CMU", "FMCLK", "BCKE", en) &&
277 helper.ReadRegisterField("CMU", "FMCLK", "BCKS", tmp1) && 307 ReadFieldOld("CMU", "FMCLK", "BCKS", tmp1) &&
278 helper.ReadRegisterField("CMU", "FMCLK", "BCKCON", tmp2)) 308 ReadFieldOld("CMU", "FMCLK", "BCKCON", tmp2))
279 { 309 {
280 if (tmp1) 310 if(tmp1)
281 { 311 {
282 // HOSC/8 input clk 312 // HOSC/8 input clk
283 pwmclk = AddClock(hosc_clk, "pwm clk", en ? FROM_PARENT : DISABLED, 313 pwmclk = AddClock(hosc_clk, "pwm clk", en ? FROM_PARENT : DISABLED,
@@ -296,9 +326,9 @@ void ClockAnalyser::FillTreeATJ213X()
296 // i2c clk 326 // i2c clk
297 QTreeWidgetItem *i2c1clk = 0; 327 QTreeWidgetItem *i2c1clk = 0;
298 QTreeWidgetItem *i2c2clk = 0; 328 QTreeWidgetItem *i2c2clk = 0;
299 if (helper.ReadRegisterField("CMU", "DEVCLKEN", "I2C", en) && 329 if(ReadFieldOld("CMU", "DEVCLKEN", "I2C", en) &&
300 helper.ReadRegisterField("I2C1", "CTL", "EN", tmp0) && 330 ReadFieldOld("I2C1", "CTL", "EN", tmp0) &&
301 helper.ReadRegisterField("I2C1", "CLKDIV", "CLKDIV", tmp1)) 331 ReadFieldOld("I2C1", "CLKDIV", "CLKDIV", tmp1))
302 { 332 {
303 en &= tmp0; 333 en &= tmp0;
304 i2c1clk = AddClock(pclk, "i2c1 clk", en ? FROM_PARENT : DISABLED, 334 i2c1clk = AddClock(pclk, "i2c1 clk", en ? FROM_PARENT : DISABLED,
@@ -309,16 +339,16 @@ void ClockAnalyser::FillTreeATJ213X()
309 i2c1clk = AddClock(pclk, "i2c1 clk", INVALID); 339 i2c1clk = AddClock(pclk, "i2c1 clk", INVALID);
310 } 340 }
311 341
312 if (helper.ReadRegisterField("CMU", "DEVCLKEN", "I2C", en) && 342 if(ReadFieldOld("CMU", "DEVCLKEN", "I2C", en) &&
313 helper.ReadRegisterField("I2C2", "CTL", "EN", tmp0) && 343 ReadFieldOld("I2C2", "CTL", "EN", tmp0) &&
314 helper.ReadRegisterField("I2C2", "CLKDIV", "CLKDIV", tmp1)) 344 ReadFieldOld("I2C2", "CLKDIV", "CLKDIV", tmp1))
315 { 345 {
316 en &= tmp0; 346 en &= tmp0;
317 i2c2clk = AddClock(pclk, "i2c2 clk", en ? FROM_PARENT : DISABLED, 347 i2c2clk = AddClock(pclk, "i2c2 clk", en ? FROM_PARENT : DISABLED,
318 1, 16*(tmp1+1)); 348 1, 16*(tmp1+1));
319 } 349 }
320 else 350 else
321 { 351 {
322 i2c2clk = AddClock(pclk, "i2c2 clk", INVALID); 352 i2c2clk = AddClock(pclk, "i2c2 clk", INVALID);
323 } 353 }
324 354
@@ -340,17 +370,15 @@ void ClockAnalyser::FillTreeRK27XX()
340 soc_word_t value, value2, value3, value4; 370 soc_word_t value, value2, value3, value4;
341 soc_word_t bypass, clkr, clkf, clkod, pll_off; 371 soc_word_t bypass, clkr, clkf, clkod, pll_off;
342 372
343 BackendHelper helper(m_io_backend, m_soc);
344
345 QTreeWidgetItem *xtal_clk = AddClock(0, "xtal clk", 24000000); 373 QTreeWidgetItem *xtal_clk = AddClock(0, "xtal clk", 24000000);
346 374
347 // F = (Fref*F)/R/OD = (Fref*F)/R/OD 375 // F = (Fref*F)/R/OD = (Fref*F)/R/OD
348 QTreeWidgetItem *arm_pll = 0; 376 QTreeWidgetItem *arm_pll = 0;
349 if (helper.ReadRegisterField("SCU", "PLLCON1", "ARM_PLL_BYPASS", bypass) && 377 if(ReadFieldOld("SCU", "PLLCON1", "ARM_PLL_BYPASS", bypass) &&
350 helper.ReadRegisterField("SCU", "PLLCON1", "ARM_PLL_CLKR", clkr) && 378 ReadFieldOld("SCU", "PLLCON1", "ARM_PLL_CLKR", clkr) &&
351 helper.ReadRegisterField("SCU", "PLLCON1", "ARM_PLL_CLKF", clkf) && 379 ReadFieldOld("SCU", "PLLCON1", "ARM_PLL_CLKF", clkf) &&
352 helper.ReadRegisterField("SCU", "PLLCON1", "ARM_PLL_CLKOD", clkod) && 380 ReadFieldOld("SCU", "PLLCON1", "ARM_PLL_CLKOD", clkod) &&
353 helper.ReadRegisterField("SCU", "PLLCON1", "ARM_PLL_POWERDOWN", pll_off)) 381 ReadFieldOld("SCU", "PLLCON1", "ARM_PLL_POWERDOWN", pll_off))
354 { 382 {
355 arm_pll = AddClock(xtal_clk, "arm pll", pll_off ? DISABLED : FROM_PARENT, 383 arm_pll = AddClock(xtal_clk, "arm pll", pll_off ? DISABLED : FROM_PARENT,
356 bypass ? 1 : clkf+1, bypass ? 1 : (clkr+1)*(clkod+1)); 384 bypass ? 1 : clkf+1, bypass ? 1 : (clkr+1)*(clkod+1));
@@ -363,9 +391,9 @@ void ClockAnalyser::FillTreeRK27XX()
363 QTreeWidgetItem *arm_clk = 0; 391 QTreeWidgetItem *arm_clk = 0;
364 QTreeWidgetItem *hclk = 0; 392 QTreeWidgetItem *hclk = 0;
365 QTreeWidgetItem *pclk = 0; 393 QTreeWidgetItem *pclk = 0;
366 if(helper.ReadRegisterField("SCU", "DIVCON1", "ARM_SLOW_MODE", value) && 394 if(ReadFieldOld("SCU", "DIVCON1", "ARM_SLOW_MODE", value) &&
367 helper.ReadRegisterField("SCU", "DIVCON1", "ARM_CLK_DIV", value2) && 395 ReadFieldOld("SCU", "DIVCON1", "ARM_CLK_DIV", value2) &&
368 helper.ReadRegisterField("SCU", "DIVCON1", "PCLK_CLK_DIV", value3)) 396 ReadFieldOld("SCU", "DIVCON1", "PCLK_CLK_DIV", value3))
369 { 397 {
370 arm_clk = AddClock(value ? xtal_clk : arm_pll, "arm clk", FROM_PARENT, 1, value2 ? 2 : 1); 398 arm_clk = AddClock(value ? xtal_clk : arm_pll, "arm clk", FROM_PARENT, 1, value2 ? 2 : 1);
371 hclk = AddClock(arm_clk, "hclk", FROM_PARENT, 1, value2 ? 1 : 2); 399 hclk = AddClock(arm_clk, "hclk", FROM_PARENT, 1, value2 ? 1 : 2);
@@ -379,11 +407,11 @@ void ClockAnalyser::FillTreeRK27XX()
379 } 407 }
380 408
381 QTreeWidgetItem *dsp_pll = 0; 409 QTreeWidgetItem *dsp_pll = 0;
382 if (helper.ReadRegisterField("SCU", "PLLCON2", "DSP_PLL_BYPASS", bypass) && 410 if(ReadFieldOld("SCU", "PLLCON2", "DSP_PLL_BYPASS", bypass) &&
383 helper.ReadRegisterField("SCU", "PLLCON2", "DSP_PLL_CLKR", clkr) && 411 ReadFieldOld("SCU", "PLLCON2", "DSP_PLL_CLKR", clkr) &&
384 helper.ReadRegisterField("SCU", "PLLCON2", "DSP_PLL_CLKF", clkf) && 412 ReadFieldOld("SCU", "PLLCON2", "DSP_PLL_CLKF", clkf) &&
385 helper.ReadRegisterField("SCU", "PLLCON2", "DSP_PLL_CLKOD", clkod) && 413 ReadFieldOld("SCU", "PLLCON2", "DSP_PLL_CLKOD", clkod) &&
386 helper.ReadRegisterField("SCU", "PLLCON2", "DSP_PLL_POWERDOWN", pll_off)) 414 ReadFieldOld("SCU", "PLLCON2", "DSP_PLL_POWERDOWN", pll_off))
387 { 415 {
388 dsp_pll = AddClock(xtal_clk, "dsp pll", pll_off ? DISABLED : FROM_PARENT, 416 dsp_pll = AddClock(xtal_clk, "dsp pll", pll_off ? DISABLED : FROM_PARENT,
389 bypass ? 1 : clkf+1, bypass ? 1 : (clkr+1)*(clkod+1)); 417 bypass ? 1 : clkf+1, bypass ? 1 : (clkr+1)*(clkod+1));
@@ -396,11 +424,11 @@ void ClockAnalyser::FillTreeRK27XX()
396 QTreeWidgetItem *dsp_clk = AddClock(dsp_pll, "dsp clk", FROM_PARENT); 424 QTreeWidgetItem *dsp_clk = AddClock(dsp_pll, "dsp clk", FROM_PARENT);
397 425
398 QTreeWidgetItem *codec_pll = 0; 426 QTreeWidgetItem *codec_pll = 0;
399 if (helper.ReadRegisterField("SCU", "PLLCON3", "CODEC_PLL_BYPASS", bypass) && 427 if(ReadFieldOld("SCU", "PLLCON3", "CODEC_PLL_BYPASS", bypass) &&
400 helper.ReadRegisterField("SCU", "PLLCON3", "CODEC_PLL_CLKR", clkr) && 428 ReadFieldOld("SCU", "PLLCON3", "CODEC_PLL_CLKR", clkr) &&
401 helper.ReadRegisterField("SCU", "PLLCON3", "CODEC_PLL_CLKF", clkf) && 429 ReadFieldOld("SCU", "PLLCON3", "CODEC_PLL_CLKF", clkf) &&
402 helper.ReadRegisterField("SCU", "PLLCON3", "CODEC_PLL_CLKOD", clkod) && 430 ReadFieldOld("SCU", "PLLCON3", "CODEC_PLL_CLKOD", clkod) &&
403 helper.ReadRegisterField("SCU", "PLLCON3", "CODEC_PLL_POWERDOWN", pll_off)) 431 ReadFieldOld("SCU", "PLLCON3", "CODEC_PLL_POWERDOWN", pll_off))
404 { 432 {
405 codec_pll = AddClock(xtal_clk, "codec pll", pll_off ? DISABLED : FROM_PARENT, 433 codec_pll = AddClock(xtal_clk, "codec pll", pll_off ? DISABLED : FROM_PARENT,
406 bypass ? 1 : clkf+1, bypass ? 1 : (clkr+1)*(clkod+1)); 434 bypass ? 1 : clkf+1, bypass ? 1 : (clkr+1)*(clkod+1));
@@ -411,8 +439,8 @@ void ClockAnalyser::FillTreeRK27XX()
411 } 439 }
412 440
413 QTreeWidgetItem *codec_clk = 0; 441 QTreeWidgetItem *codec_clk = 0;
414 if (helper.ReadRegisterField("SCU", "DIVCON1", "CODEC_CLK_SRC", value) && 442 if(ReadFieldOld("SCU", "DIVCON1", "CODEC_CLK_SRC", value) &&
415 helper.ReadRegisterField("SCU", "DIVCON1", "CODEC_CLK_DIV", value2)) 443 ReadFieldOld("SCU", "DIVCON1", "CODEC_CLK_DIV", value2))
416 { 444 {
417 codec_clk = AddClock(value ? xtal_clk : codec_pll, "codec clk", FROM_PARENT, 1, value ? 1 : (value2 + 1)); 445 codec_clk = AddClock(value ? xtal_clk : codec_pll, "codec clk", FROM_PARENT, 1, value ? 1 : (value2 + 1));
418 } 446 }
@@ -422,7 +450,7 @@ void ClockAnalyser::FillTreeRK27XX()
422 } 450 }
423 451
424 QTreeWidgetItem *lsadc_clk = 0; 452 QTreeWidgetItem *lsadc_clk = 0;
425 if (helper.ReadRegisterField("SCU", "DIVCON1", "LSADC_CLK_DIV", value)) 453 if(ReadFieldOld("SCU", "DIVCON1", "LSADC_CLK_DIV", value))
426 { 454 {
427 lsadc_clk = AddClock(pclk, "lsadc clk", FROM_PARENT, 1, (value+1)); 455 lsadc_clk = AddClock(pclk, "lsadc clk", FROM_PARENT, 1, (value+1));
428 } 456 }
@@ -432,11 +460,11 @@ void ClockAnalyser::FillTreeRK27XX()
432 } 460 }
433 461
434 QTreeWidgetItem *lcdc_clk = 0; 462 QTreeWidgetItem *lcdc_clk = 0;
435 if (helper.ReadRegisterField("SCU", "DIVCON1", "LCDC_CLK", value) && 463 if(ReadFieldOld("SCU", "DIVCON1", "LCDC_CLK", value) &&
436 helper.ReadRegisterField("SCU", "DIVCON1", "LCDC_CLK_DIV", value2) && 464 ReadFieldOld("SCU", "DIVCON1", "LCDC_CLK_DIV", value2) &&
437 helper.ReadRegisterField("SCU", "DIVCON1", "LCDC_CLK_DIV_SRC", value3)) 465 ReadFieldOld("SCU", "DIVCON1", "LCDC_CLK_DIV_SRC", value3))
438 { 466 {
439 if (value) 467 if(value)
440 { 468 {
441 lcdc_clk = AddClock(xtal_clk, "lcdc clk", FROM_PARENT); 469 lcdc_clk = AddClock(xtal_clk, "lcdc clk", FROM_PARENT);
442 } 470 }
@@ -456,9 +484,9 @@ void ClockAnalyser::FillTreeRK27XX()
456 } 484 }
457 485
458 QTreeWidgetItem *pwm0_clk = 0; 486 QTreeWidgetItem *pwm0_clk = 0;
459 if(helper.ReadRegisterField("PWM0", "LRC", "TR", value) && 487 if(ReadFieldOld("PWM0", "LRC", "TR", value) &&
460 helper.ReadRegisterField("PWM0", "CTRL", "PRESCALE", value3) && 488 ReadFieldOld("PWM0", "CTRL", "PRESCALE", value3) &&
461 helper.ReadRegisterField("PWM0", "CTRL", "PWM_EN", value4)) 489 ReadFieldOld("PWM0", "CTRL", "PWM_EN", value4))
462 { 490 {
463 pwm0_clk = AddClock(pclk, "pwm0 clk", value4 ? FROM_PARENT : DISABLED, 1, 2*value*(1<<value3)); 491 pwm0_clk = AddClock(pclk, "pwm0 clk", value4 ? FROM_PARENT : DISABLED, 1, 2*value*(1<<value3));
464 } 492 }
@@ -468,9 +496,9 @@ void ClockAnalyser::FillTreeRK27XX()
468 } 496 }
469 497
470 QTreeWidgetItem *pwm1_clk = 0; 498 QTreeWidgetItem *pwm1_clk = 0;
471 if(helper.ReadRegisterField("PWM1", "LRC", "TR", value) && 499 if(ReadFieldOld("PWM1", "LRC", "TR", value) &&
472 helper.ReadRegisterField("PWM1", "CTRL", "PRESCALE", value3) && 500 ReadFieldOld("PWM1", "CTRL", "PRESCALE", value3) &&
473 helper.ReadRegisterField("PWM1", "CTRL", "PWM_EN", value4)) 501 ReadFieldOld("PWM1", "CTRL", "PWM_EN", value4))
474 { 502 {
475 pwm1_clk = AddClock(pclk, "pwm1 clk", value4 ? FROM_PARENT : DISABLED, 1, 2*value*(1<<value3)); 503 pwm1_clk = AddClock(pclk, "pwm1 clk", value4 ? FROM_PARENT : DISABLED, 1, 2*value*(1<<value3));
476 } 504 }
@@ -480,9 +508,9 @@ void ClockAnalyser::FillTreeRK27XX()
480 } 508 }
481 509
482 QTreeWidgetItem *pwm2_clk = 0; 510 QTreeWidgetItem *pwm2_clk = 0;
483 if(helper.ReadRegisterField("PWM2", "LRC", "TR", value) && 511 if(ReadFieldOld("PWM2", "LRC", "TR", value) &&
484 helper.ReadRegisterField("PWM2", "CTRL", "PRESCALE", value3) && 512 ReadFieldOld("PWM2", "CTRL", "PRESCALE", value3) &&
485 helper.ReadRegisterField("PWM2", "CTRL", "PWM_EN", value4)) 513 ReadFieldOld("PWM2", "CTRL", "PWM_EN", value4))
486 { 514 {
487 pwm2_clk = AddClock(pclk, "pwm2 clk", value4 ? FROM_PARENT : DISABLED, 1, 2*value*(1<<value3)); 515 pwm2_clk = AddClock(pclk, "pwm2 clk", value4 ? FROM_PARENT : DISABLED, 1, 2*value*(1<<value3));
488 } 516 }
@@ -492,9 +520,9 @@ void ClockAnalyser::FillTreeRK27XX()
492 } 520 }
493 521
494 QTreeWidgetItem *pwm3_clk = 0; 522 QTreeWidgetItem *pwm3_clk = 0;
495 if(helper.ReadRegisterField("PWM3", "LRC", "TR", value) && 523 if(ReadFieldOld("PWM3", "LRC", "TR", value) &&
496 helper.ReadRegisterField("PWM3", "CTRL", "PRESCALE", value3) && 524 ReadFieldOld("PWM3", "CTRL", "PRESCALE", value3) &&
497 helper.ReadRegisterField("PWM3", "CTRL", "PWM_EN", value4)) 525 ReadFieldOld("PWM3", "CTRL", "PWM_EN", value4))
498 { 526 {
499 pwm3_clk = AddClock(pclk, "pwm3", value4 ? FROM_PARENT : DISABLED, 1, 2*value*(1<<value3)); 527 pwm3_clk = AddClock(pclk, "pwm3", value4 ? FROM_PARENT : DISABLED, 1, 2*value*(1<<value3));
500 } 528 }
@@ -504,7 +532,7 @@ void ClockAnalyser::FillTreeRK27XX()
504 } 532 }
505 533
506 QTreeWidgetItem *sdmmc_clk = 0; 534 QTreeWidgetItem *sdmmc_clk = 0;
507 if(helper.ReadRegisterField("SD", "CTRL", "DIVIDER", value)) 535 if(ReadFieldOld("SD", "CTRL", "DIVIDER", value))
508 { 536 {
509 sdmmc_clk = AddClock(pclk, "sd clk", FROM_PARENT, 1, value+1); 537 sdmmc_clk = AddClock(pclk, "sd clk", FROM_PARENT, 1, value+1);
510 } 538 }
@@ -526,73 +554,72 @@ void ClockAnalyser::FillTreeRK27XX()
526 554
527void ClockAnalyser::FillTreeIMX233() 555void ClockAnalyser::FillTreeIMX233()
528{ 556{
529 BackendHelper helper(m_io_backend, m_soc);
530 soc_word_t value, value2, value3; 557 soc_word_t value, value2, value3;
531 558
532 QTreeWidgetItem *ring_osc = 0; 559 QTreeWidgetItem *ring_osc = 0;
533 if(helper.ReadRegisterField("POWER", "MINPWR", "ENABLE_OSC", value)) 560 if(ReadFieldOld("POWER", "MINPWR", "ENABLE_OSC", value))
534 ring_osc = AddClock(0, "ring_clk24m", value ? 24000000 : DISABLED); 561 ring_osc = AddClock(0, "ring_clk24m", value ? 24000000 : DISABLED);
535 else 562 else
536 ring_osc = AddClock(0, "ring_clk24m", INVALID); 563 ring_osc = AddClock(0, "ring_clk24m", INVALID);
537 QTreeWidgetItem *xtal_osc = 0; 564 QTreeWidgetItem *xtal_osc = 0;
538 if(helper.ReadRegisterField("POWER", "MINPWR", "PWD_XTAL24", value)) 565 if(ReadFieldOld("POWER", "MINPWR", "PWD_XTAL24", value))
539 xtal_osc = AddClock(0, "xtal_clk24m", value ? DISABLED : 24000000); 566 xtal_osc = AddClock(0, "xtal_clk24m", value ? DISABLED : 24000000);
540 else 567 else
541 xtal_osc = AddClock(0, "xtal_clk24m", INVALID); 568 xtal_osc = AddClock(0, "xtal_clk24m", INVALID);
542 QTreeWidgetItem *ref_xtal = 0; 569 QTreeWidgetItem *ref_xtal = 0;
543 if(helper.ReadRegisterField("POWER", "MINPWR", "SELECT_OSC", value)) 570 if(ReadFieldOld("POWER", "MINPWR", "SELECT_OSC", value))
544 ref_xtal = AddClock(value ? ring_osc : xtal_osc, "ref_xtal", FROM_PARENT); 571 ref_xtal = AddClock(value ? ring_osc : xtal_osc, "ref_xtal", FROM_PARENT);
545 else 572 else
546 ref_xtal = AddClock(0, "ref_xtal", INVALID); 573 ref_xtal = AddClock(0, "ref_xtal", INVALID);
547 574
548 QTreeWidgetItem *ref_pll = 0; 575 QTreeWidgetItem *ref_pll = 0;
549 if(helper.ReadRegisterField("CLKCTRL", "PLLCTRL0", "POWER", value)) 576 if(ReadFieldOld("CLKCTRL", "PLLCTRL0", "POWER", value))
550 ref_pll = AddClock(ref_xtal, "ref_pll", FROM_PARENT, 20); 577 ref_pll = AddClock(ref_xtal, "ref_pll", FROM_PARENT, 20);
551 else 578 else
552 ref_pll = AddClock(0, "ref_pll", INVALID); 579 ref_pll = AddClock(0, "ref_pll", INVALID);
553 580
554 QTreeWidgetItem *ref_io = 0; 581 QTreeWidgetItem *ref_io = 0;
555 if(helper.ReadRegisterField("CLKCTRL", "FRAC", "CLKGATEIO", value) && 582 if(ReadFieldOld("CLKCTRL", "FRAC", "CLKGATEIO", value) &&
556 helper.ReadRegisterField("CLKCTRL", "FRAC", "IOFRAC", value2)) 583 ReadFieldOld("CLKCTRL", "FRAC", "IOFRAC", value2))
557 ref_io = AddClock(ref_pll, "ref_io", value ? DISABLED : FROM_PARENT, 18, value2); 584 ref_io = AddClock(ref_pll, "ref_io", value ? DISABLED : FROM_PARENT, 18, value2);
558 else 585 else
559 ref_io = AddClock(ref_pll, "ref_io", INVALID); 586 ref_io = AddClock(ref_pll, "ref_io", INVALID);
560 587
561 QTreeWidgetItem *ref_pix = 0; 588 QTreeWidgetItem *ref_pix = 0;
562 if(helper.ReadRegisterField("CLKCTRL", "FRAC", "CLKGATEPIX", value) && 589 if(ReadFieldOld("CLKCTRL", "FRAC", "CLKGATEPIX", value) &&
563 helper.ReadRegisterField("CLKCTRL", "FRAC", "PIXFRAC", value2)) 590 ReadFieldOld("CLKCTRL", "FRAC", "PIXFRAC", value2))
564 ref_pix = AddClock(ref_pll, "ref_pix", value ? DISABLED : FROM_PARENT, 18, value2); 591 ref_pix = AddClock(ref_pll, "ref_pix", value ? DISABLED : FROM_PARENT, 18, value2);
565 else 592 else
566 ref_pix = AddClock(ref_pll, "ref_pix", INVALID); 593 ref_pix = AddClock(ref_pll, "ref_pix", INVALID);
567 594
568 QTreeWidgetItem *ref_emi = 0; 595 QTreeWidgetItem *ref_emi = 0;
569 if(helper.ReadRegisterField("CLKCTRL", "FRAC", "CLKGATEEMI", value) && 596 if(ReadFieldOld("CLKCTRL", "FRAC", "CLKGATEEMI", value) &&
570 helper.ReadRegisterField("CLKCTRL", "FRAC", "EMIFRAC", value2)) 597 ReadFieldOld("CLKCTRL", "FRAC", "EMIFRAC", value2))
571 ref_emi = AddClock(ref_pll, "ref_emi", value ? DISABLED : FROM_PARENT, 18, value2); 598 ref_emi = AddClock(ref_pll, "ref_emi", value ? DISABLED : FROM_PARENT, 18, value2);
572 else 599 else
573 ref_emi = AddClock(ref_pll, "ref_emi", INVALID); 600 ref_emi = AddClock(ref_pll, "ref_emi", INVALID);
574 601
575 QTreeWidgetItem *ref_cpu = 0; 602 QTreeWidgetItem *ref_cpu = 0;
576 if(helper.ReadRegisterField("CLKCTRL", "FRAC", "CLKGATECPU", value) && 603 if(ReadFieldOld("CLKCTRL", "FRAC", "CLKGATECPU", value) &&
577 helper.ReadRegisterField("CLKCTRL", "FRAC", "CPUFRAC", value2)) 604 ReadFieldOld("CLKCTRL", "FRAC", "CPUFRAC", value2))
578 ref_cpu = AddClock(ref_pll, "ref_cpu", value ? DISABLED : FROM_PARENT, 18, value2); 605 ref_cpu = AddClock(ref_pll, "ref_cpu", value ? DISABLED : FROM_PARENT, 18, value2);
579 else 606 else
580 ref_cpu = AddClock(ref_pll, "ref_cpu", INVALID); 607 ref_cpu = AddClock(ref_pll, "ref_cpu", INVALID);
581 608
582 QTreeWidgetItem *clk_p = 0; 609 QTreeWidgetItem *clk_p = 0;
583 if(helper.ReadRegisterField("CLKCTRL", "CLKSEQ", "BYPASS_CPU", value)) 610 if(ReadFieldOld("CLKCTRL", "CLKSEQ", "BYPASS_CPU", value))
584 { 611 {
585 if(!value) 612 if(!value)
586 { 613 {
587 if(helper.ReadRegisterField("CLKCTRL", "CPU", "DIV_CPU", value2)) 614 if(ReadFieldOld("CLKCTRL", "CPU", "DIV_CPU", value2))
588 clk_p = AddClock(ref_cpu, "clk_p", FROM_PARENT, 1, value2); 615 clk_p = AddClock(ref_cpu, "clk_p", FROM_PARENT, 1, value2);
589 else 616 else
590 clk_p = AddClock(ref_cpu, "clk_p", INVALID); 617 clk_p = AddClock(ref_cpu, "clk_p", INVALID);
591 } 618 }
592 else 619 else
593 { 620 {
594 if(helper.ReadRegisterField("CLKCTRL", "CPU", "DIV_XTAL_FRAC_EN", value) && 621 if(ReadFieldOld("CLKCTRL", "CPU", "DIV_XTAL_FRAC_EN", value) &&
595 helper.ReadRegisterField("CLKCTRL", "CPU", "DIV_XTAL", value2)) 622 ReadFieldOld("CLKCTRL", "CPU", "DIV_XTAL", value2))
596 clk_p = AddClock(ref_xtal, "clk_p", FROM_PARENT, value ? 1024 : 1, value2); 623 clk_p = AddClock(ref_xtal, "clk_p", FROM_PARENT, value ? 1024 : 1, value2);
597 else 624 else
598 clk_p = AddClock(ref_xtal, "clk_p", INVALID); 625 clk_p = AddClock(ref_xtal, "clk_p", INVALID);
@@ -602,101 +629,101 @@ void ClockAnalyser::FillTreeIMX233()
602 clk_p = AddClock(ref_xtal, "clk_p", INVALID); 629 clk_p = AddClock(ref_xtal, "clk_p", INVALID);
603 630
604 QTreeWidgetItem *clk_h = 0; 631 QTreeWidgetItem *clk_h = 0;
605 if(helper.ReadRegisterField("CLKCTRL", "HBUS", "DIV_FRAC_EN", value) && 632 if(ReadFieldOld("CLKCTRL", "HBUS", "DIV_FRAC_EN", value) &&
606 helper.ReadRegisterField("CLKCTRL", "HBUS", "DIV", value2)) 633 ReadFieldOld("CLKCTRL", "HBUS", "DIV", value2))
607 clk_h = AddClock(clk_p, "clk_h", FROM_PARENT, value ? 32 : 1, value2); 634 clk_h = AddClock(clk_p, "clk_h", FROM_PARENT, value ? 32 : 1, value2);
608 else 635 else
609 clk_h = AddClock(clk_p, "clk_h", INVALID); 636 clk_h = AddClock(clk_p, "clk_h", INVALID);
610 637
611 QTreeWidgetItem *clk_x = 0; 638 QTreeWidgetItem *clk_x = 0;
612 if(helper.ReadRegisterField("CLKCTRL", "XBUS", "DIV", value)) 639 if(ReadFieldOld("CLKCTRL", "XBUS", "DIV", value))
613 clk_x = AddClock(ref_xtal, "clk_x", FROM_PARENT, 1, value); 640 clk_x = AddClock(ref_xtal, "clk_x", FROM_PARENT, 1, value);
614 else 641 else
615 clk_x = AddClock(ref_xtal, "clk_x", INVALID); 642 clk_x = AddClock(ref_xtal, "clk_x", INVALID);
616 643
617 if(helper.ReadRegisterField("CLKCTRL", "XTAL", "UART_CLK_GATE", value)) 644 if(ReadFieldOld("CLKCTRL", "XTAL", "UART_CLK_GATE", value))
618 AddClock(ref_xtal, "clk_uart", value ? DISABLED : FROM_PARENT); 645 AddClock(ref_xtal, "clk_uart", value ? DISABLED : FROM_PARENT);
619 else 646 else
620 AddClock(ref_xtal, "clk_uart", INVALID); 647 AddClock(ref_xtal, "clk_uart", INVALID);
621 648
622 if(helper.ReadRegisterField("CLKCTRL", "XTAL", "FILT_CLK24M_GATE", value)) 649 if(ReadFieldOld("CLKCTRL", "XTAL", "FILT_CLK24M_GATE", value))
623 AddClock(ref_xtal, "clk_filt24m", value ? DISABLED : FROM_PARENT); 650 AddClock(ref_xtal, "clk_filt24m", value ? DISABLED : FROM_PARENT);
624 else 651 else
625 AddClock(ref_xtal, "clk_filt24m", INVALID); 652 AddClock(ref_xtal, "clk_filt24m", INVALID);
626 653
627 if(helper.ReadRegisterField("CLKCTRL", "XTAL", "PWM_CLK24M_GATE", value)) 654 if(ReadFieldOld("CLKCTRL", "XTAL", "PWM_CLK24M_GATE", value))
628 AddClock(ref_xtal, "clk_pwm24m", value ? DISABLED : FROM_PARENT); 655 AddClock(ref_xtal, "clk_pwm24m", value ? DISABLED : FROM_PARENT);
629 else 656 else
630 AddClock(ref_xtal, "clk_pwm24m", INVALID); 657 AddClock(ref_xtal, "clk_pwm24m", INVALID);
631 658
632 if(helper.ReadRegisterField("CLKCTRL", "XTAL", "DRI_CLK24M_GATE", value)) 659 if(ReadFieldOld("CLKCTRL", "XTAL", "DRI_CLK24M_GATE", value))
633 AddClock(ref_xtal, "clk_dri24m", value ? DISABLED : FROM_PARENT); 660 AddClock(ref_xtal, "clk_dri24m", value ? DISABLED : FROM_PARENT);
634 else 661 else
635 AddClock(ref_xtal, "clk_dri24m", INVALID); 662 AddClock(ref_xtal, "clk_dri24m", INVALID);
636 663
637 if(helper.ReadRegisterField("CLKCTRL", "XTAL", "DIGCTRL_CLK1M_GATE", value)) 664 if(ReadFieldOld("CLKCTRL", "XTAL", "DIGCTRL_CLK1M_GATE", value))
638 AddClock(ref_xtal, "clk_1m", value ? DISABLED : FROM_PARENT, 1, 24); 665 AddClock(ref_xtal, "clk_1m", value ? DISABLED : FROM_PARENT, 1, 24);
639 else 666 else
640 AddClock(ref_xtal, "clk_1m", INVALID); 667 AddClock(ref_xtal, "clk_1m", INVALID);
641 668
642 QTreeWidgetItem *clk_32k = 0; 669 QTreeWidgetItem *clk_32k = 0;
643 if(helper.ReadRegisterField("CLKCTRL", "XTAL", "TIMROT_CLK32K_GATE", value)) 670 if(ReadFieldOld("CLKCTRL", "XTAL", "TIMROT_CLK32K_GATE", value))
644 clk_32k = AddClock(ref_xtal, "clk_32k", value ? DISABLED : FROM_PARENT, 1, 750); 671 clk_32k = AddClock(ref_xtal, "clk_32k", value ? DISABLED : FROM_PARENT, 1, 750);
645 else 672 else
646 clk_32k = AddClock(ref_xtal, "clk_32k", INVALID); 673 clk_32k = AddClock(ref_xtal, "clk_32k", INVALID);
647 674
648 AddClock(clk_32k, "clk_adc", FROM_PARENT, 1, 16); 675 AddClock(clk_32k, "clk_adc", FROM_PARENT, 1, 16);
649 676
650 if(helper.ReadRegisterField("CLKCTRL", "CLKSEQ", "BYPASS_PIX", value) && 677 if(ReadFieldOld("CLKCTRL", "CLKSEQ", "BYPASS_PIX", value) &&
651 helper.ReadRegisterField("CLKCTRL", "PIX", "DIV", value2)) 678 ReadFieldOld("CLKCTRL", "PIX", "DIV", value2))
652 AddClock(value ? ref_xtal : ref_pix, "clk_pix", FROM_PARENT, 1, value2); 679 AddClock(value ? ref_xtal : ref_pix, "clk_pix", FROM_PARENT, 1, value2);
653 else 680 else
654 AddClock(ref_xtal, "clk_p", INVALID); 681 AddClock(ref_xtal, "clk_p", INVALID);
655 682
656 QTreeWidgetItem *clk_ssp = 0; 683 QTreeWidgetItem *clk_ssp = 0;
657 if(helper.ReadRegisterField("CLKCTRL", "CLKSEQ", "BYPASS_SSP", value) && 684 if(ReadFieldOld("CLKCTRL", "CLKSEQ", "BYPASS_SSP", value) &&
658 helper.ReadRegisterField("CLKCTRL", "SSP", "DIV", value2) && 685 ReadFieldOld("CLKCTRL", "SSP", "DIV", value2) &&
659 helper.ReadRegisterField("CLKCTRL", "SSP", "CLKGATE", value3)) 686 ReadFieldOld("CLKCTRL", "SSP", "CLKGATE", value3))
660 clk_ssp = AddClock(value ? ref_xtal : ref_io, "clk_ssp", value3 ? DISABLED : FROM_PARENT, 1, value2); 687 clk_ssp = AddClock(value ? ref_xtal : ref_io, "clk_ssp", value3 ? DISABLED : FROM_PARENT, 1, value2);
661 else 688 else
662 clk_ssp = AddClock(ref_xtal, "clk_p", INVALID); 689 clk_ssp = AddClock(ref_xtal, "clk_p", INVALID);
663 690
664 if(helper.ReadRegisterField("SSP1", "TIMING", "CLOCK_DIVIDE", value) && 691 if(ReadFieldOld("SSP1", "TIMING", "CLOCK_DIVIDE", value) &&
665 helper.ReadRegisterField("SSP1", "TIMING", "CLOCK_RATE", value2) && 692 ReadFieldOld("SSP1", "TIMING", "CLOCK_RATE", value2) &&
666 helper.ReadRegisterField("SSP1", "CTRL0", "CLKGATE", value3)) 693 ReadFieldOld("SSP1", "CTRL0", "CLKGATE", value3))
667 AddClock(clk_ssp, "clk_ssp1", value3 ? DISABLED : FROM_PARENT, 1, value * (1 + value2)); 694 AddClock(clk_ssp, "clk_ssp1", value3 ? DISABLED : FROM_PARENT, 1, value * (1 + value2));
668 else 695 else
669 AddClock(clk_ssp, "clk_ssp1", INVALID); 696 AddClock(clk_ssp, "clk_ssp1", INVALID);
670 697
671 if(helper.ReadRegisterField("SSP2", "TIMING", "CLOCK_DIVIDE", value) && 698 if(ReadFieldOld("SSP2", "TIMING", "CLOCK_DIVIDE", value) &&
672 helper.ReadRegisterField("SSP2", "TIMING", "CLOCK_RATE", value2) && 699 ReadFieldOld("SSP2", "TIMING", "CLOCK_RATE", value2) &&
673 helper.ReadRegisterField("SSP2", "CTRL0", "CLKGATE", value3)) 700 ReadFieldOld("SSP2", "CTRL0", "CLKGATE", value3))
674 AddClock(clk_ssp, "clk_ssp2", value3 ? DISABLED : FROM_PARENT, 1, value * (1 + value2)); 701 AddClock(clk_ssp, "clk_ssp2", value3 ? DISABLED : FROM_PARENT, 1, value * (1 + value2));
675 else 702 else
676 AddClock(clk_ssp, "clk_ssp2", INVALID); 703 AddClock(clk_ssp, "clk_ssp2", INVALID);
677 704
678 QTreeWidgetItem *clk_gpmi = 0; 705 QTreeWidgetItem *clk_gpmi = 0;
679 if(helper.ReadRegisterField("CLKCTRL", "CLKSEQ", "BYPASS_GPMI", value) && 706 if(ReadFieldOld("CLKCTRL", "CLKSEQ", "BYPASS_GPMI", value) &&
680 helper.ReadRegisterField("CLKCTRL", "GPMI", "DIV", value2) && 707 ReadFieldOld("CLKCTRL", "GPMI", "DIV", value2) &&
681 helper.ReadRegisterField("CLKCTRL", "GPMI", "CLKGATE", value3)) 708 ReadFieldOld("CLKCTRL", "GPMI", "CLKGATE", value3))
682 clk_gpmi = AddClock(value ? ref_xtal : ref_io, "clk_gpmi", value3 ? DISABLED : FROM_PARENT, 1, value2); 709 clk_gpmi = AddClock(value ? ref_xtal : ref_io, "clk_gpmi", value3 ? DISABLED : FROM_PARENT, 1, value2);
683 else 710 else
684 clk_gpmi = AddClock(ref_xtal, "clk_p", INVALID); 711 clk_gpmi = AddClock(ref_xtal, "clk_p", INVALID);
685 712
686 if(helper.ReadRegisterField("CLKCTRL", "CLKSEQ", "BYPASS_EMI", value)) 713 if(ReadFieldOld("CLKCTRL", "CLKSEQ", "BYPASS_EMI", value))
687 { 714 {
688 if(!value) 715 if(!value)
689 { 716 {
690 if(helper.ReadRegisterField("CLKCTRL", "EMI", "DIV_EMI", value2) && 717 if(ReadFieldOld("CLKCTRL", "EMI", "DIV_EMI", value2) &&
691 helper.ReadRegisterField("CLKCTRL", "EMI", "CLKGATE", value3)) 718 ReadFieldOld("CLKCTRL", "EMI", "CLKGATE", value3))
692 AddClock(ref_emi, "clk_emi", value3 ? DISABLED : FROM_PARENT, 1, value2); 719 AddClock(ref_emi, "clk_emi", value3 ? DISABLED : FROM_PARENT, 1, value2);
693 else 720 else
694 AddClock(ref_emi, "clk_emi", INVALID); 721 AddClock(ref_emi, "clk_emi", INVALID);
695 } 722 }
696 else 723 else
697 { 724 {
698 if(helper.ReadRegisterField("CLKCTRL", "EMI", "DIV_XTAL", value2) && 725 if(ReadFieldOld("CLKCTRL", "EMI", "DIV_XTAL", value2) &&
699 helper.ReadRegisterField("CLKCTRL", "EMI", "CLKGATE", value3)) 726 ReadFieldOld("CLKCTRL", "EMI", "CLKGATE", value3))
700 AddClock(ref_xtal, "clk_emi", value3 ? DISABLED : FROM_PARENT, 1, value2); 727 AddClock(ref_xtal, "clk_emi", value3 ? DISABLED : FROM_PARENT, 1, value2);
701 else 728 else
702 AddClock(ref_xtal, "clk_emi", INVALID); 729 AddClock(ref_xtal, "clk_emi", INVALID);
@@ -707,27 +734,27 @@ void ClockAnalyser::FillTreeIMX233()
707 734
708 QTreeWidgetItem *ref_vid = AddClock(ref_pll, "clk_vid", FROM_PARENT); 735 QTreeWidgetItem *ref_vid = AddClock(ref_pll, "clk_vid", FROM_PARENT);
709 736
710 if(helper.ReadRegisterField("CLKCTRL", "TV", "CLK_TV108M_GATE", value) && 737 if(ReadFieldOld("CLKCTRL", "TV", "CLK_TV108M_GATE", value) &&
711 helper.ReadRegisterField("CLKCTRL", "TV", "CLK_TV_GATE", value2)) 738 ReadFieldOld("CLKCTRL", "TV", "CLK_TV_GATE", value2))
712 { 739 {
713 QTreeWidgetItem *clk_tv108m = AddClock(ref_vid, "clk_tv108m", value ? DISABLED : FROM_PARENT, 1, 4); 740 QTreeWidgetItem *clk_tv108m = AddClock(ref_vid, "clk_tv108m", value ? DISABLED : FROM_PARENT, 1, 4);
714 AddClock(clk_tv108m, "clk_tv54m", value2 ? DISABLED : FROM_PARENT, 1, 2); 741 AddClock(clk_tv108m, "clk_tv54m", value2 ? DISABLED : FROM_PARENT, 1, 2);
715 AddClock(clk_tv108m, "clk_tv27m", value2 ? DISABLED : FROM_PARENT, 1, 4); 742 AddClock(clk_tv108m, "clk_tv27m", value2 ? DISABLED : FROM_PARENT, 1, 4);
716 } 743 }
717 744
718 if(helper.ReadRegisterField("CLKCTRL", "PLLCTRL0", "EN_USB_CLKS", value)) 745 if(ReadFieldOld("CLKCTRL", "PLLCTRL0", "EN_USB_CLKS", value))
719 AddClock(ref_pll, "utmi_clk480m", value ? FROM_PARENT : DISABLED); 746 AddClock(ref_pll, "utmi_clk480m", value ? FROM_PARENT : DISABLED);
720 else 747 else
721 AddClock(ref_pll, "utmi_clk480m", INVALID); 748 AddClock(ref_pll, "utmi_clk480m", INVALID);
722 749
723 QTreeWidgetItem *xtal_clk32k = 0; 750 QTreeWidgetItem *xtal_clk32k = 0;
724 if(helper.ReadRegisterField("RTC", "PERSISTENT0", "XTAL32_FREQ", value) && 751 if(ReadFieldOld("RTC", "PERSISTENT0", "XTAL32_FREQ", value) &&
725 helper.ReadRegisterField("RTC", "PERSISTENT0", "XTAL32KHZ_PWRUP", value2)) 752 ReadFieldOld("RTC", "PERSISTENT0", "XTAL32KHZ_PWRUP", value2))
726 xtal_clk32k = AddClock(0, "xtal_clk32k", value2 == 0 ? DISABLED : value ? 32000 : 32768); 753 xtal_clk32k = AddClock(0, "xtal_clk32k", value2 == 0 ? DISABLED : value ? 32000 : 32768);
727 else 754 else
728 xtal_clk32k = AddClock(0, "xtal_clk32k", INVALID); 755 xtal_clk32k = AddClock(0, "xtal_clk32k", INVALID);
729 756
730 if(helper.ReadRegisterField("RTC", "PERSISTENT0", "CLOCKSOURCE", value)) 757 if(ReadFieldOld("RTC", "PERSISTENT0", "CLOCKSOURCE", value))
731 AddClock(value ? xtal_clk32k : ref_xtal, "clk_rtc32k", FROM_PARENT, 1, value ? 1 : 768); 758 AddClock(value ? xtal_clk32k : ref_xtal, "clk_rtc32k", FROM_PARENT, 1, value ? 1 : 768);
732 else 759 else
733 AddClock(ref_xtal, "clk_rtc32k", INVALID); 760 AddClock(ref_xtal, "clk_rtc32k", INVALID);
@@ -742,8 +769,8 @@ static TmplAnalyserFactory< ClockAnalyser > g_clock_factory(true, "Clock Analyse
742/** 769/**
743 * EMI analyser 770 * EMI analyser
744 */ 771 */
745EmiAnalyser::EmiAnalyser(const SocRef& soc, IoBackend *backend) 772EmiAnalyser::EmiAnalyser(const soc_desc::soc_ref_t& soc, IoBackend *backend)
746 :Analyser(soc, backend) 773 :AnalyserEx(soc, backend)
747{ 774{
748 m_display_mode = DisplayCycles; 775 m_display_mode = DisplayCycles;
749 m_group = new QGroupBox("EMI Analyser"); 776 m_group = new QGroupBox("EMI Analyser");
@@ -870,26 +897,25 @@ void EmiAnalyser::FillTable()
870{ 897{
871 while(m_panel->count() > 0) 898 while(m_panel->count() > 0)
872 m_panel->removeItem(0); 899 m_panel->removeItem(0);
873 BackendHelper helper(m_io_backend, m_soc);
874 soc_word_t value; 900 soc_word_t value;
875 901
876 m_emi_freq = 0; 902 m_emi_freq = 0;
877 if(helper.ReadRegisterField("CLKCTRL", "CLKSEQ", "BYPASS_EMI", value)) 903 if(ReadFieldOld("CLKCTRL", "CLKSEQ", "BYPASS_EMI", value))
878 { 904 {
879 bool ret; 905 bool ret;
880 if(value) 906 if(value)
881 { 907 {
882 m_emi_freq = 24000000; 908 m_emi_freq = 24000000;
883 ret = helper.ReadRegisterField("CLKCTRL", "EMI", "DIV_XTAL", value); 909 ret = ReadFieldOld("CLKCTRL", "EMI", "DIV_XTAL", value);
884 } 910 }
885 else 911 else
886 { 912 {
887 m_emi_freq = 480000000; 913 m_emi_freq = 480000000;
888 if(helper.ReadRegisterField("CLKCTRL", "FRAC", "EMIFRAC", value)) 914 if(ReadFieldOld("CLKCTRL", "FRAC", "EMIFRAC", value))
889 m_emi_freq = 18 * (int64_t)m_emi_freq / value; 915 m_emi_freq = 18 * (int64_t)m_emi_freq / value;
890 else 916 else
891 m_emi_freq = 0; 917 m_emi_freq = 0;
892 ret = helper.ReadRegisterField("CLKCTRL", "EMI", "DIV_EMI", value); 918 ret = ReadFieldOld("CLKCTRL", "EMI", "DIV_EMI", value);
893 } 919 }
894 if(ret) 920 if(ret)
895 m_emi_freq /= value; 921 m_emi_freq /= value;
@@ -900,7 +926,7 @@ void EmiAnalyser::FillTable()
900 m_emi_freq_label->setText(QString().sprintf("%.3f", m_emi_freq / 1000000.0)); 926 m_emi_freq_label->setText(QString().sprintf("%.3f", m_emi_freq / 1000000.0));
901 927
902 NewGroup("Control Parameters"); 928 NewGroup("Control Parameters");
903 if(helper.ReadRegisterField("EMI", "CTRL", "PORT_PRIORITY_ORDER", value)) 929 if(ReadFieldOld("EMI", "CTRL", "PORT_PRIORITY_ORDER", value))
904 { 930 {
905 QStringList ports; 931 QStringList ports;
906 ports << "AXI0" << "AHB1" << "AHB2" << "AHB3"; 932 ports << "AXI0" << "AHB1" << "AHB2" << "AHB3";
@@ -913,38 +939,38 @@ void EmiAnalyser::FillTable()
913 AddLine("Port Priority Order", value, "", order); 939 AddLine("Port Priority Order", value, "", order);
914 } 940 }
915 941
916 if(helper.ReadRegisterField("EMI", "CTRL", "MEM_WIDTH", value)) 942 if(ReadFieldOld("EMI", "CTRL", "MEM_WIDTH", value))
917 AddLine("Memory Width", value ? 16 : 8, "-bit"); 943 AddLine("Memory Width", value ? 16 : 8, "-bit");
918 944
919 if(helper.ReadRegisterField("DRAM", "CTL03", "AP", value)) 945 if(ReadFieldOld("DRAM", "CTL03", "AP", value))
920 AddLine("Auto Pre-Charge", NONE, value ? "Yes" : "No"); 946 AddLine("Auto Pre-Charge", NONE, value ? "Yes" : "No");
921 947
922 bool bypass_mode = false; 948 bool bypass_mode = false;
923 if(helper.ReadRegisterField("DRAM", "CTL04", "DLL_BYPASS_MODE", value)) 949 if(ReadFieldOld("DRAM", "CTL04", "DLL_BYPASS_MODE", value))
924 { 950 {
925 bypass_mode = value == 1; 951 bypass_mode = value == 1;
926 AddLine("DLL Bypass Mode", NONE, value ? "Yes" : "No"); 952 AddLine("DLL Bypass Mode", NONE, value ? "Yes" : "No");
927 } 953 }
928 954
929 if(helper.ReadRegisterField("DRAM", "CTL05", "EN_LOWPOWER_MODE", value)) 955 if(ReadFieldOld("DRAM", "CTL05", "EN_LOWPOWER_MODE", value))
930 AddLine("Low Power Mode", NONE, value ? "Enabled" : "Disabled"); 956 AddLine("Low Power Mode", NONE, value ? "Enabled" : "Disabled");
931 957
932 if(helper.ReadRegisterField("DRAM", "CTL08", "SREFRESH", value)) 958 if(ReadFieldOld("DRAM", "CTL08", "SREFRESH", value))
933 AddLine("Self Refresh", NONE, value ? "Yes" : "No"); 959 AddLine("Self Refresh", NONE, value ? "Yes" : "No");
934 960
935 if(helper.ReadRegisterField("DRAM", "CTL08", "SDR_MODE", value)) 961 if(ReadFieldOld("DRAM", "CTL08", "SDR_MODE", value))
936 AddLine("Mode", NONE, value ? "SDR" : "DDR"); 962 AddLine("Mode", NONE, value ? "SDR" : "DDR");
937 963
938 if(helper.ReadRegisterField("DRAM", "CTL10", "ADDR_PINS", value)) 964 if(ReadFieldOld("DRAM", "CTL10", "ADDR_PINS", value))
939 AddLine("Address Pins", 13 - value, ""); 965 AddLine("Address Pins", 13 - value, "");
940 966
941 if(helper.ReadRegisterField("DRAM", "CTL11", "COLUMN_SIZE", value)) 967 if(ReadFieldOld("DRAM", "CTL11", "COLUMN_SIZE", value))
942 AddLine("Column Size", 12 - value, "-bit"); 968 AddLine("Column Size", 12 - value, "-bit");
943 969
944 if(helper.ReadRegisterField("DRAM", "CTL11", "CASLAT", value)) 970 if(ReadFieldOld("DRAM", "CTL11", "CASLAT", value))
945 AddLine("Encoded CAS", value, "", "Memory device dependent"); 971 AddLine("Encoded CAS", value, "", "Memory device dependent");
946 972
947 if(helper.ReadRegisterField("DRAM", "CTL14", "CS_MAP", value)) 973 if(ReadFieldOld("DRAM", "CTL14", "CS_MAP", value))
948 { 974 {
949 QString v; 975 QString v;
950 for(int i = 0; i < 4; i++) 976 for(int i = 0; i < 4; i++)
@@ -957,12 +983,12 @@ void EmiAnalyser::FillTable()
957 AddLine("Chip Select Pins", NONE, v, ""); 983 AddLine("Chip Select Pins", NONE, v, "");
958 } 984 }
959 985
960 if(helper.ReadRegisterField("DRAM", "CTL37", "TREF_ENABLE", value)) 986 if(ReadFieldOld("DRAM", "CTL37", "TREF_ENABLE", value))
961 AddLine("Refresh Commands", NONE, value ? "Enabled" : "Disabled", "Issue self-refresh every TREF cycles"); 987 AddLine("Refresh Commands", NONE, value ? "Enabled" : "Disabled", "Issue self-refresh every TREF cycles");
962 988
963 NewGroup("Frequency Parameters"); 989 NewGroup("Frequency Parameters");
964 990
965 if(helper.ReadRegisterField("DRAM", "CTL13", "CASLAT_LIN_GATE", value)) 991 if(ReadFieldOld("DRAM", "CTL13", "CASLAT_LIN_GATE", value))
966 { 992 {
967 if(value >= 3 && value <= 10 && value != 9) 993 if(value >= 3 && value <= 10 && value != 9)
968 { 994 {
@@ -972,7 +998,7 @@ void EmiAnalyser::FillTable()
972 else 998 else
973 AddLine("CAS Gate", NONE, "Reserved", "Reserved value"); 999 AddLine("CAS Gate", NONE, "Reserved", "Reserved value");
974 } 1000 }
975 if(helper.ReadRegisterField("DRAM", "CTL13", "CASLAT_LIN", value)) 1001 if(ReadFieldOld("DRAM", "CTL13", "CASLAT_LIN", value))
976 { 1002 {
977 if(value >= 3 && value <= 10 && value != 9) 1003 if(value >= 3 && value <= 10 && value != 9)
978 { 1004 {
@@ -983,97 +1009,97 @@ void EmiAnalyser::FillTable()
983 AddLine("CAS Latency", NONE, "Reserved", "Reserved value"); 1009 AddLine("CAS Latency", NONE, "Reserved", "Reserved value");
984 } 1010 }
985 1011
986 if(helper.ReadRegisterField("DRAM", "CTL12", "TCKE", value)) 1012 if(ReadFieldOld("DRAM", "CTL12", "TCKE", value))
987 AddCycleLine("tCKE", value, value, 0, "Minimum CKE pulse width"); 1013 AddCycleLine("tCKE", value, value, 0, "Minimum CKE pulse width");
988 1014
989 if(helper.ReadRegisterField("DRAM", "CTL15", "TDAL", value)) 1015 if(ReadFieldOld("DRAM", "CTL15", "TDAL", value))
990 AddCycleLine("tDAL", value, value, 0, "Auto pre-charge write recovery time"); 1016 AddCycleLine("tDAL", value, value, 0, "Auto pre-charge write recovery time");
991 1017
992 if(helper.ReadRegisterField("DRAM", "CTL31", "TDLL", value)) 1018 if(ReadFieldOld("DRAM", "CTL31", "TDLL", value))
993 AddCycleLine("tDLL", value, value, 0, "DLL lock time"); 1019 AddCycleLine("tDLL", value, value, 0, "DLL lock time");
994 1020
995 if(helper.ReadRegisterField("DRAM", "CTL10", "TEMRS", value)) 1021 if(ReadFieldOld("DRAM", "CTL10", "TEMRS", value))
996 AddCycleLine("tEMRS", value, value, 0, "Extended mode parameter set time"); 1022 AddCycleLine("tEMRS", value, value, 0, "Extended mode parameter set time");
997 1023
998 if(helper.ReadRegisterField("DRAM", "CTL34", "TINIT", value)) 1024 if(ReadFieldOld("DRAM", "CTL34", "TINIT", value))
999 AddCycleLine("tINIT", value, value, 0, "Initialisation time"); 1025 AddCycleLine("tINIT", value, value, 0, "Initialisation time");
1000 1026
1001 if(helper.ReadRegisterField("DRAM", "CTL16", "TMRD", value)) 1027 if(ReadFieldOld("DRAM", "CTL16", "TMRD", value))
1002 AddCycleLine("tMRD", value, value, 0, "Mode register set command time"); 1028 AddCycleLine("tMRD", value, value, 0, "Mode register set command time");
1003 1029
1004 if(helper.ReadRegisterField("DRAM", "CTL40", "TPDEX", value)) 1030 if(ReadFieldOld("DRAM", "CTL40", "TPDEX", value))
1005 AddCycleLine("tPDEX", value, value, 0, "Power down exit time"); 1031 AddCycleLine("tPDEX", value, value, 0, "Power down exit time");
1006 1032
1007 if(helper.ReadRegisterField("DRAM", "CTL32", "TRAS_MAX", value)) 1033 if(ReadFieldOld("DRAM", "CTL32", "TRAS_MAX", value))
1008 AddCycleLine("tRAS Max", value, value, 0, "Maximum row activate time"); 1034 AddCycleLine("tRAS Max", value, value, 0, "Maximum row activate time");
1009 1035
1010 if(helper.ReadRegisterField("DRAM", "CTL20", "TRAS_MIN", value)) 1036 if(ReadFieldOld("DRAM", "CTL20", "TRAS_MIN", value))
1011 AddCycleLine("tRAS Min", value, value, 0, "Minimum row activate time"); 1037 AddCycleLine("tRAS Min", value, value, 0, "Minimum row activate time");
1012 1038
1013 if(helper.ReadRegisterField("DRAM", "CTL17", "TRC", value)) 1039 if(ReadFieldOld("DRAM", "CTL17", "TRC", value))
1014 AddCycleLine("tRC", value, value, 0, "Activate to activate delay (same bank)"); 1040 AddCycleLine("tRC", value, value, 0, "Activate to activate delay (same bank)");
1015 1041
1016 if(helper.ReadRegisterField("DRAM", "CTL20", "TRCD_INT", value)) 1042 if(ReadFieldOld("DRAM", "CTL20", "TRCD_INT", value))
1017 AddCycleLine("tRCD", value, value, 0, "RAS to CAS"); 1043 AddCycleLine("tRCD", value, value, 0, "RAS to CAS");
1018 1044
1019 if(helper.ReadRegisterField("DRAM", "CTL26", "TREF", value)) 1045 if(ReadFieldOld("DRAM", "CTL26", "TREF", value))
1020 AddCycleLine("tREF", value, value, 0, "Refresh to refresh time"); 1046 AddCycleLine("tREF", value, value, 0, "Refresh to refresh time");
1021 1047
1022 if(helper.ReadRegisterField("DRAM", "CTL21", "TRFC", value)) 1048 if(ReadFieldOld("DRAM", "CTL21", "TRFC", value))
1023 AddCycleLine("tRFC", value, value, 0, "Refresh command time"); 1049 AddCycleLine("tRFC", value, value, 0, "Refresh command time");
1024 1050
1025 if(helper.ReadRegisterField("DRAM", "CTL15", "TRP", value)) 1051 if(ReadFieldOld("DRAM", "CTL15", "TRP", value))
1026 AddCycleLine("tRP", value, value, 0, "Pre-charge command time"); 1052 AddCycleLine("tRP", value, value, 0, "Pre-charge command time");
1027 1053
1028 if(helper.ReadRegisterField("DRAM", "CTL12", "TRRD", value)) 1054 if(ReadFieldOld("DRAM", "CTL12", "TRRD", value))
1029 AddCycleLine("tRRD", value, value, 0, "Activate to activate delay (different banks)"); 1055 AddCycleLine("tRRD", value, value, 0, "Activate to activate delay (different banks)");
1030 1056
1031 if(helper.ReadRegisterField("DRAM", "CTL12", "TWR_INT", value)) 1057 if(ReadFieldOld("DRAM", "CTL12", "TWR_INT", value))
1032 AddCycleLine("tWR", value, value, 0, "Write recovery time"); 1058 AddCycleLine("tWR", value, value, 0, "Write recovery time");
1033 1059
1034 if(helper.ReadRegisterField("DRAM", "CTL13", "TWTR", value)) 1060 if(ReadFieldOld("DRAM", "CTL13", "TWTR", value))
1035 AddCycleLine("tWTR", value, value, 0, "Write to read delay"); 1061 AddCycleLine("tWTR", value, value, 0, "Write to read delay");
1036 1062
1037 if(helper.ReadRegisterField("DRAM", "CTL32", "TXSNR", value)) 1063 if(ReadFieldOld("DRAM", "CTL32", "TXSNR", value))
1038 AddCycleLine("tXSNR", value, value, 0, ""); 1064 AddCycleLine("tXSNR", value, value, 0, "");
1039 1065
1040 if(helper.ReadRegisterField("DRAM", "CTL33", "TXSR", value)) 1066 if(ReadFieldOld("DRAM", "CTL33", "TXSR", value))
1041 AddCycleLine("tXSR", value, value, 0, "Self-refresh exit time"); 1067 AddCycleLine("tXSR", value, value, 0, "Self-refresh exit time");
1042 1068
1043 NewGroup("DLL Parameters"); 1069 NewGroup("DLL Parameters");
1044 1070
1045 if(bypass_mode) 1071 if(bypass_mode)
1046 { 1072 {
1047 if(helper.ReadRegisterField("DRAM", "CTL19", "DLL_DQS_DELAY_BYPASS_0", value)) 1073 if(ReadFieldOld("DRAM", "CTL19", "DLL_DQS_DELAY_BYPASS_0", value))
1048 AddLine("DLL DQS Delay 0", value, "", "In 1/128 fraction of a cycle (bypass mode)"); 1074 AddLine("DLL DQS Delay 0", value, "", "In 1/128 fraction of a cycle (bypass mode)");
1049 1075
1050 if(helper.ReadRegisterField("DRAM", "CTL19", "DLL_DQS_DELAY_BYPASS_0", value)) 1076 if(ReadFieldOld("DRAM", "CTL19", "DLL_DQS_DELAY_BYPASS_0", value))
1051 AddLine("DLL DQS Delay 1", value, "", "In 1/128 fraction of a cycle (bypass mode)"); 1077 AddLine("DLL DQS Delay 1", value, "", "In 1/128 fraction of a cycle (bypass mode)");
1052 1078
1053 if(helper.ReadRegisterField("DRAM", "CTL19", "DQS_OUT_SHIFT_BYPASS", value)) 1079 if(ReadFieldOld("DRAM", "CTL19", "DQS_OUT_SHIFT_BYPASS", value))
1054 AddLine("DQS Out Delay", value, "", "(bypass mode)"); 1080 AddLine("DQS Out Delay", value, "", "(bypass mode)");
1055 1081
1056 if(helper.ReadRegisterField("DRAM", "CTL20", "WR_DQS_SHIFT_BYPASS", value)) 1082 if(ReadFieldOld("DRAM", "CTL20", "WR_DQS_SHIFT_BYPASS", value))
1057 AddLine("DQS Write Delay", value, "", "(bypass mode)"); 1083 AddLine("DQS Write Delay", value, "", "(bypass mode)");
1058 } 1084 }
1059 else 1085 else
1060 { 1086 {
1061 if(helper.ReadRegisterField("DRAM", "CTL17", "DLL_START_POINT", value)) 1087 if(ReadFieldOld("DRAM", "CTL17", "DLL_START_POINT", value))
1062 AddLine("DLL Start Point", value, "", "Initial delay count"); 1088 AddLine("DLL Start Point", value, "", "Initial delay count");
1063 1089
1064 if(helper.ReadRegisterField("DRAM", "CTL17", "DLL_INCREMENT", value)) 1090 if(ReadFieldOld("DRAM", "CTL17", "DLL_INCREMENT", value))
1065 AddLine("DLL Increment", value, "", "Delay increment"); 1091 AddLine("DLL Increment", value, "", "Delay increment");
1066 1092
1067 if(helper.ReadRegisterField("DRAM", "CTL18", "DLL_DQS_DELAY_0", value)) 1093 if(ReadFieldOld("DRAM", "CTL18", "DLL_DQS_DELAY_0", value))
1068 AddLine("DLL DQS Delay 0", value, "", "In 1/128 fraction of a cycle"); 1094 AddLine("DLL DQS Delay 0", value, "", "In 1/128 fraction of a cycle");
1069 1095
1070 if(helper.ReadRegisterField("DRAM", "CTL18", "DLL_DQS_DELAY_1", value)) 1096 if(ReadFieldOld("DRAM", "CTL18", "DLL_DQS_DELAY_1", value))
1071 AddLine("DLL DQS Delay 1", value, "", "In 1/128 fraction of a cycle"); 1097 AddLine("DLL DQS Delay 1", value, "", "In 1/128 fraction of a cycle");
1072 1098
1073 if(helper.ReadRegisterField("DRAM", "CTL19", "DQS_OUT_SHIFT", value)) 1099 if(ReadFieldOld("DRAM", "CTL19", "DQS_OUT_SHIFT", value))
1074 AddLine("DQS Out Delay", value, "", ""); 1100 AddLine("DQS Out Delay", value, "", "");
1075 1101
1076 if(helper.ReadRegisterField("DRAM", "CTL20", "WR_DQS_SHIFT", value)) 1102 if(ReadFieldOld("DRAM", "CTL20", "WR_DQS_SHIFT", value))
1077 AddLine("DQS Write Delay", value, "", ""); 1103 AddLine("DQS Write Delay", value, "", "");
1078 } 1104 }
1079 1105
@@ -1090,8 +1116,8 @@ namespace pin_desc
1090#include "../../imxtools/misc/map.h" 1116#include "../../imxtools/misc/map.h"
1091} 1117}
1092 1118
1093PinAnalyser::PinAnalyser(const SocRef& soc, IoBackend *backend) 1119PinAnalyser::PinAnalyser(const soc_desc::soc_ref_t& soc, IoBackend *backend)
1094 :Analyser(soc, backend) 1120 :AnalyserEx(soc, backend)
1095{ 1121{
1096 m_group = new QGroupBox("Pin Analyser"); 1122 m_group = new QGroupBox("Pin Analyser");
1097 QVBoxLayout *layout = new QVBoxLayout; 1123 QVBoxLayout *layout = new QVBoxLayout;
@@ -1129,7 +1155,6 @@ bool PinAnalyser::SupportSoc(const QString& soc_name)
1129 1155
1130void PinAnalyser::FillList() 1156void PinAnalyser::FillList()
1131{ 1157{
1132 BackendHelper helper(m_io_backend, m_soc);
1133 soc_word_t value; 1158 soc_word_t value;
1134 1159
1135 while(m_panel->count() > 0) 1160 while(m_panel->count() > 0)
@@ -1140,7 +1165,7 @@ void PinAnalyser::FillList()
1140 "bga169", "bga100", "lqfp100", "lqfp128", 0, 0, 0, 0 1165 "bga169", "bga100", "lqfp100", "lqfp128", 0, 0, 0, 0
1141 }; 1166 };
1142 1167
1143 if(!helper.ReadRegisterField("DIGCTL", "STATUS", "PACKAGE_TYPE", value)) 1168 if(!ReadFieldOld("DIGCTL", "STATUS", "PACKAGE_TYPE", value))
1144 { 1169 {
1145 m_package_edit->setText("<read error>"); 1170 m_package_edit->setText("<read error>");
1146 return; 1171 return;
@@ -1199,21 +1224,21 @@ void PinAnalyser::FillList()
1199 uint32_t muxsel[2], drive[4], pull, in, out, oe; 1224 uint32_t muxsel[2], drive[4], pull, in, out, oe;
1200 bool error = false; 1225 bool error = false;
1201 for(int i = 0; i < 2; i++) 1226 for(int i = 0; i < 2; i++)
1202 if(!helper.ReadRegister("PINCTRL", QString("MUXSEL%1").arg(bank * 2 + i), muxsel[i])) 1227 if(!ReadRegisterOld("PINCTRL", QString("MUXSELn[%1]").arg(bank * 2 + i), muxsel[i]))
1203 error = true; 1228 error = true;
1204 /* don't make an error for those since some do not exist */ 1229 /* don't make an error for those since some do not exist */
1205 for(int i = 0; i < 4; i++) 1230 for(int i = 0; i < 4; i++)
1206 if(!helper.ReadRegister("PINCTRL", QString("DRIVE%1").arg(bank * 4 + i), drive[i])) 1231 if(!ReadRegisterOld("PINCTRL", QString("DRIVEn[%1]").arg(bank * 4 + i), drive[i]))
1207 drive[i] = 0; 1232 drive[i] = 0;
1208 if(error) 1233 if(error)
1209 continue; 1234 continue;
1210 if(!helper.ReadRegister("PINCTRL", QString("PULL%1").arg(bank), pull)) 1235 if(!ReadRegisterOld("PINCTRL", QString("PULLn[%1]").arg(bank), pull))
1211 pull = 0; 1236 pull = 0;
1212 if(!helper.ReadRegister("PINCTRL", QString("DIN%1").arg(bank), in)) 1237 if(!ReadRegisterOld("PINCTRL", QString("DINn[%1]").arg(bank), in))
1213 in = 0; 1238 in = 0;
1214 if(!helper.ReadRegister("PINCTRL", QString("DOUT%1").arg(bank), out)) 1239 if(!ReadRegisterOld("PINCTRL", QString("DOUTn[%1]").arg(bank), out))
1215 out = 0; 1240 out = 0;
1216 if(!helper.ReadRegister("PINCTRL", QString("DOE%1").arg(bank), oe)) 1241 if(!ReadRegisterOld("PINCTRL", QString("DOEn[%1]").arg(bank), oe))
1217 oe = 0; 1242 oe = 0;
1218 1243
1219 for(int pin = 0; pin < 32; pin++) 1244 for(int pin = 0; pin < 32; pin++)
diff --git a/utils/regtools/qeditor/std_analysers.h b/utils/regtools/qeditor/std_analysers.h
index 54e7b83862..030e010f58 100644
--- a/utils/regtools/qeditor/std_analysers.h
+++ b/utils/regtools/qeditor/std_analysers.h
@@ -35,14 +35,28 @@
35#include <QLineEdit> 35#include <QLineEdit>
36#include "analyser.h" 36#include "analyser.h"
37 37
38class AnalyserEx : public Analyser
39{
40public:
41 AnalyserEx(const soc_desc::soc_ref_t& soc, IoBackend *backend);
42protected:
43 bool ReadRegister(const QString& path, soc_word_t& val);
44 bool ReadRegisterOld(const QString& dev, const QString& reg, soc_word_t& val);
45 bool ReadField(const QString& path, const QString& field, soc_word_t& val);
46 bool ReadFieldOld(const QString& dev, const QString& reg, const QString& field,
47 soc_word_t& val);
48
49 BackendHelper m_helper;
50};
51
38/** 52/**
39 * Clock analyser 53 * Clock analyser
40 */ 54 */
41 55
42class ClockAnalyser : public Analyser 56class ClockAnalyser : public AnalyserEx
43{ 57{
44public: 58public:
45 ClockAnalyser(const SocRef& soc, IoBackend *backend); 59 ClockAnalyser(const soc_desc::soc_ref_t& soc, IoBackend *backend);
46 virtual ~ClockAnalyser(); 60 virtual ~ClockAnalyser();
47 virtual QWidget *GetWidget(); 61 virtual QWidget *GetWidget();
48 static bool SupportSoc(const QString& soc_name); 62 static bool SupportSoc(const QString& soc_name);
@@ -72,11 +86,11 @@ private:
72/** 86/**
73 * EMI analyser 87 * EMI analyser
74 */ 88 */
75class EmiAnalyser : public QObject, public Analyser 89class EmiAnalyser : public QObject, public AnalyserEx
76{ 90{
77 Q_OBJECT 91 Q_OBJECT
78public: 92public:
79 EmiAnalyser(const SocRef& soc, IoBackend *backend); 93 EmiAnalyser(const soc_desc::soc_ref_t& soc, IoBackend *backend);
80 virtual ~EmiAnalyser(); 94 virtual ~EmiAnalyser();
81 virtual QWidget *GetWidget(); 95 virtual QWidget *GetWidget();
82 96
@@ -116,10 +130,10 @@ private:
116/** 130/**
117 * PINCTRL analyzer 131 * PINCTRL analyzer
118 */ 132 */
119class PinAnalyser : public Analyser 133class PinAnalyser : public AnalyserEx
120{ 134{
121public: 135public:
122 PinAnalyser(const SocRef& soc, IoBackend *backend); 136 PinAnalyser(const soc_desc::soc_ref_t& soc, IoBackend *backend);
123 virtual ~PinAnalyser(); 137 virtual ~PinAnalyser();
124 virtual QWidget *GetWidget(); 138 virtual QWidget *GetWidget();
125 139
diff --git a/utils/regtools/qeditor/utils.cpp b/utils/regtools/qeditor/utils.cpp
index 95b5a80c64..0d0a7de5ed 100644
--- a/utils/regtools/qeditor/utils.cpp
+++ b/utils/regtools/qeditor/utils.cpp
@@ -29,6 +29,7 @@
29#include <QXmlStreamReader> 29#include <QXmlStreamReader>
30#include <QXmlStreamWriter> 30#include <QXmlStreamWriter>
31#include <QTextBlock> 31#include <QTextBlock>
32#include <QApplication>
32 33
33/** 34/**
34 * SocBitRangeValidator 35 * SocBitRangeValidator
@@ -36,6 +37,7 @@
36SocBitRangeValidator::SocBitRangeValidator(QObject *parent) 37SocBitRangeValidator::SocBitRangeValidator(QObject *parent)
37 :QValidator(parent) 38 :QValidator(parent)
38{ 39{
40 m_width = 32;
39} 41}
40 42
41void SocBitRangeValidator::fixup(QString& input) const 43void SocBitRangeValidator::fixup(QString& input) const
@@ -66,11 +68,11 @@ QValidator::State SocBitRangeValidator::parse(const QString& input, int& last, i
66 // parse last bit and check it's between 0 and 31 68 // parse last bit and check it's between 0 and 31
67 bool ok = false; 69 bool ok = false;
68 last = input.left(pos).toInt(&ok); 70 last = input.left(pos).toInt(&ok);
69 if(!ok || last < 0 || last >= 32) 71 if(!ok || last < 0 || last >= m_width)
70 return Invalid; 72 return Invalid;
71 } 73 }
72 else 74 else
73 last = 31; 75 last = m_width - 1;
74 // parse first bit 76 // parse first bit
75 if(pos < input.size() - 1) 77 if(pos < input.size() - 1)
76 { 78 {
@@ -88,6 +90,19 @@ QValidator::State SocBitRangeValidator::parse(const QString& input, int& last, i
88 return Acceptable; 90 return Acceptable;
89} 91}
90 92
93void SocBitRangeValidator::setWidth(int nr_bits)
94{
95 m_width = nr_bits;
96}
97
98QString SocBitRangeValidator::generate(int last_bit, int first_bit) const
99{
100 if(last_bit == first_bit)
101 return QString("%1").arg(first_bit);
102 else
103 return QString("%1:%2").arg(last_bit).arg(first_bit);
104}
105
91/** 106/**
92 * SocFieldValidator 107 * SocFieldValidator
93 */ 108 */
@@ -95,11 +110,11 @@ QValidator::State SocBitRangeValidator::parse(const QString& input, int& last, i
95SocFieldValidator::SocFieldValidator(QObject *parent) 110SocFieldValidator::SocFieldValidator(QObject *parent)
96 :QValidator(parent) 111 :QValidator(parent)
97{ 112{
98 m_field.first_bit = 0; 113 m_field.pos = 0;
99 m_field.last_bit = 31; 114 m_field.width = 32;
100} 115}
101 116
102SocFieldValidator::SocFieldValidator(const soc_reg_field_t& field, QObject *parent) 117SocFieldValidator::SocFieldValidator(const soc_desc::field_t& field, QObject *parent)
103 :QValidator(parent), m_field(field) 118 :QValidator(parent), m_field(field)
104{ 119{
105} 120}
@@ -124,7 +139,7 @@ QValidator::State SocFieldValidator::parse(const QString& input, soc_word_t& val
124 return Intermediate; 139 return Intermediate;
125 // first check named values 140 // first check named values
126 State state = Invalid; 141 State state = Invalid;
127 foreach(const soc_reg_field_value_t& value, m_field.value) 142 foreach(const soc_desc::enum_t& value, m_field.enum_)
128 { 143 {
129 QString name = QString::fromLocal8Bit(value.name.c_str()); 144 QString name = QString::fromLocal8Bit(value.name.c_str());
130 // cannot be a substring if too long or empty 145 // cannot be a substring if too long or empty
@@ -176,7 +191,7 @@ QValidator::State SocFieldValidator::parse(const QString& input, soc_word_t& val
176 if(!ok) 191 if(!ok)
177 return state; 192 return state;
178 // if ok, check if it fits in the number of bits 193 // if ok, check if it fits in the number of bits
179 unsigned nr_bits = m_field.last_bit - m_field.first_bit + 1; 194 unsigned nr_bits = m_field.width;
180 unsigned long max = nr_bits == 32 ? 0xffffffff : (1 << nr_bits) - 1; 195 unsigned long max = nr_bits == 32 ? 0xffffffff : (1 << nr_bits) - 1;
181 if(v <= max) 196 if(v <= max)
182 { 197 {
@@ -308,14 +323,22 @@ QString SocFieldItemDelegate::displayText(const QVariant& value, const QLocale&
308 return QStyledItemDelegate::displayText(value, locale); 323 return QStyledItemDelegate::displayText(value, locale);
309} 324}
310 325
326void SocFieldItemDelegate::setWidth(int bitcount)
327{
328 m_bitcount = bitcount;
329}
330
311/** 331/**
312 * SocFieldEditor 332 * SocFieldEditor
313 */ 333 */
314SocFieldEditor::SocFieldEditor(const soc_reg_field_t& field, QWidget *parent) 334SocFieldEditor::SocFieldEditor(const soc_desc::field_t& field, QWidget *parent)
315 :QLineEdit(parent), m_reg_field(field) 335 :QLineEdit(parent), m_reg_field(field)
316{ 336{
317 m_validator = new SocFieldValidator(field); 337 m_validator = new SocFieldValidator(field);
318 setValidator(m_validator); 338 setValidator(m_validator);
339 connect(this, SIGNAL(editingFinished()), this, SLOT(editDone()));
340 setAlignment(Qt::AlignCenter);
341 setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Minimum);
319} 342}
320 343
321SocFieldEditor::~SocFieldEditor() 344SocFieldEditor::~SocFieldEditor()
@@ -323,6 +346,11 @@ SocFieldEditor::~SocFieldEditor()
323 delete m_validator; 346 delete m_validator;
324} 347}
325 348
349void SocFieldEditor::editDone()
350{
351 emit editingFinished(field());
352}
353
326uint SocFieldEditor::field() const 354uint SocFieldEditor::field() const
327{ 355{
328 soc_word_t v; 356 soc_word_t v;
@@ -336,11 +364,11 @@ uint SocFieldEditor::field() const
336void SocFieldEditor::setField(uint field) 364void SocFieldEditor::setField(uint field)
337{ 365{
338 m_field = field; 366 m_field = field;
339 int digits = (m_reg_field.last_bit - m_reg_field.first_bit + 4) / 4; 367 int digits = (m_reg_field.width + 3) / 4;
340 setText(QString("0x%1").arg(field, digits, 16, QChar('0'))); 368 setText(QString("0x%1").arg(field, digits, 16, QChar('0')));
341} 369}
342 370
343void SocFieldEditor::SetRegField(const soc_reg_field_t& field) 371void SocFieldEditor::SetRegField(const soc_desc::field_t& field)
344{ 372{
345 setValidator(0); 373 setValidator(0);
346 delete m_validator; 374 delete m_validator;
@@ -352,12 +380,30 @@ void SocFieldEditor::SetRegField(const soc_reg_field_t& field)
352/** 380/**
353 * SocFieldCachedValue 381 * SocFieldCachedValue
354 */ 382 */
355SocFieldCachedValue::SocFieldCachedValue(const soc_reg_field_t& field, uint value) 383SocFieldCachedValue::SocFieldCachedValue(const soc_desc::field_t& field, uint value)
356 :m_field(field), m_value(value) 384 :m_field(field), m_value(value)
357{ 385{
358 int idx = field.find_value(value); 386 int idx = field.find_value(value);
359 if(idx != -1) 387 if(idx != -1)
360 m_name = QString::fromStdString(field.value[idx].name); 388 m_name = QString::fromStdString(field.enum_[idx].name);
389}
390
391bool SocFieldCachedValue::operator<(const SocFieldCachedValue& o) const
392{
393 return m_value < o.m_value;
394}
395
396/**
397 * SocFieldBitRange
398 */
399
400bool SocFieldBitRange::operator<(const SocFieldBitRange& o) const
401{
402 if(m_first_bit < o.m_first_bit)
403 return true;
404 if(m_first_bit > o.m_first_bit)
405 return false;
406 return m_last_bit < o.m_last_bit;
361} 407}
362 408
363/** 409/**
@@ -372,11 +418,10 @@ SocFieldCachedItemDelegate::SocFieldCachedItemDelegate(QObject *parent)
372 418
373QString SocFieldCachedItemDelegate::displayText(const QVariant& value, const QLocale& locale) const 419QString SocFieldCachedItemDelegate::displayText(const QVariant& value, const QLocale& locale) const
374{ 420{
375 // FIXME see QTBUG-30392 421 if(isUserType< SocFieldCachedValue >(value))
376 if(value.type() == QVariant::UserType && value.userType() == qMetaTypeId< SocFieldCachedValue >())
377 { 422 {
378 const SocFieldCachedValue& v = value.value< SocFieldCachedValue >(); 423 const SocFieldCachedValue& v = value.value< SocFieldCachedValue >();
379 int bitcount = v.field().last_bit - v.field().first_bit; 424 int bitcount = v.field().width;
380 QString name = v.value_name(); 425 QString name = v.value_name();
381 QString strval = QString("0x%1").arg(v.value(), (bitcount + 3) / 4, 16, QChar('0')); 426 QString strval = QString("0x%1").arg(v.value(), (bitcount + 3) / 4, 16, QChar('0'));
382 switch(m_mode) 427 switch(m_mode)
@@ -410,7 +455,7 @@ QString SocFieldCachedItemDelegate::displayText(const QVariant& value, const QLo
410 * SocFieldCachedEditor 455 * SocFieldCachedEditor
411 */ 456 */
412SocFieldCachedEditor::SocFieldCachedEditor(QWidget *parent) 457SocFieldCachedEditor::SocFieldCachedEditor(QWidget *parent)
413 :SocFieldEditor(soc_reg_field_t(), parent) 458 :SocFieldEditor(soc_desc::field_t(), parent)
414{ 459{
415} 460}
416 461
@@ -443,6 +488,11 @@ QByteArray SocFieldEditorCreator::valuePropertyName() const
443 return QByteArray("field"); 488 return QByteArray("field");
444} 489}
445 490
491void SocFieldEditorCreator::setWidth(int bitcount)
492{
493 m_field.width = bitcount;
494}
495
446/** 496/**
447 * SocFieldCachedEditorCreator 497 * SocFieldCachedEditorCreator
448 */ 498 */
@@ -478,8 +528,10 @@ int RegFieldTableModel::columnCount(const QModelIndex& /* parent */) const
478 528
479QVariant RegFieldTableModel::data(const QModelIndex& index, int role) const 529QVariant RegFieldTableModel::data(const QModelIndex& index, int role) const
480{ 530{
531 if(index.row() < 0 || (size_t)index.row() >= m_reg.field.size())
532 return QVariant();
481 int section = index.column(); 533 int section = index.column();
482 const soc_reg_field_t& field = m_reg.field[index.row()]; 534 const soc_desc::field_t& field = m_reg.field[index.row()];
483 /* column independent code */ 535 /* column independent code */
484 const RegThemeGroup *theme = 0; 536 const RegThemeGroup *theme = 0;
485 switch(m_status[index.row()]) 537 switch(m_status[index.row()])
@@ -609,7 +661,7 @@ void RegFieldTableModel::SetReadOnly(bool en)
609 m_read_only = en; 661 m_read_only = en;
610} 662}
611 663
612void RegFieldTableModel::SetRegister(const soc_reg_t& reg) 664void RegFieldTableModel::SetRegister(const soc_desc::register_t& reg)
613{ 665{
614 /* remove all rows */ 666 /* remove all rows */
615 beginResetModel(); 667 beginResetModel();
@@ -622,6 +674,18 @@ void RegFieldTableModel::SetRegister(const soc_reg_t& reg)
622 endInsertRows(); 674 endInsertRows();
623} 675}
624 676
677void RegFieldTableModel::UpdateRegister(const soc_desc::register_t& reg)
678{
679 m_reg = reg;
680 RecomputeTheme();
681 emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1));
682}
683
684soc_desc::register_t RegFieldTableModel::GetRegister() const
685{
686 return m_reg;
687}
688
625void RegFieldTableModel::SetValues(const QVector< QVariant >& values) 689void RegFieldTableModel::SetValues(const QVector< QVariant >& values)
626{ 690{
627 /* remove all value columns */ 691 /* remove all value columns */
@@ -658,7 +722,7 @@ void RegFieldTableModel::RecomputeTheme()
658 if(!m_theme.valid || m_value.size() == 0) 722 if(!m_theme.valid || m_value.size() == 0)
659 continue; 723 continue;
660 m_status[i] = Normal; 724 m_status[i] = Normal;
661 const soc_reg_field_t& field = m_reg.field[i]; 725 const soc_desc::field_t& field = m_reg.field[i];
662 QVariant val; 726 QVariant val;
663 for(int j = 0; j < m_value.size(); j++) 727 for(int j = 0; j < m_value.size(); j++)
664 { 728 {
@@ -675,120 +739,269 @@ void RegFieldTableModel::RecomputeTheme()
675} 739}
676 740
677/** 741/**
678 * RegSexyDisplay2 742 * RegFieldProxyModel
679 */ 743 */
680 744
681RegSexyDisplay2::RegSexyDisplay2(QWidget *parent) 745bool RegFieldProxyModel::lessThan(const QModelIndex& left,
746 const QModelIndex& right) const
747{
748 QVariant ldata = sourceModel()->data(left);
749 QVariant rdata = sourceModel()->data(right);
750 if(isUserType< SocFieldBitRange >(ldata) &&
751 isUserType< SocFieldBitRange >(rdata))
752 {
753 return ldata.value< SocFieldBitRange >() <
754 rdata.value< SocFieldBitRange >();
755 }
756 else if(isUserType< SocFieldCachedValue >(ldata) &&
757 isUserType< SocFieldCachedValue >(rdata))
758 {
759 return ldata.value< SocFieldCachedValue >() <
760 rdata.value< SocFieldCachedValue >();
761 }
762 else
763 return QSortFilterProxyModel::lessThan(left, right);
764}
765
766/**
767 * YRegDisplayItemDelegate
768 */
769
770YRegDisplayItemDelegate::YRegDisplayItemDelegate(QObject *parent)
771 :QStyledItemDelegate(parent)
772{
773}
774
775 void YRegDisplayItemDelegate::paint(QPainter *painter,
776 const QStyleOptionViewItem& option, const QModelIndex& index) const
777{
778 QStyleOptionViewItemV4 opt = option;
779 // default alignment is centered unless specified
780 opt.displayAlignment = Qt::AlignHCenter | Qt::AlignVCenter;
781 initStyleOption(&opt, index);
782
783 painter->save();
784 // draw everything rotated, requires careful manipulation of the
785 // rects involved
786 painter->translate(opt.rect.bottomLeft());
787 painter->rotate(-90);
788 opt.rect = QRect(0, 0, opt.rect.height(), opt.rect.width());
789 QStyle *style = opt.widget ? opt.widget->style() : QApplication::style();
790 style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget);
791 painter->restore();
792
793}
794
795QSize YRegDisplayItemDelegate::sizeHint(const QStyleOptionViewItem& option,
796 const QModelIndex& index) const
797{
798 Q_UNUSED(option);
799 Q_UNUSED(index);
800 return QSize();
801}
802
803/**
804 * YRegDisplay
805 */
806
807YRegDisplay::YRegDisplay(QWidget *parent)
682 :QAbstractItemView(parent) 808 :QAbstractItemView(parent)
683{ 809{
684 m_is_dirty = true; 810 m_is_dirty = true;
811 m_range_col = 0;
812 m_data_col = 1;
813 m_nr_bits = 32;
685 // the frame around the register is ugly, disable it 814 // the frame around the register is ugly, disable it
686 setFrameShape(QFrame::NoFrame); 815 setFrameShape(QFrame::NoFrame);
816 setSelectionMode(SingleSelection);
817 setItemDelegate(new YRegDisplayItemDelegate());
687} 818}
688 819
689QModelIndex RegSexyDisplay2::indexAt(const QPoint& point) const 820void YRegDisplay::setWidth(int nr_bits)
690{ 821{
691 Q_UNUSED(point); 822 m_nr_bits = nr_bits;
823 m_is_dirty = true;
824 recomputeGeometry();
825 updateGeometries();
826}
827
828int YRegDisplay::bitColumnAt(const QPoint& point, bool closest) const
829{
830 int wx = point.x() + horizontalScrollBar()->value();
831 for(int bit = 0; bit < m_nr_bits; bit++)
832 {
833 int off = columnOffset(bitToColumn(bit));
834 int w = columnWidth(bitToColumn(bit));
835 if(wx >= off && wx < off + w)
836 return bit;
837 if(wx >= off + w && closest)
838 return bit;
839 }
840 return closest ? m_nr_bits - 1 : -1;
841}
842
843QModelIndex YRegDisplay::indexAt(const QPoint& point) const
844{
845 if(!model())
846 return QModelIndex();
847 int wx = point.x() + horizontalScrollBar()->value();
848 int wy = point.y() + verticalScrollBar()->value();
849
850 for(int i = 0; i < model()->rowCount(); i++)
851 {
852 QModelIndex index = model()->index(i, m_data_col, rootIndex());
853 QRect r = itemRect(index);
854 if(!r.isValid())
855 continue;
856 if(r.contains(wx, wy))
857 return index;
858 }
692 return QModelIndex(); 859 return QModelIndex();
693} 860}
694 861
695void RegSexyDisplay2::scrollTo(const QModelIndex& index, ScrollHint hint) 862void YRegDisplay::scrollTo(const QModelIndex& index, ScrollHint hint)
696{ 863{
697 Q_UNUSED(index); 864 Q_UNUSED(index);
698 Q_UNUSED(hint); 865 Q_UNUSED(hint);
699} 866}
700 867
701QRect RegSexyDisplay2::visualRect(const QModelIndex& index) const 868QRect YRegDisplay::visualRect(const QModelIndex &index) const
702{ 869{
703 Q_UNUSED(index); 870 QRect rect = itemRect(index);
704 return QRect(); 871 if(rect.isValid())
872 return QRect(rect.left() - horizontalScrollBar()->value(),
873 rect.top() - verticalScrollBar()->value(),
874 rect.width(), rect.height());
875 else
876 return rect;
705} 877}
706 878
707bool RegSexyDisplay2::isIndexHidden(const QModelIndex& index) const 879bool YRegDisplay::isIndexHidden(const QModelIndex& index) const
708{ 880{
709 Q_UNUSED(index); 881 Q_UNUSED(index);
710 return false; 882 return false;
711} 883}
712 884
713QModelIndex RegSexyDisplay2::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) 885QModelIndex YRegDisplay::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers)
714{ 886{
715 Q_UNUSED(cursorAction); 887 Q_UNUSED(cursorAction);
716 Q_UNUSED(modifiers); 888 Q_UNUSED(modifiers);
717 return QModelIndex(); 889 return QModelIndex();
718} 890}
719 891
720void RegSexyDisplay2::setSelection(const QRect& rect, QItemSelectionModel::SelectionFlags flags) 892void YRegDisplay::setSelection(const QRect& r, QItemSelectionModel::SelectionFlags flags)
721{ 893{
722 Q_UNUSED(rect); 894 if(!model())
723 Q_UNUSED(flags); 895 return;
896 QRect rect = r.translated(horizontalScrollBar()->value(),
897 verticalScrollBar()->value()).normalized();
898
899 QItemSelection sel;
900 for(int i = 0; i < model()->rowCount(); i++)
901 {
902 QModelIndex index = model()->index(i, m_data_col, rootIndex());
903 QRect r = itemRect(index);
904 if(!r.isValid())
905 continue;
906 if(r.intersects(rect))
907 sel.select(index, index);
908 }
909 selectionModel()->select(sel, flags);
724} 910}
725 911
726int RegSexyDisplay2::verticalOffset() const 912int YRegDisplay::verticalOffset() const
727{ 913{
728 return verticalScrollBar()->value(); 914 return verticalScrollBar()->value();
729} 915}
730 916
731int RegSexyDisplay2::horizontalOffset() const 917int YRegDisplay::horizontalOffset() const
732{ 918{
733 return horizontalScrollBar()->value(); 919 return horizontalScrollBar()->value();
734} 920}
735 921
736void RegSexyDisplay2::scrollContentsBy(int dx, int dy) 922void YRegDisplay::scrollContentsBy(int dx, int dy)
737{ 923{
738 viewport()->scroll(dx, dy); 924 viewport()->scroll(dx, dy);
739} 925}
740 926
741void RegSexyDisplay2::setModel(QAbstractItemModel *model) 927void YRegDisplay::setModel(QAbstractItemModel *model)
742{ 928{
743 QAbstractItemView::setModel(model); 929 QAbstractItemView::setModel(model);
744 m_is_dirty = true; 930 m_is_dirty = true;
745} 931}
746 932
747void RegSexyDisplay2::dataChanged(const QModelIndex &topLeft, 933void YRegDisplay::dataChanged(const QModelIndex &topLeft,
748 const QModelIndex &bottomRight) 934 const QModelIndex &bottomRight)
749{ 935{
750 m_is_dirty = true; 936 m_is_dirty = true;
751 QAbstractItemView::dataChanged(topLeft, bottomRight); 937 QAbstractItemView::dataChanged(topLeft, bottomRight);
752} 938}
753 939
754void RegSexyDisplay2::rowsInserted(const QModelIndex &parent, int start, int end) 940void YRegDisplay::rowsInserted(const QModelIndex &parent, int start, int end)
755{ 941{
756 m_is_dirty = true; 942 m_is_dirty = true;
757 QAbstractItemView::rowsInserted(parent, start, end); 943 QAbstractItemView::rowsInserted(parent, start, end);
758} 944}
759 945
760void RegSexyDisplay2::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) 946void YRegDisplay::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end)
761{ 947{
762 m_is_dirty = true; 948 m_is_dirty = true;
763 QAbstractItemView::rowsAboutToBeRemoved(parent, start, end); 949 QAbstractItemView::rowsAboutToBeRemoved(parent, start, end);
764} 950}
765 951
766int RegSexyDisplay2::GetSeparatorSize() const 952int YRegDisplay::separatorSize() const
767{ 953{
768 return 1; 954 return 1;
769} 955}
770 956
771int RegSexyDisplay2::GetMarginSize() const 957int YRegDisplay::marginSize() const
772{ 958{
773 return viewOptions().fontMetrics.height() / 3; 959 return viewOptions().fontMetrics.height() / 3;
774} 960}
775 961
776int RegSexyDisplay2::GetHeaderTextSep() const 962int YRegDisplay::headerTextSep() const
777{ 963{
778 return GetMarginSize() / 2; 964 return marginSize() / 2;
779} 965}
780 966
781int RegSexyDisplay2::GetHeaderHeight() const 967int YRegDisplay::headerHeight() const
782{ 968{
783 return 2 * GetMarginSize() + GetHeaderTextSep() + 2 * viewOptions().fontMetrics.height(); 969 return 2 * marginSize() + headerTextSep() + 2 * viewOptions().fontMetrics.height();
784} 970}
785 971
786int RegSexyDisplay2::GetColumnWidth() const 972int YRegDisplay::minColumnWidth() const
787{ 973{
788 return 2 * GetMarginSize() + viewOptions().fontMetrics.height(); 974 return 2 * marginSize() + viewOptions().fontMetrics.height();
789} 975}
790 976
791int RegSexyDisplay2::GetMaxContentHeight() const 977int YRegDisplay::maxColumnWidth() const
978{
979 return 2 * minColumnWidth();
980}
981
982int YRegDisplay::columnWidth(int col) const
983{
984 int avail = width() - (m_nr_bits + 1) * separatorSize();
985 int small_w = qMin(avail / m_nr_bits, maxColumnWidth());
986 int nr_big = avail - small_w * m_nr_bits;
987 if(col < nr_big)
988 return small_w + 1;
989 else
990 return small_w;
991}
992
993int YRegDisplay::columnOffset(int col) const
994{
995 int off = separatorSize();
996 for(int i = 0; i < col; i++)
997 off += columnWidth(i) + separatorSize();
998 int all_w = off;
999 for(int i = col; i < m_nr_bits; i++)
1000 all_w += columnWidth(i) + separatorSize();
1001 return off + (width() - all_w) / 2;
1002}
1003
1004int YRegDisplay::maxContentHeight() const
792{ 1005{
793 int max = 0; 1006 int max = 0;
794 QFontMetrics metrics = viewOptions().fontMetrics; 1007 QFontMetrics metrics = viewOptions().fontMetrics;
@@ -796,127 +1009,180 @@ int RegSexyDisplay2::GetMaxContentHeight() const
796 { 1009 {
797 for(int i = 0; i < model()->rowCount(); i++) 1010 for(int i = 0; i < model()->rowCount(); i++)
798 { 1011 {
799 QModelIndex index = model()->index(i, 1, rootIndex()); 1012 QModelIndex index = model()->index(i, m_data_col, rootIndex());
800 QString s = model()->data(index).toString(); 1013 QString s = model()->data(index).toString();
801 max = qMax(max, metrics.boundingRect(s).width()); 1014 max = qMax(max, metrics.boundingRect(s).width());
802 } 1015 }
803 } 1016 }
804 return 2 * GetMarginSize() + max; 1017 return 2 * marginSize() + max;
805} 1018}
806 1019
807int RegSexyDisplay2::GetGapHeight() const 1020int YRegDisplay::gapHeight() const
808{ 1021{
809 return GetMarginSize() / 2; 1022 return marginSize() / 2;
810} 1023}
811 1024
812QRegion RegSexyDisplay2::visualRegionForSelection(const QItemSelection& selection) const 1025int YRegDisplay::bitToColumn(int bit) const
813{ 1026{
814 Q_UNUSED(selection); 1027 return m_nr_bits - 1 - bit;
815 return QRegion();
816} 1028}
817 1029
818void RegSexyDisplay2::paintEvent(QPaintEvent *event) 1030QRegion YRegDisplay::visualRegionForSelection(const QItemSelection& selection) const
819{ 1031{
820 Q_UNUSED(event); 1032 QRegion region;
821 int txt_h = viewOptions().fontMetrics.height(); 1033 foreach(const QItemSelectionRange &range, selection)
822 int sep_sz = GetSeparatorSize(); 1034 {
823 int w = qMax(m_minimum_width, viewport()->width()); 1035 for(int row = range.top(); row <= range.bottom(); ++row)
824 int h = qMax(m_minimum_height, viewport()->height()); 1036 {
825 int nr_bits = 32; 1037 for(int column = range.left(); column < range.right(); ++column)
826 int col_w = (w - (nr_bits + 1) * sep_sz) / nr_bits; 1038 {
827 int hdr_h = GetHeaderHeight(); 1039 QModelIndex index = model()->index(row, column, rootIndex());
828 int gap_h = GetGapHeight(); 1040 region += visualRect(index);
829 int tot_w = (nr_bits + 1) * sep_sz + nr_bits * col_w; 1041 }
830 int margin = GetMarginSize(); 1042 }
831 int txt_sep = GetHeaderTextSep(); 1043 }
832 int tot_hdr_sz = 2 * sep_sz + hdr_h; 1044 return region;
833 1045}
834 int x_shift = (w - tot_w) / 2;
835#define ith_col_x(i) (x_shift + (i) * (sep_sz + col_w))
836 1046
1047QRect YRegDisplay::itemRect(const QModelIndex& index) const
1048{
1049 if(!index.isValid())
1050 return QRect();
1051 QVariant vrange = model()->data(model()->index(index.row(), m_range_col, rootIndex()));
1052 if(!vrange.canConvert< SocFieldBitRange >())
1053 return QRect();
1054 SocFieldBitRange range = vrange.value< SocFieldBitRange >();
1055 return itemRect(range, index.column());
1056}
1057
1058QRect YRegDisplay::itemRect(const SocFieldBitRange& range, int col) const
1059{
1060 int top, bot;
1061 if(col == m_range_col)
1062 {
1063 top = separatorSize();
1064 bot = separatorSize() + headerHeight() - 1;
1065 }
1066 else if(col == m_data_col)
1067 {
1068 top = headerHeight() + 3 * separatorSize() + gapHeight();
1069 bot = height() - separatorSize() - 1;
1070 }
1071 else
1072 return QRect();
1073 int first_col = bitToColumn(range.GetFirstBit());
1074 return QRect(QPoint(columnOffset(bitToColumn(range.GetLastBit())), top),
1075 QPoint(columnOffset(first_col) + columnWidth(first_col) - 1, bot));
1076}
1077
1078void YRegDisplay::paintEvent(QPaintEvent *event)
1079{
1080 Q_UNUSED(event);
837 QPainter painter(viewport()); 1081 QPainter painter(viewport());
838 painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing); 1082 painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
839 painter.translate(-horizontalScrollBar()->value(), -verticalScrollBar()->value()); 1083 painter.translate(-horizontalScrollBar()->value(), -verticalScrollBar()->value());
840 QStyleOptionViewItem option = viewOptions(); 1084 QStyleOptionViewItem option = viewOptions();
1085 int txt_h = option.fontMetrics.height();
1086 int grid_hint = style()->styleHint(QStyle::SH_Table_GridLineColor, &option, this);
1087 QBrush grid_brush(static_cast< QRgb >(grid_hint));
841 QBrush back_brush = option.palette.base(); 1088 QBrush back_brush = option.palette.base();
842 QBrush line_brush = option.palette.dark(); 1089 int sep_sz = separatorSize();
843 1090 QItemSelectionModel *selections = selectionModel();
844 // fill interesting zone with base 1091
845 painter.fillRect(event->rect(), option.palette.window()); 1092 // paint header
846 painter.fillRect(x_shift, 0, tot_w, h, back_brush); 1093 for(int bit = 0; bit < m_nr_bits; bit++)
847
848 // draw top and bottom lines
849 painter.setPen(QPen(line_brush, sep_sz));
850 painter.fillRect(x_shift, 0, tot_w, sep_sz, line_brush);
851 painter.fillRect(x_shift, h - sep_sz, tot_w, sep_sz, line_brush);
852 // draw intemediate lines
853 for(int i = 0; i <= 32; i++)
854 painter.fillRect(ith_col_x(i), 0, sep_sz, 2 * sep_sz + hdr_h, line_brush);
855 // draw bottom header lines
856 painter.fillRect(ith_col_x(0), sep_sz + hdr_h, tot_w, sep_sz, line_brush);
857 painter.fillRect(ith_col_x(0), tot_hdr_sz + gap_h, tot_w, sep_sz, line_brush);
858 // redraw some lines but wider
859 for(int i = 4; i < nr_bits; i += 4)
860 painter.fillRect(ith_col_x(i) - sep_sz, 0, 3 * sep_sz, tot_hdr_sz, line_brush);
861 // draw numbers in the header
862 painter.setPen(palette().brush(QPalette::ButtonText).color());
863 for(int i = 0; i < nr_bits; i++)
864 { 1094 {
865 QRect r(ith_col_x(i), sep_sz + margin, col_w, txt_h); 1095 QRect r = itemRect(SocFieldBitRange(bit, bit), m_range_col);
866 painter.drawText(r, Qt::AlignCenter, QString("%1").arg((nr_bits - 1 - i) / 10)); 1096 // paint background
867 r.translate(0, txt_h + txt_sep); 1097 painter.fillRect(r, back_brush);
868 painter.drawText(r, Qt::AlignCenter, QString("%1").arg((nr_bits - 1 - i) % 10)); 1098 // paint top digit
1099 r.setTop(r.top() + marginSize());
1100 r.setBottom(r.top() + txt_h);
1101 style()->drawItemText(&painter, r, Qt::AlignHCenter, option.palette,
1102 true, QString("%1").arg(bit / 10), foregroundRole());
1103 // paint bottom digit
1104 r.setTop(r.bottom() + headerTextSep());
1105 r.setBottom(r.top() + txt_h);
1106 style()->drawItemText(&painter, r, Qt::AlignHCenter, option.palette,
1107 true, QString("%1").arg(bit % 10), foregroundRole());
869 } 1108 }
870 // display content 1109 // paint header grid
871 if(model()) 1110 for(int bit = 1; bit < m_nr_bits; bit++)
872 { 1111 {
873 for(int i = 0; i < model()->rowCount(); i++) 1112 QRect r = itemRect(SocFieldBitRange(bit, bit), m_range_col);
874 { 1113 r.setCoords(r.right() + 1, r.top(), r.right() + sep_sz, r.bottom());
875 QVariant vrange = model()->data(model()->index(i, 0, rootIndex())); 1114 if((bit % 4) == 0)
876 if(!vrange.canConvert< SocFieldBitRange >()) 1115 r.setCoords(r.left() - sep_sz, r.top(), r.right() + sep_sz, r.bottom());
877 continue; 1116 painter.fillRect(r, grid_brush);
878 SocFieldBitRange range = vrange.value< SocFieldBitRange >(); 1117 }
879 QString name = model()->data(model()->index(i, 1, rootIndex())).toString(); 1118 QRect hdr_r = itemRect(SocFieldBitRange(0, m_nr_bits - 1), m_range_col);
880 QRect r(QPoint(ith_col_x(nr_bits - 1 - range.GetLastBit()) + sep_sz, tot_hdr_sz), 1119 painter.fillRect(QRect(hdr_r.left(), hdr_r.top() - sep_sz, hdr_r.width(), sep_sz), grid_brush);
881 QPoint(ith_col_x(nr_bits - range.GetFirstBit()), h - sep_sz)); 1120 painter.fillRect(QRect(hdr_r.left(), hdr_r.bottom() + 1, hdr_r.width(), sep_sz), grid_brush);
882 painter.fillRect(r.x() - sep_sz, r.y(), sep_sz, r.height(), line_brush); 1121 // paint header gap
883 painter.fillRect(r.right(), r.y(), sep_sz, r.height(), line_brush); 1122 QRect gap_r(hdr_r.left(), hdr_r.bottom() + sep_sz + 1, hdr_r.width(), gapHeight());
884 r.setY(r.y() + gap_h + sep_sz); 1123 painter.fillRect(gap_r, back_brush);
885 // draw rotated text 1124 // paint header bottom line
886 painter.save(); 1125 painter.fillRect(QRect(gap_r.left(), gap_r.bottom() + 1, gap_r.width(), sep_sz), grid_brush);
887 painter.translate(r.bottomLeft()); 1126 // paint background
888 painter.rotate(-90); 1127 QRect data_r = itemRect(SocFieldBitRange(0, m_nr_bits - 1), m_data_col);
889 //painter.fillRect(QRect(0, 0, r.height(), r.width()), QBrush(Qt::red)); 1128 //painter.fillRect(data_r, back_brush);
890 QRect r2(0, 0, r.height(), r.width()); 1129 // paint data bottom line
891 painter.drawText(r2, Qt::AlignCenter, name); 1130 painter.fillRect(QRect(data_r.left(), data_r.bottom() + 1, data_r.width(), sep_sz), grid_brush);
892 painter.restore(); 1131 // paint left/right lines
893 } 1132 painter.fillRect(QRect(hdr_r.left() - sep_sz, hdr_r.top() - sep_sz, sep_sz, height()), grid_brush);
1133 painter.fillRect(QRect(hdr_r.right() + 1, hdr_r.top() - sep_sz, sep_sz, height()), grid_brush);
1134
1135 // paint model
1136 if(!model())
1137 return;
1138
1139 for(int i = 0; i < model()->rowCount(); i++)
1140 {
1141 QModelIndex index = model()->index(i, m_data_col, rootIndex());
1142 QRect r = itemRect(index);
1143 if(!r.isValid())
1144 continue;
1145 QString name = index.data().toString();
1146 // paint background
1147 QStyleOptionViewItem opt = viewOptions();
1148 opt.rect = r;
1149 //opt.showDecorationSelected = true;
1150 style()->drawPrimitive(QStyle::PE_PanelItemViewRow, &opt, &painter, this);
1151 if(selections->isSelected(index))
1152 opt.state |= QStyle::State_Selected;
1153 if(currentIndex() == index)
1154 opt.state |= QStyle::State_HasFocus;
1155 if(m_hover == index)
1156 opt.state |= QStyle::State_MouseOver;
1157 itemDelegate(index)->paint(&painter, opt, index);
1158 // paint left/right lines
1159 painter.fillRect(QRect(r.left() - sep_sz, r.top(), sep_sz, r.height()), grid_brush);
1160 painter.fillRect(QRect(r.right() + 1, r.top(), sep_sz, r.height()), grid_brush);
894 } 1161 }
895#undef ith_col_x
896} 1162}
897 1163
898void RegSexyDisplay2::RecomputeGeometry() 1164void YRegDisplay::recomputeGeometry()
899{ 1165{
900 if(!m_is_dirty) 1166 if(!m_is_dirty)
901 return; 1167 return;
902 /* height: header + gap + sep + content + sep */ 1168 /* height: header + gap + sep + content + sep */
903 m_minimum_height = 0; 1169 m_minimum_height = 0;
904 m_minimum_height += GetHeaderHeight() + GetGapHeight(); 1170 m_minimum_height += headerHeight() + gapHeight();
905 m_minimum_height += 2 * GetSeparatorSize() + GetMaxContentHeight(); 1171 m_minimum_height += 2 * separatorSize() + maxContentHeight();
906 /* width: sep + (col + sep) * n */ 1172 /* width: sep + (col + sep) * n */
907 m_minimum_width = GetSeparatorSize() * 33 + GetColumnWidth() * 32; 1173 m_minimum_width = separatorSize() * (m_nr_bits + 1) + minColumnWidth() * m_nr_bits;
908 m_is_dirty = false; 1174 m_is_dirty = false;
909 viewport()->update(); 1175 viewport()->update();
910} 1176}
911 1177
912void RegSexyDisplay2::resizeEvent(QResizeEvent*) 1178void YRegDisplay::resizeEvent(QResizeEvent*)
913{ 1179{
914 m_is_dirty = true; 1180 m_is_dirty = true;
915 RecomputeGeometry(); 1181 recomputeGeometry();
916 updateGeometries(); 1182 updateGeometries();
917} 1183}
918 1184
919void RegSexyDisplay2::updateGeometries() 1185void YRegDisplay::updateGeometries()
920{ 1186{
921 horizontalScrollBar()->setSingleStep(1); 1187 horizontalScrollBar()->setSingleStep(1);
922 horizontalScrollBar()->setPageStep(viewport()->width()); 1188 horizontalScrollBar()->setPageStep(viewport()->width());
@@ -926,6 +1192,35 @@ void RegSexyDisplay2::updateGeometries()
926 verticalScrollBar()->setRange(0, qMax(0, m_minimum_height - viewport()->height())); 1192 verticalScrollBar()->setRange(0, qMax(0, m_minimum_height - viewport()->height()));
927} 1193}
928 1194
1195bool YRegDisplay::viewportEvent(QEvent *event)
1196{
1197 /* FIXME Apparently QAbstractItemView tracks the hovered index but keeps it
1198 * in its private part which is not accessible, which makes it useless...
1199 * This code reimplements it */
1200 switch (event->type())
1201 {
1202 case QEvent::HoverEnter:
1203 m_hover = indexAt(static_cast<QHoverEvent*>(event)->pos());
1204 update(m_hover);
1205 break;
1206 case QEvent::HoverLeave:
1207 update(m_hover); // update old
1208 m_hover = QModelIndex();
1209 break;
1210 case QEvent::HoverMove:
1211 {
1212 QModelIndex old = m_hover;
1213 m_hover = indexAt(static_cast<QHoverEvent*>(event)->pos());
1214 if(m_hover != old)
1215 viewport()->update(visualRect(old)|visualRect(m_hover));
1216 break;
1217 }
1218 default:
1219 break;
1220 }
1221 return QAbstractItemView::viewportEvent(event);
1222}
1223
929/** 1224/**
930 * GrowingTableView 1225 * GrowingTableView
931 */ 1226 */
@@ -966,6 +1261,12 @@ MyTextEditor::MyTextEditor(QWidget *parent)
966 QVBoxLayout *layout = new QVBoxLayout; 1261 QVBoxLayout *layout = new QVBoxLayout;
967 m_toolbar = new QToolBar(this); 1262 m_toolbar = new QToolBar(this);
968 m_edit = new QTextEdit(this); 1263 m_edit = new QTextEdit(this);
1264#if QT_VERSION >= QT_VERSION_CHECK(5, 2, 0)
1265 /* Qt 5.2 have a hardcoded sizeHint for QAbstractScrollArea which makes it
1266 * hard to have a good behaviour for the text editor. Fortunately 5.2 introduces
1267 * a new option to adjust this to the content. */
1268 m_edit->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents);
1269#endif
969 layout->addWidget(m_toolbar, 0); 1270 layout->addWidget(m_toolbar, 0);
970 layout->addWidget(m_edit, 1); 1271 layout->addWidget(m_edit, 1);
971 setLayout(layout); 1272 setLayout(layout);
@@ -1000,8 +1301,11 @@ MyTextEditor::MyTextEditor(QWidget *parent)
1000 connect(m_edit, SIGNAL(currentCharFormatChanged(const QTextCharFormat&)), 1301 connect(m_edit, SIGNAL(currentCharFormatChanged(const QTextCharFormat&)),
1001 this, SLOT(OnCharFormatChanged(const QTextCharFormat&))); 1302 this, SLOT(OnCharFormatChanged(const QTextCharFormat&)));
1002 1303
1304 m_edit->installEventFilter(this);
1305
1003 SetGrowingMode(false); 1306 SetGrowingMode(false);
1004 SetReadOnly(false); 1307 SetReadOnly(false);
1308 m_toolbar->hide();
1005} 1309}
1006 1310
1007void MyTextEditor::SetReadOnly(bool en) 1311void MyTextEditor::SetReadOnly(bool en)
@@ -1021,7 +1325,7 @@ void MyTextEditor::SetGrowingMode(bool en)
1021 { 1325 {
1022 m_edit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); 1326 m_edit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum);
1023 m_edit->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 1327 m_edit->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
1024 OnTextChanged(); 1328 OnInternalTextChanged();
1025 } 1329 }
1026 else 1330 else
1027 { 1331 {
@@ -1036,10 +1340,11 @@ void MyTextEditor::OnInternalTextChanged()
1036 { 1340 {
1037 int content_size = m_edit->document()->documentLayout()->documentSize().height(); 1341 int content_size = m_edit->document()->documentLayout()->documentSize().height();
1038 content_size = qMax(content_size, m_edit->fontMetrics().height()); 1342 content_size = qMax(content_size, m_edit->fontMetrics().height());
1039 m_edit->setMinimumHeight(content_size + m_edit->contentsMargins().top() + 1343 m_edit->setMinimumHeight(content_size + m_edit->contentsMargins().top() +
1040 m_edit->contentsMargins().bottom()); 1344 m_edit->contentsMargins().bottom());
1041 } 1345 }
1042 emit OnTextChanged(); 1346 emit OnTextChanged();
1347 emit OnTextChanged(GetTextHtml());
1043} 1348}
1044 1349
1045void MyTextEditor::OnTextBold(bool checked) 1350void MyTextEditor::OnTextBold(bool checked)
@@ -1094,6 +1399,19 @@ bool MyTextEditor::IsModified()
1094 return m_edit->document()->isModified(); 1399 return m_edit->document()->isModified();
1095} 1400}
1096 1401
1402bool MyTextEditor::eventFilter(QObject *object, QEvent *event)
1403{
1404 if(object != m_edit)
1405 return false;
1406 if(m_read_only)
1407 return false;
1408 if(event->type() == QEvent::FocusIn)
1409 m_toolbar->show();
1410 else if(event->type() == QEvent::FocusOut)
1411 m_toolbar->hide();
1412 return false;
1413}
1414
1097/** 1415/**
1098 * BackendSelector 1416 * BackendSelector
1099 */ 1417 */
@@ -1159,7 +1477,10 @@ void BackendSelector::OnDataSelChanged(int index)
1159 m_dev_selector->hide(); 1477 m_dev_selector->hide();
1160#endif 1478#endif
1161 QFileDialog *fd = new QFileDialog(m_data_selector); 1479 QFileDialog *fd = new QFileDialog(m_data_selector);
1162 fd->setFilter("Textual files (*.txt);;All files (*)"); 1480 QStringList filters;
1481 filters << "Textual files (*.txt)";
1482 filters << "All files (*)";
1483 fd->setNameFilters(filters);
1163 fd->setDirectory(Settings::Get()->value("regtab/loaddatadir", QDir::currentPath()).toString()); 1484 fd->setDirectory(Settings::Get()->value("regtab/loaddatadir", QDir::currentPath()).toString());
1164 if(fd->exec()) 1485 if(fd->exec())
1165 { 1486 {
@@ -1252,6 +1573,47 @@ void BackendSelector::ChangeBackend(IoBackend *new_backend)
1252} 1573}
1253 1574
1254/** 1575/**
1576 * YTabWidget
1577 */
1578YTabWidget::YTabWidget(QTabBar *bar, QWidget *parent)
1579 :QTabWidget(parent)
1580{
1581 if(bar != 0)
1582 setTabBar(bar);
1583 m_tab_open_button = new QToolButton(this);
1584 m_tab_open_button->setIcon(QIcon::fromTheme("list-add"));
1585 m_tab_open_button->setAutoRaise(true);
1586 m_tab_open_button->setPopupMode(QToolButton::InstantPopup);
1587 /* the arrow with an icon only is pretty ugly and QToolButton has no way
1588 * to remove the arrow programmaticaly, so use the CSS to do that */
1589 m_tab_open_button->setStyleSheet("QToolButton::menu-indicator { image: none; }");
1590 setCornerWidget(m_tab_open_button, Qt::TopLeftCorner);
1591 setTabOpenable(false);
1592 connect(m_tab_open_button, SIGNAL(clicked(bool)), this, SLOT(OnOpenButton(bool)));
1593 /* there is a quirk in the default QStyle: if the tab bar is empty, it
1594 * returns the minimum size of the corner widget, which is 0 for tool buttons */
1595 //setMinimumHeight(m_tab_open_button->height());
1596 //m_tab_open_button->setMinimumHeight(m_tab_open_button->sizeHint().height());
1597}
1598
1599void YTabWidget::setTabOpenable(bool openable)
1600{
1601 m_tab_openable = openable;
1602 m_tab_open_button->setVisible(openable);
1603}
1604
1605void YTabWidget::OnOpenButton(bool checked)
1606{
1607 Q_UNUSED(checked);
1608 emit tabOpenRequested();
1609}
1610
1611void YTabWidget::setTabOpenMenu(QMenu *menu)
1612{
1613 m_tab_open_button->setMenu(menu);
1614}
1615
1616/**
1255 * MessageWidget 1617 * MessageWidget
1256 */ 1618 */
1257MessageWidget::MessageWidget(QWidget *parent) 1619MessageWidget::MessageWidget(QWidget *parent)
@@ -1339,3 +1701,21 @@ void MessageWidget::OnClose(bool clicked)
1339 Q_UNUSED(clicked); 1701 Q_UNUSED(clicked);
1340 hide(); 1702 hide();
1341} 1703}
1704
1705/**
1706 * Misc
1707 */
1708
1709QGroupBox *Misc::EncloseInBox(const QString& name, QWidget *widget)
1710{
1711 QVBoxLayout *layout = new QVBoxLayout;
1712 layout->addWidget(widget);
1713 return Misc::EncloseInBox(name, layout);
1714}
1715
1716QGroupBox *Misc::EncloseInBox(const QString& name, QLayout *layout)
1717{
1718 QGroupBox *group = new QGroupBox(name);
1719 group->setLayout(layout);
1720 return group;
1721}
diff --git a/utils/regtools/qeditor/utils.h b/utils/regtools/qeditor/utils.h
index f3dbd15a22..026466fae0 100644
--- a/utils/regtools/qeditor/utils.h
+++ b/utils/regtools/qeditor/utils.h
@@ -38,9 +38,22 @@
38#include <QComboBox> 38#include <QComboBox>
39#include <QFileDialog> 39#include <QFileDialog>
40#include <QScrollBar> 40#include <QScrollBar>
41#include <QGroupBox>
42#include <QSortFilterProxyModel>
41#include "settings.h" 43#include "settings.h"
42#include "backend.h" 44#include "backend.h"
43 45
46// FIXME see QTBUG-30392
47namespace
48{
49template< typename T >
50inline bool isUserType(const QVariant& var)
51{
52 return var.type() == QVariant::UserType && var.userType() == qMetaTypeId< T >();
53}
54
55}
56
44class SocBitRangeValidator : public QValidator 57class SocBitRangeValidator : public QValidator
45{ 58{
46 Q_OBJECT 59 Q_OBJECT
@@ -51,6 +64,13 @@ public:
51 virtual State validate(QString& input, int& pos) const; 64 virtual State validate(QString& input, int& pos) const;
52 /* validate and return the interpreted value */ 65 /* validate and return the interpreted value */
53 State parse(const QString& input, int& last_bit, int& first_bit) const; 66 State parse(const QString& input, int& last_bit, int& first_bit) const;
67 /* create a valid string from range */
68 QString generate(int last_bit, int first_bit) const;
69 /* set maximum width in bits */
70 void setWidth(int nr_bits);
71
72protected:
73 int m_width;
54}; 74};
55 75
56class SocFieldValidator : public QValidator 76class SocFieldValidator : public QValidator
@@ -58,7 +78,7 @@ class SocFieldValidator : public QValidator
58 Q_OBJECT 78 Q_OBJECT
59public: 79public:
60 SocFieldValidator(QObject *parent = 0); 80 SocFieldValidator(QObject *parent = 0);
61 SocFieldValidator(const soc_reg_field_t& field, QObject *parent = 0); 81 SocFieldValidator(const soc_desc::field_t& field, QObject *parent = 0);
62 82
63 virtual void fixup(QString& input) const; 83 virtual void fixup(QString& input) const;
64 virtual State validate(QString& input, int& pos) const; 84 virtual State validate(QString& input, int& pos) const;
@@ -66,7 +86,7 @@ public:
66 State parse(const QString& input, soc_word_t& val) const; 86 State parse(const QString& input, soc_word_t& val) const;
67 87
68protected: 88protected:
69 soc_reg_field_t m_field; 89 soc_desc::field_t m_field;
70}; 90};
71 91
72class RegLineEdit : public QWidget 92class RegLineEdit : public QWidget
@@ -112,10 +132,11 @@ class SocFieldItemDelegate : public QStyledItemDelegate
112{ 132{
113public: 133public:
114 SocFieldItemDelegate(QObject *parent = 0):QStyledItemDelegate(parent), m_bitcount(32) {} 134 SocFieldItemDelegate(QObject *parent = 0):QStyledItemDelegate(parent), m_bitcount(32) {}
115 SocFieldItemDelegate(const soc_reg_field_t& field, QObject *parent = 0) 135 SocFieldItemDelegate(const soc_desc::field_t& field, QObject *parent = 0)
116 :QStyledItemDelegate(parent), m_bitcount(field.last_bit - field.first_bit + 1) {} 136 :QStyledItemDelegate(parent), m_bitcount(field.width) {}
117 137
118 virtual QString displayText(const QVariant& value, const QLocale& locale) const; 138 virtual QString displayText(const QVariant& value, const QLocale& locale) const;
139 void setWidth(int bitcount);
119protected: 140protected:
120 int m_bitcount; 141 int m_bitcount;
121}; 142};
@@ -125,44 +146,54 @@ class SocFieldEditor : public QLineEdit
125 Q_OBJECT 146 Q_OBJECT
126 Q_PROPERTY(uint field READ field WRITE setField USER true) 147 Q_PROPERTY(uint field READ field WRITE setField USER true)
127public: 148public:
128 SocFieldEditor(const soc_reg_field_t& field, QWidget *parent = 0); 149 SocFieldEditor(const soc_desc::field_t& field, QWidget *parent = 0);
129 virtual ~SocFieldEditor(); 150 virtual ~SocFieldEditor();
130 151
131 uint field() const; 152 uint field() const;
132 void setField(uint field); 153 void setField(uint field);
133 void SetRegField(const soc_reg_field_t& field); 154 void SetRegField(const soc_desc::field_t& field);
155
156signals:
157 void editingFinished(uint value);
158
159protected slots:
160 void editDone();
134 161
135protected: 162protected:
136 SocFieldValidator *m_validator; 163 SocFieldValidator *m_validator;
137 uint m_field; 164 uint m_field;
138 soc_reg_field_t m_reg_field; 165 soc_desc::field_t m_reg_field;
139}; 166};
140 167
141class SocFieldEditorCreator : public QItemEditorCreatorBase 168class SocFieldEditorCreator : public QItemEditorCreatorBase
142{ 169{
143public: 170public:
144 SocFieldEditorCreator() { m_field.first_bit = 0; m_field.last_bit = 31; } 171 SocFieldEditorCreator() { m_field.pos = 0; m_field.width = 32; }
145 SocFieldEditorCreator(const soc_reg_field_t& field):m_field(field) {} 172 SocFieldEditorCreator(const soc_desc::field_t& field):m_field(field) {}
146 173
147 virtual QWidget *createWidget(QWidget *parent) const; 174 virtual QWidget *createWidget(QWidget *parent) const;
148 virtual QByteArray valuePropertyName() const; 175 virtual QByteArray valuePropertyName() const;
149 176
177 void setWidth(int bitcount);
178
150protected: 179protected:
151 soc_reg_field_t m_field; 180 soc_desc::field_t m_field;
152}; 181};
153 182
154class SocFieldCachedValue 183class SocFieldCachedValue
155{ 184{
156public: 185public:
157 SocFieldCachedValue():m_value(0) {} 186 SocFieldCachedValue():m_value(0) {}
158 SocFieldCachedValue(const soc_reg_field_t& field, uint value); 187 SocFieldCachedValue(const soc_desc::field_t& field, uint value);
159 virtual ~SocFieldCachedValue() {} 188 virtual ~SocFieldCachedValue() {}
160 const soc_reg_field_t& field() const { return m_field; } 189 const soc_desc::field_t& field() const { return m_field; }
161 uint value() const { return m_value; } 190 uint value() const { return m_value; }
162 /* return empty string if there no match */ 191 /* return empty string if there no match */
163 QString value_name() const { return m_name; } 192 QString value_name() const { return m_name; }
193
194 bool operator<(const SocFieldCachedValue& o) const;
164protected: 195protected:
165 soc_reg_field_t m_field; 196 soc_desc::field_t m_field;
166 uint m_value; 197 uint m_value;
167 QString m_name; 198 QString m_name;
168}; 199};
@@ -172,11 +203,14 @@ Q_DECLARE_METATYPE(SocFieldCachedValue)
172class SocFieldBitRange 203class SocFieldBitRange
173{ 204{
174public: 205public:
175 SocFieldBitRange():m_first_bit(0),m_last_bit(0) {} 206 SocFieldBitRange():m_first_bit(0), m_last_bit(0) {}
176 SocFieldBitRange(const soc_reg_field_t& field) 207 SocFieldBitRange(const soc_desc::field_t& field)
177 :m_first_bit(field.first_bit), m_last_bit(field.last_bit) {} 208 :m_first_bit(field.pos), m_last_bit(field.pos + field.width - 1) {}
209 SocFieldBitRange(int first, int last):m_first_bit(first), m_last_bit(last) {}
178 unsigned GetFirstBit() const { return m_first_bit; } 210 unsigned GetFirstBit() const { return m_first_bit; }
179 unsigned GetLastBit() const { return m_last_bit; } 211 unsigned GetLastBit() const { return m_last_bit; }
212
213 bool operator<(const SocFieldBitRange& o) const;
180protected: 214protected:
181 unsigned m_first_bit, m_last_bit; 215 unsigned m_first_bit, m_last_bit;
182}; 216};
@@ -248,14 +282,16 @@ class RegFieldTableModel : public QAbstractTableModel
248 Q_OBJECT 282 Q_OBJECT
249public: 283public:
250 RegFieldTableModel(QObject *parent); 284 RegFieldTableModel(QObject *parent);
251 virtual int rowCount(const QModelIndex & parent = QModelIndex()) const; 285 virtual int rowCount(const QModelIndex& parent = QModelIndex()) const;
252 virtual int columnCount(const QModelIndex & parent = QModelIndex()) const; 286 virtual int columnCount(const QModelIndex& parent = QModelIndex()) const;
253 virtual QVariant data(const QModelIndex & index, int role) const; 287 virtual QVariant data(const QModelIndex& index, int role) const;
254 virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const; 288 virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const;
255 virtual Qt::ItemFlags flags (const QModelIndex & index) const; 289 virtual Qt::ItemFlags flags(const QModelIndex& index) const;
256 virtual bool setData(const QModelIndex& index, const QVariant& value, int role); 290 virtual bool setData(const QModelIndex& index, const QVariant& value, int role);
257 291
258 void SetRegister(const soc_reg_t& reg); 292 void SetRegister(const soc_desc::register_t& reg);
293 void UpdateRegister(const soc_desc::register_t& reg);
294 soc_desc::register_t GetRegister() const;
259 /* values can either be an invalid QVariant() (means no value/error), or a 295 /* values can either be an invalid QVariant() (means no value/error), or a
260 * QVariant containing a soc_word_t */ 296 * QVariant containing a soc_word_t */
261 void SetValues(const QVector< QVariant >& values); 297 void SetValues(const QVector< QVariant >& values);
@@ -286,22 +322,44 @@ protected:
286 Error 322 Error
287 }; 323 };
288 324
289 soc_reg_t m_reg; 325 soc_desc::register_t m_reg;
290 QVector< QVariant > m_value; 326 QVector< QVariant > m_value;
291 QVector< ColorStatus > m_status; 327 QVector< ColorStatus > m_status;
292 RegTheme m_theme; 328 RegTheme m_theme;
293 bool m_read_only; 329 bool m_read_only;
294}; 330};
295 331
296class RegSexyDisplay2 : public QAbstractItemView 332class RegFieldProxyModel : public QSortFilterProxyModel
333{
334public:
335 RegFieldProxyModel(QObject *parent):QSortFilterProxyModel(parent) {}
336protected:
337 bool lessThan(const QModelIndex& left, const QModelIndex& right) const;
338};
339
340class YRegDisplayItemDelegate : public QStyledItemDelegate
341{
342public:
343 YRegDisplayItemDelegate(QObject *parent = 0);
344 virtual void paint(QPainter * painter, const QStyleOptionViewItem& option,
345 const QModelIndex & index) const;
346 virtual QSize sizeHint(const QStyleOptionViewItem& option,
347 const QModelIndex & index) const;
348};
349
350class YRegDisplay : public QAbstractItemView
297{ 351{
298 Q_OBJECT 352 Q_OBJECT
299public: 353public:
300 RegSexyDisplay2(QWidget *parent = 0); 354 YRegDisplay(QWidget *parent = 0);
301 virtual QModelIndex indexAt(const QPoint& point) const; 355 virtual QModelIndex indexAt(const QPoint& point) const;
302 virtual void scrollTo(const QModelIndex& index, ScrollHint hint = EnsureVisible); 356 virtual void scrollTo(const QModelIndex& index, ScrollHint hint = EnsureVisible);
303 virtual QRect visualRect(const QModelIndex& index ) const; 357 virtual QRect visualRect(const QModelIndex& index) const;
304 virtual void setModel(QAbstractItemModel *model); 358 virtual void setModel(QAbstractItemModel *model);
359 /* specify the number of bits to display */
360 void setWidth(int nr_bits);
361 /* returns the bit column at a point, or -1 if none except if closest=true */
362 int bitColumnAt(const QPoint& point, bool closest = true) const;
305 363
306protected slots: 364protected slots:
307 virtual void dataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight); 365 virtual void dataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight);
@@ -311,14 +369,20 @@ protected slots:
311 virtual void updateGeometries(); 369 virtual void updateGeometries();
312 370
313protected: 371protected:
314 int GetMarginSize() const; // margin in cells 372 int marginSize() const; // margin in cells
315 int GetSeparatorSize() const; // size of lines betweens cells 373 int separatorSize() const; // size of lines betweens cells
316 int GetColumnWidth() const; // width of a 1-bit column (excluding separators) 374 int minColumnWidth() const; // minimum width of a column (excluding separators)
317 int GetHeaderHeight() const; // height of the header (excluding separators) 375 int maxColumnWidth() const; // maximum width of a column (excluding separators)
318 int GetGapHeight() const; // height of gap between header and fields 376 int columnWidth(int col) const; // width of a 1-bit column (excluding separators)
319 int GetMaxContentHeight() const; // maximum height of field columns 377 int headerHeight() const; // height of the header (excluding separators)
320 int GetHeaderTextSep() const; // height between digits in header 378 int gapHeight() const; // height of gap between header and fields
321 void RecomputeGeometry(); 379 int maxContentHeight() const; // maximum height of field columns
380 int headerTextSep() const; // height between digits in header
381 int columnOffset(int col) const; // column offset
382 int bitToColumn(int bit) const; // bit -> column
383 void recomputeGeometry();
384 QRect itemRect(const SocFieldBitRange& range, int col) const;
385 QRect itemRect(const QModelIndex& index) const;
322 386
323 virtual bool isIndexHidden(const QModelIndex& index) const; 387 virtual bool isIndexHidden(const QModelIndex& index) const;
324 virtual QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers); 388 virtual QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers);
@@ -328,9 +392,13 @@ protected:
328 virtual QRegion visualRegionForSelection(const QItemSelection& selection) const; 392 virtual QRegion visualRegionForSelection(const QItemSelection& selection) const;
329 virtual void paintEvent(QPaintEvent *event); 393 virtual void paintEvent(QPaintEvent *event);
330 virtual void resizeEvent(QResizeEvent* event); 394 virtual void resizeEvent(QResizeEvent* event);
395 virtual bool viewportEvent(QEvent * event);
331 396
332 bool m_is_dirty; 397 bool m_is_dirty;
333 int m_minimum_width, m_minimum_height; 398 int m_minimum_width, m_minimum_height;
399 int m_range_col, m_data_col;
400 int m_nr_bits;
401 QModelIndex m_hover;
334}; 402};
335 403
336/** 404/**
@@ -387,8 +455,10 @@ public:
387 void SetTextHtml(const QString& text); 455 void SetTextHtml(const QString& text);
388 QString GetTextHtml(); 456 QString GetTextHtml();
389 bool IsModified(); 457 bool IsModified();
458
390signals: 459signals:
391 void OnTextChanged(); 460 void OnTextChanged();
461 void OnTextChanged(const QString& text_html);
392 462
393protected slots: 463protected slots:
394 void OnInternalTextChanged(); 464 void OnInternalTextChanged();
@@ -398,6 +468,8 @@ protected slots:
398 void OnCharFormatChanged(const QTextCharFormat& fmt); 468 void OnCharFormatChanged(const QTextCharFormat& fmt);
399 469
400protected: 470protected:
471 virtual bool eventFilter(QObject *object, QEvent *event);
472
401 bool m_growing_mode; 473 bool m_growing_mode;
402 bool m_read_only; 474 bool m_read_only;
403 QToolBar *m_toolbar; 475 QToolBar *m_toolbar;
@@ -483,4 +555,35 @@ private slots:
483 void OnClose(bool clicked); 555 void OnClose(bool clicked);
484}; 556};
485 557
558Q_DECLARE_METATYPE(QModelIndex)
559
560class YTabWidget : public QTabWidget
561{
562 Q_OBJECT
563 Q_PROPERTY(bool tabOpenable READ tabOpenable WRITE setTabOpenable)
564public:
565 YTabWidget(QTabBar *tabbar = 0, QWidget *parent = 0);
566
567 inline bool tabOpenable() const { return m_tab_openable; }
568 void setTabOpenable(bool openable);
569 void setTabOpenMenu(QMenu *menu);
570
571signals:
572 void tabOpenRequested();
573
574protected slots:
575 void OnOpenButton(bool checked);
576
577protected:
578 bool m_tab_openable;
579 QToolButton *m_tab_open_button;
580};
581
582class Misc
583{
584public:
585 static QGroupBox *EncloseInBox(const QString& name, QWidget *widget);
586 static QGroupBox *EncloseInBox(const QString& name, QLayout *layout);
587};
588
486#endif /* AUX_H */ 589#endif /* AUX_H */