sc_bit_proxies.h revision 12027
1/***************************************************************************** 2 3 Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 4 more contributor license agreements. See the NOTICE file distributed 5 with this work for additional information regarding copyright ownership. 6 Accellera licenses this file to you under the Apache License, Version 2.0 7 (the "License"); you may not use this file except in compliance with the 8 License. You may obtain a copy of the License at 9 10 http://www.apache.org/licenses/LICENSE-2.0 11 12 Unless required by applicable law or agreed to in writing, software 13 distributed under the License is distributed on an "AS IS" BASIS, 14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 15 implied. See the License for the specific language governing 16 permissions and limitations under the License. 17 18 *****************************************************************************/ 19 20/***************************************************************************** 21 22 sc_bit_proxies.h -- Proxy classes for vector data types. 23 24 Original Author: Gene Bushuyev, Synopsys, Inc. 25 26 CHANGE LOG AT THE END OF THE FILE 27 *****************************************************************************/ 28 29#ifndef SC_BIT_PROXIES_H 30#define SC_BIT_PROXIES_H 31 32 33#include "sysc/datatypes/bit/sc_bit_ids.h" 34#include "sysc/datatypes/bit/sc_proxy.h" 35 36 37namespace sc_dt 38{ 39 40// classes defined in this module 41template <class X> class sc_bitref_r; 42template <class X> class sc_bitref; 43template <class X> class sc_subref_r; 44template <class X> class sc_subref; 45template <class X, class Y> class sc_concref_r; 46template <class X, class Y> class sc_concref; 47 48 49// ---------------------------------------------------------------------------- 50// CLASS TEMPLATE : sc_bitref_r<T> 51// 52// Proxy class for sc_proxy bit selection (r-value only). 53// ---------------------------------------------------------------------------- 54 55template <class T> 56class sc_bitref_r 57{ 58 friend class sc_bv_base; 59 friend class sc_lv_base; 60 61public: 62 63 // typedefs 64 65 typedef typename T::traits_type traits_type; 66 typedef typename traits_type::bit_type bit_type; 67 68 // constructor 69 70 sc_bitref_r( const T& obj_, int index_ ) 71 : m_obj( CCAST<T&>( obj_ ) ), m_index( index_ ) 72 {} 73 74 75 // copy constructor 76 77 sc_bitref_r( const sc_bitref_r<T>& a ) 78 : m_obj( a.m_obj ), m_index( a.m_index ) 79 {} 80 81 // cloning 82 83 sc_bitref_r<T>* clone() const 84 { return new sc_bitref_r<T>( *this ); } 85 86 87 // bitwise operators and functions 88 89 // bitwise complement 90 91 const bit_type operator ~ () const 92 { return bit_type( sc_logic::not_table[value()] ); } 93 94 95 // implicit conversion to bit_type 96 97 operator const bit_type() const 98 { return bit_type( m_obj.get_bit( m_index ) ); } 99 100 101 // explicit conversions 102 103 sc_logic_value_t value() const 104 { return m_obj.get_bit( m_index ); } 105 106 107 bool is_01() const 108 { return sc_logic( value() ).is_01(); } 109 110 bool to_bool() const 111 { return sc_logic( value() ).to_bool(); } 112 113 char to_char() const 114 { return sc_logic( value() ).to_char(); } 115 116 117 // common methods 118 119 int length() const 120 { return 1; } 121 122 int size() const 123 { return ( (length() - 1) / SC_DIGIT_SIZE + 1 ); } 124 125 sc_logic_value_t get_bit( int n ) const; 126 127 sc_digit get_word( int i ) const; 128 sc_digit get_cword( int i ) const; 129 130 131 // other methods 132 133 void print( ::std::ostream& os = ::std::cout ) const 134 { os << to_char(); } 135 136protected: 137 138 T& m_obj; 139 int m_index; 140 141private: 142 143 // disabled 144 sc_bitref_r(); 145 sc_bitref_r<T>& operator = ( const sc_bitref_r<T>& ); 146}; 147 148 149// bitwise operators and functions 150 151// bitwise and 152 153template <class T1, class T2> 154inline 155const sc_logic 156operator & ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b ); 157 158 159// bitwise or 160 161template <class T1, class T2> 162inline 163const sc_logic 164operator | ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b ); 165 166 167// bitwise xor 168 169template <class T1, class T2> 170inline 171const sc_logic 172operator ^ ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b ); 173 174 175// relational operators and functions 176 177template <class T1, class T2> 178inline 179bool 180operator == ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b ); 181 182template <class T1, class T2> 183inline 184bool 185operator != ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b ); 186 187 188// r-value concatenation operators and functions 189 190template <class T1, class T2> 191inline 192sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> > 193operator , ( sc_bitref_r<T1>, sc_bitref_r<T2> ); 194 195template <class T1, class T2> 196inline 197sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> > 198operator , ( sc_bitref_r<T1>, sc_subref_r<T2> ); 199 200template <class T1, class T2, class T3> 201inline 202sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> > 203operator , ( sc_bitref_r<T1>, sc_concref_r<T2,T3> ); 204 205template <class T1, class T2> 206inline 207sc_concref_r<sc_bitref_r<T1>,T2> 208operator , ( sc_bitref_r<T1>, const sc_proxy<T2>& ); 209 210template <class T> 211inline 212sc_concref_r<sc_bitref_r<T>,sc_lv_base> 213operator , ( sc_bitref_r<T>, const char* ); 214 215template <class T> 216inline 217sc_concref_r<sc_lv_base,sc_bitref_r<T> > 218operator , ( const char*, sc_bitref_r<T> ); 219 220template <class T> 221inline 222sc_concref_r<sc_bitref_r<T>,sc_lv_base> 223operator , ( sc_bitref_r<T>, const sc_logic& ); 224 225template <class T> 226inline 227sc_concref_r<sc_lv_base,sc_bitref_r<T> > 228operator , ( const sc_logic&, sc_bitref_r<T> ); 229 230template <class T> 231inline 232sc_concref_r<sc_bitref_r<T>,sc_lv_base> 233operator , ( sc_bitref_r<T>, bool ); 234 235template <class T> 236inline 237sc_concref_r<sc_lv_base,sc_bitref_r<T> > 238operator , ( bool, sc_bitref_r<T> ); 239 240 241template <class T1, class T2> 242inline 243sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> > 244concat( sc_bitref_r<T1>, sc_bitref_r<T2> ); 245 246template <class T1, class T2> 247inline 248sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> > 249concat( sc_bitref_r<T1>, sc_subref_r<T2> ); 250 251template <class T1, class T2, class T3> 252inline 253sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> > 254concat( sc_bitref_r<T1>, sc_concref_r<T2,T3> ); 255 256template <class T1, class T2> 257inline 258sc_concref_r<sc_bitref_r<T1>,T2> 259concat( sc_bitref_r<T1>, const sc_proxy<T2>& ); 260 261template <class T> 262inline 263sc_concref_r<sc_bitref_r<T>,sc_lv_base> 264concat( sc_bitref_r<T>, const char* ); 265 266template <class T> 267inline 268sc_concref_r<sc_lv_base,sc_bitref_r<T> > 269concat( const char*, sc_bitref_r<T> ); 270 271template <class T> 272inline 273sc_concref_r<sc_bitref_r<T>,sc_lv_base> 274concat( sc_bitref_r<T>, const sc_logic& ); 275 276template <class T> 277inline 278sc_concref_r<sc_lv_base,sc_bitref_r<T> > 279concat( const sc_logic&, sc_bitref_r<T> ); 280 281template <class T> 282inline 283sc_concref_r<sc_bitref_r<T>,sc_lv_base> 284concat( sc_bitref_r<T>, bool ); 285 286template <class T> 287inline 288sc_concref_r<sc_lv_base,sc_bitref_r<T> > 289concat( bool, sc_bitref_r<T> ); 290 291 292#ifdef SC_DT_MIXED_COMMA_OPERATORS 293 294template <class T1, class T2> 295inline 296sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> > 297operator , ( sc_bitref_r<T1>, sc_bitref<T2> ); 298 299template <class T1, class T2> 300inline 301sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> > 302operator , ( sc_bitref<T1>, sc_bitref_r<T2> ); 303 304template <class T1, class T2> 305inline 306sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> > 307operator , ( sc_bitref_r<T1>, sc_subref<T2> ); 308 309template <class T1, class T2> 310inline 311sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> > 312operator , ( sc_bitref<T1>, sc_subref_r<T2> ); 313 314template <class T1, class T2, class T3> 315inline 316sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> > 317operator , ( sc_bitref_r<T1>, sc_concref<T2,T3> ); 318 319template <class T1, class T2, class T3> 320inline 321sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> > 322operator , ( sc_bitref<T1>, sc_concref_r<T2,T3> ); 323 324template <class T1, class T2> 325inline 326sc_concref_r<sc_bitref_r<T1>,T2> 327operator , ( sc_bitref<T1>, const sc_proxy<T2>& ); 328 329template <class T1, class T2> 330inline 331sc_concref_r<sc_bitref_r<T1>,T2> 332operator , ( sc_bitref_r<T1>, sc_proxy<T2>& ); 333 334template <class T> 335inline 336sc_concref_r<sc_bitref_r<T>,sc_lv_base> 337operator , ( sc_bitref<T>, const char* ); 338 339template <class T> 340inline 341sc_concref_r<sc_lv_base,sc_bitref_r<T> > 342operator , ( const char*, sc_bitref<T> ); 343 344template <class T> 345inline 346sc_concref_r<sc_bitref_r<T>,sc_lv_base> 347operator , ( sc_bitref<T>, const sc_logic& ); 348 349template <class T> 350inline 351sc_concref_r<sc_lv_base,sc_bitref_r<T> > 352operator , ( const sc_logic&, sc_bitref<T> ); 353 354template <class T> 355inline 356sc_concref_r<sc_bitref_r<T>,sc_lv_base> 357operator , ( sc_bitref<T>, bool ); 358 359template <class T> 360inline 361sc_concref_r<sc_lv_base,sc_bitref_r<T> > 362operator , ( bool, sc_bitref<T> ); 363 364 365template <class T1, class T2> 366inline 367sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> > 368concat( sc_bitref_r<T1>, sc_bitref<T2> ); 369 370template <class T1, class T2> 371inline 372sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> > 373concat( sc_bitref<T1>, sc_bitref_r<T2> ); 374 375template <class T1, class T2> 376inline 377sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> > 378concat( sc_bitref_r<T1>, sc_subref<T2> ); 379 380template <class T1, class T2> 381inline 382sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> > 383concat( sc_bitref<T1>, sc_subref_r<T2> ); 384 385template <class T1, class T2, class T3> 386inline 387sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> > 388concat( sc_bitref_r<T1>, sc_concref<T2,T3> ); 389 390template <class T1, class T2, class T3> 391inline 392sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> > 393concat( sc_bitref<T1>, sc_concref_r<T2,T3> ); 394 395template <class T1, class T2> 396inline 397sc_concref_r<sc_bitref_r<T1>,T2> 398concat( sc_bitref<T1>, const sc_proxy<T2>& ); 399 400template <class T1, class T2> 401inline 402sc_concref_r<sc_bitref_r<T1>,T2> 403concat( sc_bitref_r<T1>, sc_proxy<T2>& ); 404 405template <class T> 406inline 407sc_concref_r<sc_bitref_r<T>,sc_lv_base> 408concat( sc_bitref<T>, const char* ); 409 410template <class T> 411inline 412sc_concref_r<sc_lv_base,sc_bitref_r<T> > 413concat( const char*, sc_bitref<T> ); 414 415template <class T> 416inline 417sc_concref_r<sc_bitref_r<T>,sc_lv_base> 418concat( sc_bitref<T>, const sc_logic& ); 419 420template <class T> 421inline 422sc_concref_r<sc_lv_base,sc_bitref_r<T> > 423concat( const sc_logic&, sc_bitref<T> ); 424 425template <class T> 426inline 427sc_concref_r<sc_bitref_r<T>,sc_lv_base> 428concat( sc_bitref<T>, bool ); 429 430template <class T> 431inline 432sc_concref_r<sc_lv_base,sc_bitref_r<T> > 433concat( bool, sc_bitref<T> ); 434 435#endif 436 437 438// ---------------------------------------------------------------------------- 439// CLASS TEMPLATE : sc_bitref<X> 440// 441// Proxy class for sc_proxy bit selection (r-value and l-value). 442// ---------------------------------------------------------------------------- 443 444template <class X> 445class sc_bitref 446 : public sc_bitref_r<X> 447{ 448 friend class sc_bv_base; 449 friend class sc_lv_base; 450 451public: 452 453 // constructor 454 455 sc_bitref( X& obj_, int index_ ) 456 : sc_bitref_r<X>( obj_, index_ ) 457 {} 458 459 460 // copy constructor 461 462 sc_bitref( const sc_bitref<X>& a ) 463 : sc_bitref_r<X>( a ) 464 {} 465 466 467 // cloning 468 469 sc_bitref<X>* clone() const 470 { return new sc_bitref<X>( *this ); } 471 472 473 // assignment operators 474 475 sc_bitref<X>& operator = ( const sc_bitref_r<X>& a ); 476 sc_bitref<X>& operator = ( const sc_bitref<X>& a ); 477 478 sc_bitref<X>& operator = ( const sc_logic& a ) 479 { this->m_obj.set_bit( this->m_index, a.value() ); return *this; } 480 481 sc_bitref<X>& operator = ( sc_logic_value_t v ) 482 { *this = sc_logic( v ); return *this; } 483 484 sc_bitref<X>& operator = ( bool a ) 485 { *this = sc_logic( a ); return *this; } 486 487 sc_bitref<X>& operator = ( char a ) 488 { *this = sc_logic( a ); return *this; } 489 490 sc_bitref<X>& operator = ( int a ) 491 { *this = sc_logic( a ); return *this; } 492 493 sc_bitref<X>& operator = ( const sc_bit& a ) 494 { *this = sc_logic( a ); return *this; } 495 496 497 // bitwise assignment operators 498 499 sc_bitref<X>& operator &= ( const sc_bitref_r<X>& a ); 500 sc_bitref<X>& operator &= ( const sc_logic& a ); 501 502 sc_bitref<X>& operator &= ( sc_logic_value_t v ) 503 { *this &= sc_logic( v ); return *this; } 504 505 sc_bitref<X>& operator &= ( bool a ) 506 { *this &= sc_logic( a ); return *this; } 507 508 sc_bitref<X>& operator &= ( char a ) 509 { *this &= sc_logic( a ); return *this; } 510 511 sc_bitref<X>& operator &= ( int a ) 512 { *this &= sc_logic( a ); return *this; } 513 514 515 sc_bitref<X>& operator |= ( const sc_bitref_r<X>& a ); 516 sc_bitref<X>& operator |= ( const sc_logic& a ); 517 518 sc_bitref<X>& operator |= ( sc_logic_value_t v ) 519 { *this |= sc_logic( v ); return *this; } 520 521 sc_bitref<X>& operator |= ( bool a ) 522 { *this |= sc_logic( a ); return *this; } 523 524 sc_bitref<X>& operator |= ( char a ) 525 { *this |= sc_logic( a ); return *this; } 526 527 sc_bitref<X>& operator |= ( int a ) 528 { *this |= sc_logic( a ); return *this; } 529 530 531 sc_bitref<X>& operator ^= ( const sc_bitref_r<X>& a ); 532 sc_bitref<X>& operator ^= ( const sc_logic& a ); 533 534 sc_bitref<X>& operator ^= ( sc_logic_value_t v ) 535 { *this ^= sc_logic( v ); return *this; } 536 537 sc_bitref<X>& operator ^= ( bool a ) 538 { *this ^= sc_logic( a ); return *this; } 539 540 sc_bitref<X>& operator ^= ( char a ) 541 { *this ^= sc_logic( a ); return *this; } 542 543 sc_bitref<X>& operator ^= ( int a ) 544 { *this ^= sc_logic( a ); return *this; } 545 546 547 // bitwise operators and functions 548 549 // bitwise complement 550 551 sc_bitref<X>& b_not(); 552 553 554 // common methods 555 556 void set_bit( int n, sc_logic_value_t value ); 557 558 void set_word( int i, sc_digit w ); 559 void set_cword( int i, sc_digit w ); 560 561 void clean_tail() 562 { this->m_obj.clean_tail(); } 563 564 565 // other methods 566 567 void scan( ::std::istream& is = ::std::cin ); 568 569private: 570 571 // disabled 572 sc_bitref(); 573}; 574 575 576// l-value concatenation operators and functions 577 578template <class T1, class T2> 579inline 580sc_concref<sc_bitref<T1>,sc_bitref<T2> > 581operator , ( sc_bitref<T1>, sc_bitref<T2> ); 582 583template <class T1, class T2> 584inline 585sc_concref<sc_bitref<T1>,sc_subref<T2> > 586operator , ( sc_bitref<T1>, sc_subref<T2> ); 587 588template <class T1, class T2, class T3> 589inline 590sc_concref<sc_bitref<T1>,sc_concref<T2,T3> > 591operator , ( sc_bitref<T1>, sc_concref<T2,T3> ); 592 593template <class T1, class T2> 594inline 595sc_concref<sc_bitref<T1>,T2> 596operator , ( sc_bitref<T1>, sc_proxy<T2>& ); 597 598 599template <class T1, class T2> 600inline 601sc_concref<sc_bitref<T1>,sc_bitref<T2> > 602concat( sc_bitref<T1>, sc_bitref<T2> ); 603 604template <class T1, class T2> 605inline 606sc_concref<sc_bitref<T1>,sc_subref<T2> > 607concat( sc_bitref<T1>, sc_subref<T2> ); 608 609template <class T1, class T2, class T3> 610inline 611sc_concref<sc_bitref<T1>,sc_concref<T2,T3> > 612concat( sc_bitref<T1>, sc_concref<T2,T3> ); 613 614template <class T1, class T2> 615inline 616sc_concref<sc_bitref<T1>,T2> 617concat( sc_bitref<T1>, sc_proxy<T2>& ); 618 619 620template <class T> 621::std::istream& 622operator >> ( ::std::istream&, sc_bitref<T> ); 623 624 625// ---------------------------------------------------------------------------- 626// CLASS TEMPLATE : sc_subref_r<X> 627// 628// Proxy class for sc_proxy part selection (r-value only). 629// ---------------------------------------------------------------------------- 630 631template <class X> 632class sc_subref_r 633 : public sc_proxy<sc_subref_r<X> > 634{ 635 void check_bounds(); 636 637public: 638 639 // constructor 640 641 sc_subref_r( const X& obj_, int hi_, int lo_ ) 642 : m_obj( CCAST<X&>( obj_ ) ), m_hi( hi_ ), m_lo( lo_ ), m_len( 0 ) 643 { check_bounds(); } 644 645 646 // copy constructor 647 648 sc_subref_r( const sc_subref_r<X>& a ) 649 : m_obj( a.m_obj ), m_hi( a.m_hi ), m_lo( a.m_lo ), m_len( a.m_len ) 650 {} 651 652 653 // cloning 654 655 sc_subref_r<X>* clone() const 656 { return new sc_subref_r<X>( *this ); } 657 658 659 // common methods 660 661 int length() const 662 { return m_len; } 663 664 int size() const 665 { return ( (length() - 1) / SC_DIGIT_SIZE + 1 ); } 666 667 sc_logic_value_t get_bit( int n ) const; 668 void set_bit( int n, sc_logic_value_t value ); 669 670 sc_digit get_word( int i )const; 671 void set_word( int i, sc_digit w ); 672 673 sc_digit get_cword( int i ) const; 674 void set_cword( int i, sc_digit w ); 675 676 void clean_tail() 677 { m_obj.clean_tail(); } 678 679 680 // other methods 681 682 bool is_01() const; 683 684 bool reversed() const 685 { return m_lo > m_hi; } 686 687protected: 688 689 X& m_obj; 690 int m_hi; 691 int m_lo; 692 int m_len; 693 694private: 695 696 // disabled 697 sc_subref_r(); 698 sc_subref_r<X>& operator = ( const sc_subref_r<X>& ); 699}; 700 701 702// r-value concatenation operators and functions 703 704template <class T1, class T2> 705inline 706sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> > 707operator , ( sc_subref_r<T1>, sc_bitref_r<T2> ); 708 709template <class T1, class T2> 710inline 711sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> > 712operator , ( sc_subref_r<T1>, sc_subref_r<T2> ); 713 714template <class T1, class T2, class T3> 715inline 716sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> > 717operator , ( sc_subref_r<T1>, sc_concref_r<T2,T3> ); 718 719template <class T1, class T2> 720inline 721sc_concref_r<sc_subref_r<T1>,T2> 722operator , ( sc_subref_r<T1>, const sc_proxy<T2>& ); 723 724template <class T> 725inline 726sc_concref_r<sc_subref_r<T>,sc_lv_base> 727operator , ( sc_subref_r<T>, const char* ); 728 729template <class T> 730inline 731sc_concref_r<sc_lv_base,sc_subref_r<T> > 732operator , ( const char*, sc_subref_r<T> ); 733 734template <class T> 735inline 736sc_concref_r<sc_subref_r<T>,sc_lv_base> 737operator , ( sc_subref_r<T>, const sc_logic& ); 738 739template <class T> 740inline 741sc_concref_r<sc_lv_base,sc_subref_r<T> > 742operator , ( const sc_logic&, sc_subref_r<T> ); 743 744template <class T> 745inline 746sc_concref_r<sc_subref_r<T>,sc_bv_base> 747operator , ( sc_subref_r<T>, bool ); 748 749template <class T> 750inline 751sc_concref_r<sc_bv_base,sc_subref_r<T> > 752operator , ( bool, sc_subref_r<T> ); 753 754 755template <class T1, class T2> 756inline 757sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> > 758concat( sc_subref_r<T1>, sc_bitref_r<T2> ); 759 760template <class T1, class T2> 761inline 762sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> > 763concat( sc_subref_r<T1>, sc_subref_r<T2> ); 764 765template <class T1, class T2, class T3> 766inline 767sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> > 768concat( sc_subref_r<T1>, sc_concref_r<T2,T3> ); 769 770template <class T1, class T2> 771inline 772sc_concref_r<sc_subref_r<T1>,T2> 773concat( sc_subref_r<T1>, const sc_proxy<T2>& ); 774 775template <class T> 776inline 777sc_concref_r<sc_subref_r<T>,sc_lv_base> 778concat( sc_subref_r<T>, const char* ); 779 780template <class T> 781inline 782sc_concref_r<sc_lv_base,sc_subref_r<T> > 783concat( const char*, sc_subref_r<T> ); 784 785template <class T> 786inline 787sc_concref_r<sc_subref_r<T>,sc_lv_base> 788concat( sc_subref_r<T>, const sc_logic& ); 789 790template <class T> 791inline 792sc_concref_r<sc_lv_base,sc_subref_r<T> > 793concat( const sc_logic&, sc_subref_r<T> ); 794 795template <class T> 796inline 797sc_concref_r<sc_subref_r<T>,sc_bv_base> 798concat( sc_subref_r<T>, bool ); 799 800template <class T> 801inline 802sc_concref_r<sc_bv_base,sc_subref_r<T> > 803concat( bool, sc_subref_r<T> ); 804 805 806#ifdef SC_DT_MIXED_COMMA_OPERATORS 807 808template <class T1, class T2> 809inline 810sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> > 811operator , ( sc_subref_r<T1>, sc_bitref<T2> ); 812 813template <class T1, class T2> 814inline 815sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> > 816operator , ( sc_subref<T1>, sc_bitref_r<T2> ); 817 818template <class T1, class T2> 819inline 820sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> > 821operator , ( sc_subref_r<T1>, sc_subref<T2> ); 822 823template <class T1, class T2> 824inline 825sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> > 826operator , ( sc_subref<T1>, sc_subref_r<T2> ); 827 828template <class T1, class T2, class T3> 829inline 830sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> > 831operator , ( sc_subref_r<T1>, sc_concref<T2,T3> ); 832 833template <class T1, class T2, class T3> 834inline 835sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> > 836operator , ( sc_subref<T1>, sc_concref_r<T2,T3> ); 837 838template <class T1, class T2> 839inline 840sc_concref_r<sc_subref_r<T1>,T2> 841operator , ( sc_subref<T1>, const sc_proxy<T2>& ); 842 843template <class T1, class T2> 844inline 845sc_concref_r<sc_subref_r<T1>,T2> 846operator , ( sc_subref_r<T1>, sc_proxy<T2>& ); 847 848template <class T> 849inline 850sc_concref_r<sc_subref_r<T>,sc_lv_base> 851operator , ( sc_subref<T>, const char* ); 852 853template <class T> 854inline 855sc_concref_r<sc_lv_base,sc_subref_r<T> > 856operator , ( const char*, sc_subref<T> ); 857 858template <class T> 859inline 860sc_concref_r<sc_subref_r<T>,sc_lv_base> 861operator , ( sc_subref<T>, const sc_logic& ); 862 863template <class T> 864inline 865sc_concref_r<sc_lv_base,sc_subref_r<T> > 866operator , ( const sc_logic&, sc_subref<T> ); 867 868template <class T> 869inline 870sc_concref_r<sc_subref_r<T>,sc_bv_base> 871operator , ( sc_subref<T>, bool ); 872 873template <class T> 874inline 875sc_concref_r<sc_bv_base,sc_subref_r<T> > 876operator , ( bool, sc_subref<T> ); 877 878 879template <class T1, class T2> 880inline 881sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> > 882concat( sc_subref_r<T1>, sc_bitref<T2> ); 883 884template <class T1, class T2> 885inline 886sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> > 887concat( sc_subref<T1>, sc_bitref_r<T2> ); 888 889template <class T1, class T2> 890inline 891sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> > 892concat( sc_subref_r<T1>, sc_subref<T2> ); 893 894template <class T1, class T2> 895inline 896sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> > 897concat( sc_subref<T1>, sc_subref_r<T2> ); 898 899template <class T1, class T2, class T3> 900inline 901sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> > 902concat( sc_subref_r<T1>, sc_concref<T2,T3> ); 903 904template <class T1, class T2, class T3> 905inline 906sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> > 907concat( sc_subref<T1>, sc_concref_r<T2,T3> ); 908 909template <class T1, class T2> 910inline 911sc_concref_r<sc_subref_r<T1>,T2> 912concat( sc_subref<T1>, const sc_proxy<T2>& ); 913 914template <class T1, class T2> 915inline 916sc_concref_r<sc_subref_r<T1>,T2> 917concat( sc_subref_r<T1>, sc_proxy<T2>& ); 918 919template <class T> 920inline 921sc_concref_r<sc_subref_r<T>,sc_lv_base> 922concat( sc_subref<T>, const char* ); 923 924template <class T> 925inline 926sc_concref_r<sc_lv_base,sc_subref_r<T> > 927concat( const char*, sc_subref<T> ); 928 929template <class T> 930inline 931sc_concref_r<sc_subref_r<T>,sc_lv_base> 932concat( sc_subref<T>, const sc_logic& ); 933 934template <class T> 935inline 936sc_concref_r<sc_lv_base,sc_subref_r<T> > 937concat( const sc_logic&, sc_subref<T> ); 938 939template <class T> 940inline 941sc_concref_r<sc_subref_r<T>,sc_bv_base> 942concat( sc_subref<T>, bool ); 943 944template <class T> 945inline 946sc_concref_r<sc_bv_base,sc_subref_r<T> > 947concat( bool, sc_subref<T> ); 948 949#endif 950 951 952// ---------------------------------------------------------------------------- 953// CLASS TEMPLATE : sc_subref<X> 954// 955// Proxy class for sc_proxy part selection (r-value and l-value). 956// ---------------------------------------------------------------------------- 957 958template <class X> 959class sc_subref 960 : public sc_subref_r<X> 961{ 962public: 963 964 // typedefs 965 966 typedef sc_subref_r<X> base_type; 967 968 969 // constructor 970 971 sc_subref( X& obj_, int hi_, int lo_ ) 972 : sc_subref_r<X>( obj_, hi_, lo_ ) 973 {} 974 975 976 // copy constructor 977 978 sc_subref( const sc_subref<X>& a ) 979 : sc_subref_r<X>( a ) 980 {} 981 982 983 // cloning 984 985 sc_subref<X>* clone() const 986 { return new sc_subref<X>( *this ); } 987 988 989 // assignment operators 990 991 template <class Y> 992 sc_subref<X>& operator = ( const sc_proxy<Y>& a ) 993 { base_type::assign_( a ); return *this; } 994 995 sc_subref<X>& operator = ( const sc_subref_r<X>& a ); 996 sc_subref<X>& operator = ( const sc_subref<X>& a ); 997 998 sc_subref<X>& operator = ( const char* a ) 999 { base_type::assign_( a ); return *this; } 1000 1001 sc_subref<X>& operator = ( const bool* a ) 1002 { base_type::assign_( a ); return *this; } 1003 1004 sc_subref<X>& operator = ( const sc_logic* a ) 1005 { base_type::assign_( a ); return *this; } 1006 1007 sc_subref<X>& operator = ( const sc_unsigned& a ) 1008 { base_type::assign_( a ); return *this; } 1009 1010 sc_subref<X>& operator = ( const sc_signed& a ) 1011 { base_type::assign_( a ); return *this; } 1012 1013 sc_subref<X>& operator = ( const sc_uint_base& a ) 1014 { base_type::assign_( a ); return *this; } 1015 1016 sc_subref<X>& operator = ( const sc_int_base& a ) 1017 { base_type::assign_( a ); return *this; } 1018 1019 sc_subref<X>& operator = ( unsigned long a ) 1020 { base_type::assign_( a ); return *this; } 1021 1022 sc_subref<X>& operator = ( long a ) 1023 { base_type::assign_( a ); return *this; } 1024 1025 sc_subref<X>& operator = ( unsigned int a ) 1026 { base_type::assign_( a ); return *this; } 1027 1028 sc_subref<X>& operator = ( int a ) 1029 { base_type::assign_( a ); return *this; } 1030 1031 sc_subref<X>& operator = ( uint64 a ) 1032 { base_type::assign_( a ); return *this; } 1033 1034 sc_subref<X>& operator = ( int64 a ) 1035 { base_type::assign_( a ); return *this; } 1036 1037 1038 // other methods 1039 1040 void scan( ::std::istream& = ::std::cin ); 1041 1042private: 1043 1044 // disabled 1045 sc_subref(); 1046}; 1047 1048 1049// l-value concatenation operators and functions 1050 1051template <class T1, class T2> 1052inline 1053sc_concref<sc_subref<T1>,sc_bitref<T2> > 1054operator , ( sc_subref<T1>, sc_bitref<T2> ); 1055 1056template <class T1, class T2> 1057inline 1058sc_concref<sc_subref<T1>,sc_subref<T2> > 1059operator , ( sc_subref<T1>, sc_subref<T2> ); 1060 1061template <class T1, class T2, class T3> 1062inline 1063sc_concref<sc_subref<T1>,sc_concref<T2,T3> > 1064operator , ( sc_subref<T1>, sc_concref<T2,T3> ); 1065 1066template <class T1, class T2> 1067inline 1068sc_concref<sc_subref<T1>,T2> 1069operator , ( sc_subref<T1>, sc_proxy<T2>& ); 1070 1071 1072template <class T1, class T2> 1073inline 1074sc_concref<sc_subref<T1>,sc_bitref<T2> > 1075concat( sc_subref<T1>, sc_bitref<T2> ); 1076 1077template <class T1, class T2> 1078inline 1079sc_concref<sc_subref<T1>,sc_subref<T2> > 1080concat( sc_subref<T1>, sc_subref<T2> ); 1081 1082template <class T1, class T2, class T3> 1083inline 1084sc_concref<sc_subref<T1>,sc_concref<T2,T3> > 1085concat( sc_subref<T1>, sc_concref<T2,T3> ); 1086 1087template <class T1, class T2> 1088inline 1089sc_concref<sc_subref<T1>,T2> 1090concat( sc_subref<T1>, sc_proxy<T2>& ); 1091 1092 1093template <class T> 1094inline 1095::std::istream& 1096operator >> ( ::std::istream&, sc_subref<T> ); 1097 1098 1099// ---------------------------------------------------------------------------- 1100// CLASS TEMPLATE : sc_concref_r<X,Y> 1101// 1102// Proxy class for sc_proxy concatenation (r-value only). 1103// ---------------------------------------------------------------------------- 1104 1105template <class X, class Y> 1106class sc_concref_r 1107 : public sc_proxy<sc_concref_r<X,Y> > 1108{ 1109public: 1110 1111 // constructor 1112 1113 sc_concref_r( const X& left_, const Y& right_, int delete_ = 0 ) 1114 : m_left( CCAST<X&>( left_ ) ), m_right( CCAST<Y&>( right_ ) ), 1115 m_delete( delete_ ), m_refs( *new int( 1 ) ) 1116 {} 1117 1118 1119 // copy constructor 1120 1121 sc_concref_r( const sc_concref_r<X,Y>& a ) 1122 : m_left( a.m_left ), m_right( a.m_right ), 1123 m_delete( a.m_delete ), m_refs( a.m_refs ) 1124 { ++ m_refs; } 1125 1126 1127 // destructor 1128 1129 virtual ~sc_concref_r(); 1130 1131 1132 // cloning 1133 1134 sc_concref_r<X,Y>* clone() const 1135 { return new sc_concref_r<X,Y>( *this ); } 1136 1137 1138 // common methods 1139 1140 int length() const 1141 { return ( m_left.length() + m_right.length() ); } 1142 1143 int size() const 1144 { return ( (length() - 1) / SC_DIGIT_SIZE + 1 ); } 1145 1146 sc_logic_value_t get_bit( int n ) const; 1147 void set_bit( int n, sc_logic_value_t value ); 1148 1149 sc_digit get_word( int i ) const; 1150 void set_word( int i, sc_digit w ); 1151 1152 sc_digit get_cword( int i ) const; 1153 void set_cword( int i, sc_digit w ); 1154 1155 void clean_tail() 1156 { m_left.clean_tail(); m_right.clean_tail(); } 1157 1158 1159 // other methods 1160 1161 bool is_01() const 1162 { return ( m_left.is_01() && m_right.is_01() ); } 1163 1164protected: 1165 1166 X& m_left; 1167 Y& m_right; 1168 mutable int m_delete; 1169 int& m_refs; 1170 1171private: 1172 1173 // disabled 1174 sc_concref_r(); 1175 sc_concref_r<X,Y>& operator = ( const sc_concref_r<X,Y>& ); 1176}; 1177 1178 1179// r-value concatenation operators and functions 1180 1181template <class T1, class T2, class T3> 1182inline 1183sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> > 1184operator , ( sc_concref_r<T1,T2>, sc_bitref_r<T3> ); 1185 1186template <class T1, class T2, class T3> 1187inline 1188sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> > 1189operator , ( sc_concref_r<T1,T2>, sc_subref_r<T3> ); 1190 1191template <class T1, class T2, class T3, class T4> 1192inline 1193sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> > 1194operator , ( sc_concref_r<T1,T2>, sc_concref_r<T3,T4> ); 1195 1196template <class T1, class T2, class T3> 1197inline 1198sc_concref_r<sc_concref_r<T1,T2>,T3> 1199operator , ( sc_concref_r<T1,T2>, const sc_proxy<T3>& ); 1200 1201template <class T1, class T2> 1202inline 1203sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base> 1204operator , ( sc_concref_r<T1,T2>, const char* ); 1205 1206template <class T1, class T2> 1207inline 1208sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> > 1209operator , ( const char*, sc_concref_r<T1,T2> ); 1210 1211template <class T1, class T2> 1212inline 1213sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base> 1214operator , ( sc_concref_r<T1,T2>, const sc_logic& ); 1215 1216template <class T1, class T2> 1217inline 1218sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> > 1219operator , ( const sc_logic&, sc_concref_r<T1,T2> ); 1220 1221template <class T1, class T2> 1222inline 1223sc_concref_r<sc_concref_r<T1,T2>,sc_bv_base> 1224operator , ( sc_concref_r<T1,T2>, bool ); 1225 1226template <class T1, class T2> 1227inline 1228sc_concref_r<sc_bv_base,sc_concref_r<T1,T2> > 1229operator , ( bool, sc_concref_r<T1,T2> ); 1230 1231 1232template <class T1, class T2, class T3> 1233inline 1234sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> > 1235concat( sc_concref_r<T1,T2>, sc_bitref_r<T3> ); 1236 1237template <class T1, class T2, class T3> 1238inline 1239sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> > 1240concat( sc_concref_r<T1,T2>, sc_subref_r<T3> ); 1241 1242template <class T1, class T2, class T3, class T4> 1243inline 1244sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> > 1245concat( sc_concref_r<T1,T2>, sc_concref_r<T3,T4> ); 1246 1247template <class T1, class T2, class T3> 1248inline 1249sc_concref_r<sc_concref_r<T1,T2>,T3> 1250concat( sc_concref_r<T1,T2>, const sc_proxy<T3>& ); 1251 1252template <class T1, class T2> 1253inline 1254sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base> 1255concat( sc_concref_r<T1,T2>, const char* ); 1256 1257template <class T1, class T2> 1258inline 1259sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> > 1260concat( const char*, sc_concref_r<T1,T2> ); 1261 1262template <class T1, class T2> 1263inline 1264sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base> 1265concat( sc_concref_r<T1,T2>, const sc_logic& ); 1266 1267template <class T1, class T2> 1268inline 1269sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> > 1270concat( const sc_logic&, sc_concref_r<T1,T2> ); 1271 1272template <class T1, class T2> 1273inline 1274sc_concref_r<sc_concref_r<T1,T2>,sc_bv_base> 1275concat( sc_concref_r<T1,T2>, bool ); 1276 1277template <class T1, class T2> 1278inline 1279sc_concref_r<sc_bv_base,sc_concref_r<T1,T2> > 1280concat( bool, sc_concref_r<T1,T2> ); 1281 1282 1283#ifdef SC_DT_MIXED_COMMA_OPERATORS 1284 1285template <class T1, class T2, class T3> 1286inline 1287sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> > 1288operator , ( sc_concref_r<T1,T2>, sc_bitref<T3> ); 1289 1290template <class T1, class T2, class T3> 1291inline 1292sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> > 1293operator , ( sc_concref<T1,T2>, sc_bitref_r<T3> ); 1294 1295template <class T1, class T2, class T3> 1296inline 1297sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> > 1298operator , ( sc_concref_r<T1,T2>, sc_subref<T3> ); 1299 1300template <class T1, class T2, class T3> 1301inline 1302sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> > 1303operator , ( sc_concref<T1,T2>, sc_subref_r<T3> ); 1304 1305template <class T1, class T2, class T3, class T4> 1306inline 1307sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> > 1308operator , ( sc_concref_r<T1,T2>, sc_concref<T3,T4> ); 1309 1310template <class T1, class T2, class T3, class T4> 1311inline 1312sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> > 1313operator , ( sc_concref<T1,T2>, sc_concref_r<T3,T4> ); 1314 1315template <class T1, class T2, class T3> 1316inline 1317sc_concref_r<sc_concref_r<T1,T2>,T3> 1318operator , ( sc_concref<T1,T2>, const sc_proxy<T3>& ); 1319 1320template <class T1, class T2, class T3> 1321inline 1322sc_concref_r<sc_concref_r<T1,T2>,T3> 1323operator , ( sc_concref_r<T1,T2>, sc_proxy<T3>& ); 1324 1325template <class T1, class T2> 1326inline 1327sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base> 1328operator , ( sc_concref<T1,T2>, const char* ); 1329 1330template <class T1, class T2> 1331inline 1332sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> > 1333operator , ( const char*, sc_concref<T1,T2> ); 1334 1335template <class T1, class T2> 1336inline 1337sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base> 1338operator , ( sc_concref<T1,T2>, const sc_logic& ); 1339 1340template <class T1, class T2> 1341inline 1342sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> > 1343operator , ( const sc_logic&, sc_concref<T1,T2> ); 1344 1345template <class T1, class T2> 1346inline 1347sc_concref_r<sc_concref_r<T1,T2>,sc_bv_base> 1348operator , ( sc_concref<T1,T2>, bool ); 1349 1350template <class T1, class T2> 1351inline 1352sc_concref_r<sc_bv_base,sc_concref_r<T1,T2> > 1353operator , ( bool, sc_concref<T1,T2> ); 1354 1355 1356template <class T1, class T2, class T3> 1357inline 1358sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> > 1359concat( sc_concref_r<T1,T2>, sc_bitref<T3> ); 1360 1361template <class T1, class T2, class T3> 1362inline 1363sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> > 1364concat( sc_concref<T1,T2>, sc_bitref_r<T3> ); 1365 1366template <class T1, class T2, class T3> 1367inline 1368sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> > 1369concat( sc_concref_r<T1,T2>, sc_subref<T3> ); 1370 1371template <class T1, class T2, class T3> 1372inline 1373sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> > 1374concat( sc_concref<T1,T2>, sc_subref_r<T3> ); 1375 1376template <class T1, class T2, class T3, class T4> 1377inline 1378sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> > 1379concat( sc_concref_r<T1,T2>, sc_concref<T3,T4> ); 1380 1381template <class T1, class T2, class T3, class T4> 1382inline 1383sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> > 1384concat( sc_concref<T1,T2>, sc_concref_r<T3,T4> ); 1385 1386template <class T1, class T2, class T3> 1387inline 1388sc_concref_r<sc_concref_r<T1,T2>,T3> 1389concat( sc_concref<T1,T2>, const sc_proxy<T3>& ); 1390 1391template <class T1, class T2, class T3> 1392inline 1393sc_concref_r<sc_concref_r<T1,T2>,T3> 1394concat( sc_concref_r<T1,T2>, sc_proxy<T3>& ); 1395 1396template <class T1, class T2> 1397inline 1398sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base> 1399concat( sc_concref<T1,T2>, const char* ); 1400 1401template <class T1, class T2> 1402inline 1403sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> > 1404concat( const char*, sc_concref<T1,T2> ); 1405 1406template <class T1, class T2> 1407inline 1408sc_concref_r<sc_concref_r<T1,T2>,sc_lv_base> 1409concat( sc_concref<T1,T2>, const sc_logic& ); 1410 1411template <class T1, class T2> 1412inline 1413sc_concref_r<sc_lv_base,sc_concref_r<T1,T2> > 1414concat( const sc_logic&, sc_concref<T1,T2> ); 1415 1416template <class T1, class T2> 1417inline 1418sc_concref_r<sc_concref_r<T1,T2>,sc_bv_base> 1419concat( sc_concref<T1,T2>, bool ); 1420 1421template <class T1, class T2> 1422inline 1423sc_concref_r<sc_bv_base,sc_concref_r<T1,T2> > 1424concat( bool, sc_concref<T1,T2> ); 1425 1426#endif 1427 1428 1429// ---------------------------------------------------------------------------- 1430// CLASS TEMPLATE : sc_concref<X,Y> 1431// 1432// Proxy class for sc_proxy concatenation (r-value and l-value). 1433// ---------------------------------------------------------------------------- 1434 1435template <class X, class Y> 1436class sc_concref 1437 : public sc_concref_r<X,Y> 1438{ 1439public: 1440 1441 // typedefs 1442 1443 typedef sc_concref_r<X,Y> base_type; 1444 1445 1446 // constructor 1447 1448 sc_concref( X& left_, Y& right_, int delete_ = 0 ) 1449 : sc_concref_r<X,Y>( left_, right_, delete_ ) 1450 {} 1451 1452 1453 // copy constructor 1454 1455 sc_concref( const sc_concref<X,Y>& a ) 1456 : sc_concref_r<X,Y>( a ) 1457 {} 1458 1459 1460 // cloning 1461 1462 sc_concref<X,Y>* clone() const 1463 { return new sc_concref<X,Y>( *this ); } 1464 1465 1466 // assignment operators 1467 1468 template <class Z> 1469 sc_concref<X,Y>& operator = ( const sc_proxy<Z>& a ) 1470 { base_type::assign_( a ); return *this; } 1471 1472 sc_concref<X,Y>& operator = ( const sc_concref<X,Y>& a ) 1473 { base_type::assign_( a ); return *this; } 1474 1475 sc_concref<X,Y>& operator = ( const char* a ) 1476 { base_type::assign_( a ); return *this; } 1477 1478 sc_concref<X,Y>& operator = ( const bool* a ) 1479 { base_type::assign_( a ); return *this; } 1480 1481 sc_concref<X,Y>& operator = ( const sc_logic* a ) 1482 { base_type::assign_( a ); return *this; } 1483 1484 sc_concref<X,Y>& operator = ( const sc_unsigned& a ) 1485 { base_type::assign_( a ); return *this; } 1486 1487 sc_concref<X,Y>& operator = ( const sc_signed& a ) 1488 { base_type::assign_( a ); return *this; } 1489 1490 sc_concref<X,Y>& operator = ( const sc_uint_base& a ) 1491 { base_type::assign_( a ); return *this; } 1492 1493 sc_concref<X,Y>& operator = ( const sc_int_base& a ) 1494 { base_type::assign_( a ); return *this; } 1495 1496 sc_concref<X,Y>& operator = ( unsigned long a ) 1497 { base_type::assign_( a ); return *this; } 1498 1499 sc_concref<X,Y>& operator = ( long a ) 1500 { base_type::assign_( a ); return *this; } 1501 1502 sc_concref<X,Y>& operator = ( unsigned int a ) 1503 { base_type::assign_( a ); return *this; } 1504 1505 sc_concref<X,Y>& operator = ( int a ) 1506 { base_type::assign_( a ); return *this; } 1507 1508 sc_concref<X,Y>& operator = ( uint64 a ) 1509 { base_type::assign_( a ); return *this; } 1510 1511 sc_concref<X,Y>& operator = ( int64 a ) 1512 { base_type::assign_( a ); return *this; } 1513 1514 1515 // other methods 1516 1517 void scan( ::std::istream& = ::std::cin ); 1518 1519private: 1520 1521 // disabled 1522 sc_concref(); 1523}; 1524 1525 1526// l-value concatenation operators and functions 1527 1528template <class T1, class T2, class T3> 1529inline 1530sc_concref<sc_concref<T1,T2>,sc_bitref<T3> > 1531operator , ( sc_concref<T1,T2>, sc_bitref<T3> ); 1532 1533template <class T1, class T2, class T3> 1534inline 1535sc_concref<sc_concref<T1,T2>,sc_subref<T3> > 1536operator , ( sc_concref<T1,T2>, sc_subref<T3> ); 1537 1538template <class T1, class T2, class T3, class T4> 1539inline 1540sc_concref<sc_concref<T1,T2>,sc_concref<T3,T4> > 1541operator , ( sc_concref<T1,T2>, sc_concref<T3,T4> ); 1542 1543template <class T1, class T2, class T3> 1544inline 1545sc_concref<sc_concref<T1,T2>,T3> 1546operator , ( sc_concref<T1,T2>, sc_proxy<T3>& ); 1547 1548 1549template <class T1, class T2, class T3> 1550inline 1551sc_concref<sc_concref<T1,T2>,sc_bitref<T3> > 1552concat( sc_concref<T1,T2>, sc_bitref<T3> ); 1553 1554template <class T1, class T2, class T3> 1555inline 1556sc_concref<sc_concref<T1,T2>,sc_subref<T3> > 1557concat( sc_concref<T1,T2>, sc_subref<T3> ); 1558 1559template <class T1, class T2, class T3, class T4> 1560inline 1561sc_concref<sc_concref<T1,T2>,sc_concref<T3,T4> > 1562concat( sc_concref<T1,T2>, sc_concref<T3,T4> ); 1563 1564template <class T1, class T2, class T3> 1565inline 1566sc_concref<sc_concref<T1,T2>,T3> 1567concat( sc_concref<T1,T2>, sc_proxy<T3>& ); 1568 1569 1570template <class T1, class T2> 1571inline 1572::std::istream& 1573operator >> ( ::std::istream&, sc_concref<T1,T2> ); 1574 1575 1576// ---------------------------------------------------------------------------- 1577// CLASS TEMPLATE : sc_proxy<T> 1578// 1579// Base class template for bit/logic vector classes. 1580// (Barton/Nackmann implementation) 1581// ---------------------------------------------------------------------------- 1582 1583// r-value concatenation operators and functions 1584 1585template <class T1, class T2> 1586inline 1587sc_concref_r<T1,sc_bitref_r<T2> > 1588operator , ( const sc_proxy<T1>&, sc_bitref_r<T2> ); 1589 1590template <class T1, class T2> 1591inline 1592sc_concref_r<T1,sc_subref_r<T2> > 1593operator , ( const sc_proxy<T1>&, sc_subref_r<T2> ); 1594 1595template <class T1, class T2, class T3> 1596inline 1597sc_concref_r<T1,sc_concref_r<T2,T3> > 1598operator , ( const sc_proxy<T1>&, sc_concref_r<T2,T3> ); 1599 1600template <class T1, class T2> 1601inline 1602sc_concref_r<T1,T2> 1603operator , ( const sc_proxy<T1>&, const sc_proxy<T2>& ); 1604 1605template <class T> 1606inline 1607sc_concref_r<T,sc_lv_base> 1608operator , ( const sc_proxy<T>&, const char* ); 1609 1610template <class T> 1611inline 1612sc_concref_r<sc_lv_base,T> 1613operator , ( const char*, const sc_proxy<T>& ); 1614 1615template <class T> 1616inline 1617sc_concref_r<T,sc_lv_base> 1618operator , ( const sc_proxy<T>&, const sc_logic& ); 1619 1620template <class T> 1621inline 1622sc_concref_r<sc_lv_base,T> 1623operator , ( const sc_logic&, const sc_proxy<T>& ); 1624 1625template <class T> 1626inline 1627sc_concref_r<T,sc_bv_base> 1628operator , ( const sc_proxy<T>&, bool ); 1629 1630template <class T> 1631inline 1632sc_concref_r<sc_bv_base,T> 1633operator , ( bool, const sc_proxy<T>& ); 1634 1635 1636template <class T1, class T2> 1637inline 1638sc_concref_r<T1,sc_bitref_r<T2> > 1639concat( const sc_proxy<T1>&, sc_bitref_r<T2> ); 1640 1641template <class T1, class T2> 1642inline 1643sc_concref_r<T1,sc_subref_r<T2> > 1644concat( const sc_proxy<T1>&, sc_subref_r<T2> ); 1645 1646template <class T1, class T2, class T3> 1647inline 1648sc_concref_r<T1,sc_concref_r<T2,T3> > 1649concat( const sc_proxy<T1>&, sc_concref_r<T2,T3> ); 1650 1651template <class T1, class T2> 1652inline 1653sc_concref_r<T1,T2> 1654concat( const sc_proxy<T1>&, const sc_proxy<T2>& ); 1655 1656template <class T> 1657inline 1658sc_concref_r<T,sc_lv_base> 1659concat( const sc_proxy<T>&, const char* ); 1660 1661template <class T> 1662inline 1663sc_concref_r<sc_lv_base,T> 1664concat( const char*, const sc_proxy<T>& ); 1665 1666template <class T> 1667inline 1668sc_concref_r<T,sc_lv_base> 1669concat( const sc_proxy<T>&, const sc_logic& ); 1670 1671template <class T> 1672inline 1673sc_concref_r<sc_lv_base,T> 1674concat( const sc_logic&, const sc_proxy<T>& ); 1675 1676template <class T> 1677inline 1678sc_concref_r<T,sc_bv_base> 1679concat( const sc_proxy<T>&, bool ); 1680 1681template <class T> 1682inline 1683sc_concref_r<sc_bv_base,T> 1684concat( bool, const sc_proxy<T>& ); 1685 1686 1687#ifdef SC_DT_MIXED_COMMA_OPERATORS 1688 1689template <class T1, class T2> 1690inline 1691sc_concref_r<T1,sc_bitref_r<T2> > 1692operator , ( const sc_proxy<T1>&, sc_bitref<T2> ); 1693 1694template <class T1, class T2> 1695inline 1696sc_concref_r<T1,sc_bitref_r<T2> > 1697operator , ( sc_proxy<T1>&, sc_bitref_r<T2> ); 1698 1699template <class T1, class T2> 1700inline 1701sc_concref_r<T1,sc_subref_r<T2> > 1702operator , ( const sc_proxy<T1>&, sc_subref<T2> ); 1703 1704template <class T1, class T2> 1705inline 1706sc_concref_r<T1,sc_subref_r<T2> > 1707operator , ( sc_proxy<T1>&, sc_subref_r<T2> ); 1708 1709template <class T1, class T2, class T3> 1710inline 1711sc_concref_r<T1,sc_concref_r<T2,T3> > 1712operator , ( const sc_proxy<T1>&, sc_concref<T2,T3> ); 1713 1714template <class T1, class T2, class T3> 1715inline 1716sc_concref_r<T1,sc_concref_r<T2,T3> > 1717operator , ( sc_proxy<T1>&, sc_concref_r<T2,T3> ); 1718 1719template <class T1, class T2> 1720inline 1721sc_concref_r<T1,T2> 1722operator , ( const sc_proxy<T1>&, sc_proxy<T2>& ); 1723 1724template <class T1, class T2> 1725inline 1726sc_concref_r<T1,T2> 1727operator , ( sc_proxy<T1>&, const sc_proxy<T2>& ); 1728 1729template <class T> 1730inline 1731sc_concref_r<T,sc_lv_base> 1732operator , ( sc_proxy<T>&, const char* ); 1733 1734template <class T> 1735inline 1736sc_concref_r<sc_lv_base,T> 1737operator , ( const char*, sc_proxy<T>& ); 1738 1739template <class T> 1740inline 1741sc_concref_r<T,sc_lv_base> 1742operator , ( sc_proxy<T>&, const sc_logic& ); 1743 1744template <class T> 1745inline 1746sc_concref_r<sc_lv_base,T> 1747operator , ( const sc_logic&, sc_proxy<T>& ); 1748 1749template <class T> 1750inline 1751sc_concref_r<T,sc_bv_base> 1752operator , ( sc_proxy<T>&, bool ); 1753 1754template <class T> 1755inline 1756sc_concref_r<sc_bv_base,T> 1757operator , ( bool, sc_proxy<T>& ); 1758 1759 1760template <class T1, class T2> 1761inline 1762sc_concref_r<T1,sc_bitref_r<T2> > 1763concat( const sc_proxy<T1>&, sc_bitref<T2> ); 1764 1765template <class T1, class T2> 1766inline 1767sc_concref_r<T1,sc_bitref_r<T2> > 1768concat( sc_proxy<T1>&, sc_bitref_r<T2> ); 1769 1770template <class T1, class T2> 1771inline 1772sc_concref_r<T1,sc_subref_r<T2> > 1773concat( const sc_proxy<T1>&, sc_subref<T2> ); 1774 1775template <class T1, class T2> 1776inline 1777sc_concref_r<T1,sc_subref_r<T2> > 1778concat( sc_proxy<T1>&, sc_subref_r<T2> ); 1779 1780template <class T1, class T2, class T3> 1781inline 1782sc_concref_r<T1,sc_concref_r<T2,T3> > 1783concat( const sc_proxy<T1>&, sc_concref<T2,T3> ); 1784 1785template <class T1, class T2, class T3> 1786inline 1787sc_concref_r<T1,sc_concref_r<T2,T3> > 1788concat( sc_proxy<T1>&, sc_concref_r<T2,T3> ); 1789 1790template <class T1, class T2> 1791inline 1792sc_concref_r<T1,T2> 1793concat( const sc_proxy<T1>&, sc_proxy<T2>& ); 1794 1795template <class T1, class T2> 1796inline 1797sc_concref_r<T1,T2> 1798concat( sc_proxy<T1>&, const sc_proxy<T2>& ); 1799 1800template <class T> 1801inline 1802sc_concref_r<T,sc_lv_base> 1803concat( sc_proxy<T>&, const char* ); 1804 1805template <class T> 1806inline 1807sc_concref_r<sc_lv_base,T> 1808concat( const char*, sc_proxy<T>& ); 1809 1810template <class T> 1811inline 1812sc_concref_r<T,sc_lv_base> 1813concat( sc_proxy<T>&, const sc_logic& ); 1814 1815template <class T> 1816inline 1817sc_concref_r<sc_lv_base,T> 1818concat( const sc_logic&, sc_proxy<T>& ); 1819 1820template <class T> 1821inline 1822sc_concref_r<T,sc_bv_base> 1823concat( sc_proxy<T>&, bool ); 1824 1825template <class T> 1826inline 1827sc_concref_r<sc_bv_base,T> 1828concat( bool, sc_proxy<T>& ); 1829 1830#endif 1831 1832 1833// l-value concatenation operators and functions 1834 1835template <class T1, class T2> 1836inline 1837sc_concref<T1,sc_bitref<T2> > 1838operator , ( sc_proxy<T1>&, sc_bitref<T2> ); 1839 1840template <class T1, class T2> 1841inline 1842sc_concref<T1,sc_subref<T2> > 1843operator , ( sc_proxy<T1>&, sc_subref<T2> ); 1844 1845template <class T1, class T2, class T3> 1846inline 1847sc_concref<T1,sc_concref<T2,T3> > 1848operator , ( sc_proxy<T1>&, sc_concref<T2,T3> ); 1849 1850template <class T1, class T2> 1851inline 1852sc_concref<T1,T2> 1853operator , ( sc_proxy<T1>&, sc_proxy<T2>& ); 1854 1855 1856template <class T1, class T2> 1857inline 1858sc_concref<T1,sc_bitref<T2> > 1859concat( sc_proxy<T1>&, sc_bitref<T2> ); 1860 1861template <class T1, class T2> 1862inline 1863sc_concref<T1,sc_subref<T2> > 1864concat( sc_proxy<T1>&, sc_subref<T2> ); 1865 1866template <class T1, class T2, class T3> 1867inline 1868sc_concref<T1,sc_concref<T2,T3> > 1869concat( sc_proxy<T1>&, sc_concref<T2,T3> ); 1870 1871template <class T1, class T2> 1872inline 1873sc_concref<T1,T2> 1874concat( sc_proxy<T1>&, sc_proxy<T2>& ); 1875 1876 1877// IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 1878 1879// ---------------------------------------------------------------------------- 1880// CLASS TEMPLATE : sc_bitref_r<T> 1881// 1882// Proxy class for sc_proxy bit selection (r-value only). 1883// ---------------------------------------------------------------------------- 1884 1885// bitwise operators and functions 1886 1887// bitwise and 1888 1889template <class T1, class T2> 1890inline 1891const sc_logic 1892operator & ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b ) 1893{ 1894 return sc_logic( sc_logic::and_table[a.value()][b.value()] ); 1895} 1896 1897 1898// bitwise or 1899 1900template <class T1, class T2> 1901inline 1902const sc_logic 1903operator | ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b ) 1904{ 1905 return sc_logic( sc_logic::or_table[a.value()][b.value()] ); 1906} 1907 1908 1909// bitwise xor 1910 1911template <class T1, class T2> 1912inline 1913const sc_logic 1914operator ^ ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b ) 1915{ 1916 return sc_logic( sc_logic::xor_table[a.value()][b.value()] ); 1917} 1918 1919 1920// relational operators and functions 1921 1922template <class T1, class T2> 1923inline 1924bool 1925operator == ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b ) 1926{ 1927 return ( (int) a.value() == b.value() ); 1928} 1929 1930template <class T1, class T2> 1931inline 1932bool 1933operator != ( const sc_bitref_r<T1>& a, const sc_bitref_r<T2>& b ) 1934{ 1935 return ( (int) a.value() != b.value() ); 1936} 1937 1938 1939// common methods 1940 1941template <class T> 1942inline 1943sc_logic_value_t 1944sc_bitref_r<T>::get_bit( int n ) const 1945{ 1946 if( n == 0 ) { 1947 return m_obj.get_bit( m_index ); 1948 } else { 1949 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_ , 0 ); 1950 // never reached 1951 return Log_0; 1952 } 1953} 1954 1955 1956template <class T> 1957inline 1958sc_digit 1959sc_bitref_r<T>::get_word( int n ) const 1960{ 1961 if( n == 0 ) { 1962 return ( get_bit( n ) & SC_DIGIT_ONE ); 1963 } else { 1964 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 ); 1965 // never reached 1966 return 0; 1967 } 1968} 1969 1970template <class T> 1971inline 1972sc_digit 1973sc_bitref_r<T>::get_cword( int n ) const 1974{ 1975 if( n == 0 ) { 1976 return ( (get_bit( n ) & SC_DIGIT_TWO) >> 1 ); 1977 } else { 1978 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 ); 1979 // never reached 1980 return 0; 1981 } 1982} 1983 1984 1985// r-value concatenation operators and functions 1986 1987template <class T1, class T2> 1988inline 1989sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> > 1990operator , ( sc_bitref_r<T1> a, sc_bitref_r<T2> b ) 1991{ 1992 return sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >( 1993 *a.clone(), *b.clone(), 3 ); 1994} 1995 1996template <class T1, class T2> 1997inline 1998sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> > 1999operator , ( sc_bitref_r<T1> a, sc_subref_r<T2> b ) 2000{ 2001 return sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >( 2002 *a.clone(), *b.clone(), 3 ); 2003} 2004 2005template <class T1, class T2, class T3> 2006inline 2007sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> > 2008operator , ( sc_bitref_r<T1> a, sc_concref_r<T2,T3> b ) 2009{ 2010 return sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >( 2011 *a.clone(), *b.clone(), 3 ); 2012} 2013 2014template <class T1, class T2> 2015inline 2016sc_concref_r<sc_bitref_r<T1>,T2> 2017operator , ( sc_bitref_r<T1> a, const sc_proxy<T2>& b ) 2018{ 2019 return sc_concref_r<sc_bitref_r<T1>,T2>( 2020 *a.clone(), b.back_cast(), 1 ); 2021} 2022 2023 2024template <class T1, class T2> 2025inline 2026sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> > 2027concat( sc_bitref_r<T1> a, sc_bitref_r<T2> b ) 2028{ 2029 return sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >( 2030 *a.clone(), *b.clone(), 3 ); 2031} 2032 2033template <class T1, class T2> 2034inline 2035sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> > 2036concat( sc_bitref_r<T1> a, sc_subref_r<T2> b ) 2037{ 2038 return sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >( 2039 *a.clone(), *b.clone(), 3 ); 2040} 2041 2042template <class T1, class T2, class T3> 2043inline 2044sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> > 2045concat( sc_bitref_r<T1> a, sc_concref_r<T2,T3> b ) 2046{ 2047 return sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >( 2048 *a.clone(), *b.clone(), 3 ); 2049} 2050 2051template <class T1, class T2> 2052inline 2053sc_concref_r<sc_bitref_r<T1>,T2> 2054concat( sc_bitref_r<T1> a, const sc_proxy<T2>& b ) 2055{ 2056 return sc_concref_r<sc_bitref_r<T1>,T2>( 2057 *a.clone(), b.back_cast(), 1 ); 2058} 2059 2060 2061#ifdef SC_DT_MIXED_COMMA_OPERATORS 2062 2063template <class T1, class T2> 2064inline 2065sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> > 2066operator , ( sc_bitref_r<T1> a, sc_bitref<T2> b ) 2067{ 2068 return sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >( 2069 *a.clone(), *b.clone(), 3 ); 2070} 2071 2072template <class T1, class T2> 2073inline 2074sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> > 2075operator , ( sc_bitref<T1> a, sc_bitref_r<T2> b ) 2076{ 2077 return sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >( 2078 *a.clone(), *b.clone(), 3 ); 2079} 2080 2081template <class T1, class T2> 2082inline 2083sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> > 2084operator , ( sc_bitref_r<T1> a, sc_subref<T2> b ) 2085{ 2086 return sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >( 2087 *a.clone(), *b.clone(), 3 ); 2088} 2089 2090template <class T1, class T2> 2091inline 2092sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> > 2093operator , ( sc_bitref<T1> a, sc_subref_r<T2> b ) 2094{ 2095 return sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >( 2096 *a.clone(), *b.clone(), 3 ); 2097} 2098 2099template <class T1, class T2, class T3> 2100inline 2101sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> > 2102operator , ( sc_bitref_r<T1> a, sc_concref<T2,T3> b ) 2103{ 2104 return sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >( 2105 *a.clone(), *b.clone(), 3 ); 2106} 2107 2108template <class T1, class T2, class T3> 2109inline 2110sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> > 2111operator , ( sc_bitref<T1> a, sc_concref_r<T2,T3> b ) 2112{ 2113 return sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >( 2114 *a.clone(), *b.clone(), 3 ); 2115} 2116 2117template <class T1, class T2> 2118inline 2119sc_concref_r<sc_bitref_r<T1>,T2> 2120operator , ( sc_bitref<T1> a, const sc_proxy<T2>& b ) 2121{ 2122 return sc_concref_r<sc_bitref_r<T1>,T2>( 2123 *a.clone(), b.back_cast(), 1 ); 2124} 2125 2126template <class T1, class T2> 2127inline 2128sc_concref_r<sc_bitref_r<T1>,T2> 2129operator , ( sc_bitref_r<T1> a, sc_proxy<T2>& b ) 2130{ 2131 return sc_concref_r<sc_bitref_r<T1>,T2>( 2132 *a.clone(), b.back_cast(), 1 ); 2133} 2134 2135 2136template <class T1, class T2> 2137inline 2138sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> > 2139concat( sc_bitref_r<T1> a, sc_bitref<T2> b ) 2140{ 2141 return sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >( 2142 *a.clone(), *b.clone(), 3 ); 2143} 2144 2145template <class T1, class T2> 2146inline 2147sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> > 2148concat( sc_bitref<T1> a, sc_bitref_r<T2> b ) 2149{ 2150 return sc_concref_r<sc_bitref_r<T1>,sc_bitref_r<T2> >( 2151 *a.clone(), *b.clone(), 3 ); 2152} 2153 2154template <class T1, class T2> 2155inline 2156sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> > 2157concat( sc_bitref_r<T1> a, sc_subref<T2> b ) 2158{ 2159 return sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >( 2160 *a.clone(), *b.clone(), 3 ); 2161} 2162 2163template <class T1, class T2> 2164inline 2165sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> > 2166concat( sc_bitref<T1> a, sc_subref_r<T2> b ) 2167{ 2168 return sc_concref_r<sc_bitref_r<T1>,sc_subref_r<T2> >( 2169 *a.clone(), *b.clone(), 3 ); 2170} 2171 2172template <class T1, class T2, class T3> 2173inline 2174sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> > 2175concat( sc_bitref_r<T1> a, sc_concref<T2,T3> b ) 2176{ 2177 return sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >( 2178 *a.clone(), *b.clone(), 3 ); 2179} 2180 2181template <class T1, class T2, class T3> 2182inline 2183sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> > 2184concat( sc_bitref<T1> a, sc_concref_r<T2,T3> b ) 2185{ 2186 return sc_concref_r<sc_bitref_r<T1>,sc_concref_r<T2,T3> >( 2187 *a.clone(), *b.clone(), 3 ); 2188} 2189 2190template <class T1, class T2> 2191inline 2192sc_concref_r<sc_bitref_r<T1>,T2> 2193concat( sc_bitref<T1> a, const sc_proxy<T2>& b ) 2194{ 2195 return sc_concref_r<sc_bitref_r<T1>,T2>( 2196 *a.clone(), b.back_cast(), 1 ); 2197} 2198 2199template <class T1, class T2> 2200inline 2201sc_concref_r<sc_bitref_r<T1>,T2> 2202concat( sc_bitref_r<T1> a, sc_proxy<T2>& b ) 2203{ 2204 return sc_concref_r<sc_bitref_r<T1>,T2>( 2205 *a.clone(), b.back_cast(), 1 ); 2206} 2207 2208#endif 2209 2210 2211// ---------------------------------------------------------------------------- 2212// CLASS TEMPLATE : sc_bitref<X> 2213// 2214// Proxy class for sc_proxy bit selection (r-value and l-value). 2215// ---------------------------------------------------------------------------- 2216 2217// assignment operators 2218 2219template <class X> 2220inline 2221sc_bitref<X>& 2222sc_bitref<X>::operator = ( const sc_bitref_r<X>& a ) 2223{ 2224 this->m_obj.set_bit( this->m_index, a.value() ); 2225 return *this; 2226} 2227 2228template <class X> 2229inline 2230sc_bitref<X>& 2231sc_bitref<X>::operator = ( const sc_bitref<X>& a ) 2232{ 2233 if( &a != this ) { 2234 this->m_obj.set_bit( this->m_index, a.value() ); 2235 } 2236 return *this; 2237} 2238 2239 2240// bitwise assignment operators 2241 2242template <class X> 2243inline 2244sc_bitref<X>& 2245sc_bitref<X>::operator &= ( const sc_bitref_r<X>& a ) 2246{ 2247 if( &a != this ) { 2248 this->m_obj.set_bit( this->m_index, 2249 sc_logic::and_table[this->value()][a.value()] ); 2250 } 2251 return *this; 2252} 2253 2254template <class X> 2255inline 2256sc_bitref<X>& 2257sc_bitref<X>::operator &= ( const sc_logic& a ) 2258{ 2259 this->m_obj.set_bit( this->m_index, 2260 sc_logic::and_table[this->value()][a.value()] ); 2261 return *this; 2262} 2263 2264 2265template <class X> 2266inline 2267sc_bitref<X>& 2268sc_bitref<X>::operator |= ( const sc_bitref_r<X>& a ) 2269{ 2270 if( &a != this ) { 2271 this->m_obj.set_bit( this->m_index, 2272 sc_logic::or_table[this->value()][a.value()] ); 2273 } 2274 return *this; 2275} 2276 2277template <class X> 2278inline 2279sc_bitref<X>& 2280sc_bitref<X>::operator |= ( const sc_logic& a ) 2281{ 2282 this->m_obj.set_bit( this->m_index, 2283 sc_logic::or_table[this->value()][a.value()] ); 2284 return *this; 2285} 2286 2287 2288template <class X> 2289inline 2290sc_bitref<X>& 2291sc_bitref<X>::operator ^= ( const sc_bitref_r<X>& a ) 2292{ 2293 if( &a != this ) { 2294 this->m_obj.set_bit( this->m_index, 2295 sc_logic::xor_table[this->value()][a.value()] ); 2296 } 2297 return *this; 2298} 2299 2300template <class X> 2301inline 2302sc_bitref<X>& 2303sc_bitref<X>::operator ^= ( const sc_logic& a ) 2304{ 2305 this->m_obj.set_bit( this->m_index, 2306 sc_logic::xor_table[this->value()][a.value()] ); 2307 return *this; 2308} 2309 2310 2311// bitwise operators and functions 2312 2313// bitwise complement 2314 2315template <class X> 2316inline 2317sc_bitref<X>& 2318sc_bitref<X>::b_not() 2319{ 2320 this->m_obj.set_bit( this->m_index, 2321 sc_logic::not_table[this->value()] ); 2322 return *this; 2323} 2324 2325 2326// common methods 2327 2328template <class X> 2329inline 2330void 2331sc_bitref<X>::set_bit( int n, sc_logic_value_t value ) 2332{ 2333 if( n == 0 ) { 2334 this->m_obj.set_bit( this->m_index, value ); 2335 } else { 2336 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 ); 2337 } 2338} 2339 2340template <class X> 2341inline 2342void 2343sc_bitref<X>::set_word( int n, sc_digit w ) 2344{ 2345 unsigned int bi = this->m_index % (8*sizeof(sc_digit)); 2346 sc_digit temp; 2347 unsigned int wi = this->m_index / (8*sizeof(sc_digit)); 2348 if( n == 0 ) { 2349 temp = this->m_obj.get_word(wi); 2350 temp = (temp & ~(1 << bi)) | ((w&1) << bi); 2351 this->m_obj.set_word(wi, temp); 2352 } else { 2353 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 ); 2354 } 2355 2356} 2357 2358template <class X> 2359inline 2360void 2361sc_bitref<X>::set_cword( int n, sc_digit w ) 2362{ 2363 unsigned int bi = this->m_index % (8*sizeof(sc_digit)); 2364 sc_digit temp; 2365 unsigned int wi = this->m_index / (8*sizeof(sc_digit)); 2366 if( n == 0 ) { 2367 temp = this->m_obj.get_cword(wi); 2368 temp = (temp & ~(1 << bi)) | ((w&1) << bi); 2369 this->m_obj.set_cword(wi, temp); 2370 } else { 2371 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 ); 2372 } 2373} 2374 2375// other methods 2376 2377template <class X> 2378inline 2379void 2380sc_bitref<X>::scan( ::std::istream& is ) 2381{ 2382 char c; 2383 is >> c; 2384 *this = c; 2385} 2386 2387 2388// l-value concatenation operators and functions 2389 2390template <class T1, class T2> 2391inline 2392sc_concref<sc_bitref<T1>,sc_bitref<T2> > 2393operator , ( sc_bitref<T1> a, sc_bitref<T2> b ) 2394{ 2395 return sc_concref<sc_bitref<T1>,sc_bitref<T2> >( 2396 *a.clone(), *b.clone(), 3 ); 2397} 2398 2399template <class T1, class T2> 2400inline 2401sc_concref<sc_bitref<T1>,sc_subref<T2> > 2402operator , ( sc_bitref<T1> a, sc_subref<T2> b ) 2403{ 2404 return sc_concref<sc_bitref<T1>,sc_subref<T2> >( 2405 *a.clone(), *b.clone(), 3 ); 2406} 2407 2408template <class T1, class T2, class T3> 2409inline 2410sc_concref<sc_bitref<T1>,sc_concref<T2,T3> > 2411operator , ( sc_bitref<T1> a, sc_concref<T2,T3> b ) 2412{ 2413 return sc_concref<sc_bitref<T1>,sc_concref<T2,T3> >( 2414 *a.clone(), *b.clone(), 3 ); 2415} 2416 2417template <class T1, class T2> 2418inline 2419sc_concref<sc_bitref<T1>,T2> 2420operator , ( sc_bitref<T1> a, sc_proxy<T2>& b ) 2421{ 2422 return sc_concref<sc_bitref<T1>,T2>( 2423 *a.clone(), b.back_cast(), 1 ); 2424} 2425 2426 2427template <class T1, class T2> 2428inline 2429sc_concref<sc_bitref<T1>,sc_bitref<T2> > 2430concat( sc_bitref<T1> a, sc_bitref<T2> b ) 2431{ 2432 return sc_concref<sc_bitref<T1>,sc_bitref<T2> >( 2433 *a.clone(), *b.clone(), 3 ); 2434} 2435 2436template <class T1, class T2> 2437inline 2438sc_concref<sc_bitref<T1>,sc_subref<T2> > 2439concat( sc_bitref<T1> a, sc_subref<T2> b ) 2440{ 2441 return sc_concref<sc_bitref<T1>,sc_subref<T2> >( 2442 *a.clone(), *b.clone(), 3 ); 2443} 2444 2445template <class T1, class T2, class T3> 2446inline 2447sc_concref<sc_bitref<T1>,sc_concref<T2,T3> > 2448concat( sc_bitref<T1> a, sc_concref<T2,T3> b ) 2449{ 2450 return sc_concref<sc_bitref<T1>,sc_concref<T2,T3> >( 2451 *a.clone(), *b.clone(), 3 ); 2452} 2453 2454template <class T1, class T2> 2455inline 2456sc_concref<sc_bitref<T1>,T2> 2457concat( sc_bitref<T1> a, sc_proxy<T2>& b ) 2458{ 2459 return sc_concref<sc_bitref<T1>,T2>( 2460 *a.clone(), b.back_cast(), 1 ); 2461} 2462 2463 2464template <class X> 2465inline 2466::std::istream& 2467operator >> ( ::std::istream& is, sc_bitref<X> a ) 2468{ 2469 a.scan( is ); 2470 return is; 2471} 2472 2473 2474// ---------------------------------------------------------------------------- 2475// CLASS TEMPLATE : sc_subref_r<X> 2476// 2477// Proxy class for sc_proxy part selection (r-value only). 2478// ---------------------------------------------------------------------------- 2479 2480template <class X> 2481inline 2482void 2483sc_subref_r<X>::check_bounds() 2484{ 2485 int len = m_obj.length(); 2486 if( m_hi < 0 || m_hi >= len || m_lo < 0 || m_lo >= len ) { 2487 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 ); 2488 } 2489 if( reversed() ) { 2490 m_len = m_lo - m_hi + 1; 2491 } else { 2492 m_len = m_hi - m_lo + 1; 2493 } 2494} 2495 2496 2497// common methods 2498 2499template <class X> 2500inline 2501sc_logic_value_t 2502sc_subref_r<X>::get_bit( int n ) const 2503{ 2504 if( reversed() ) { 2505 return m_obj.get_bit( m_lo - n ); 2506 } else { 2507 return m_obj.get_bit( m_lo + n ); 2508 } 2509} 2510 2511template <class X> 2512inline 2513void 2514sc_subref_r<X>::set_bit( int n, sc_logic_value_t value ) 2515{ 2516 if( reversed() ) { 2517 m_obj.set_bit( m_lo - n, value ); 2518 } else { 2519 m_obj.set_bit( m_lo + n, value ); 2520 } 2521} 2522 2523 2524template <class X> 2525inline 2526sc_digit 2527sc_subref_r<X>::get_word( int i ) const 2528{ 2529 int n1 = 0; 2530 int n2 = 0; 2531 sc_digit result = 0; 2532 int k = 0; 2533 if( reversed() ) { 2534 n1 = m_lo - i * SC_DIGIT_SIZE; 2535 n2 = sc_max( n1 - SC_DIGIT_SIZE, m_hi - 1 ); 2536 for( int n = n1; n > n2; n -- ) { 2537 result |= (m_obj[n].value() & SC_DIGIT_ONE) << k ++; 2538 } 2539 } else { 2540 n1 = m_lo + i * SC_DIGIT_SIZE; 2541 n2 = sc_min( n1 + SC_DIGIT_SIZE, m_hi + 1 ); 2542 for( int n = n1; n < n2; n ++ ) { 2543 result |= (m_obj[n].value() & SC_DIGIT_ONE) << k ++; 2544 } 2545 } 2546 return result; 2547} 2548 2549template <class X> 2550inline 2551void 2552sc_subref_r<X>::set_word( int i, sc_digit w ) 2553{ 2554 int n1 = 0; 2555 int n2 = 0; 2556 int k = 0; 2557 if( reversed() ) { 2558 n1 = m_lo - i * SC_DIGIT_SIZE; 2559 n2 = sc_max( n1 - SC_DIGIT_SIZE, m_hi - 1 ); 2560 for( int n = n1; n > n2; n -- ) { 2561 m_obj.set_bit( n, sc_logic_value_t( 2562 ( (w >> k ++) & SC_DIGIT_ONE ) | 2563 ( m_obj[n].value() & SC_DIGIT_TWO ) ) ); 2564 } 2565 } else { 2566 n1 = m_lo + i * SC_DIGIT_SIZE; 2567 n2 = sc_min( n1 + SC_DIGIT_SIZE, m_hi + 1 ); 2568 for( int n = n1; n < n2; n ++ ) { 2569 m_obj.set_bit( n, sc_logic_value_t( 2570 ( (w >> k ++) & SC_DIGIT_ONE ) | 2571 ( m_obj[n].value() & SC_DIGIT_TWO ) ) ); 2572 } 2573 } 2574} 2575 2576 2577template <class X> 2578inline 2579sc_digit 2580sc_subref_r<X>::get_cword( int i ) const 2581{ 2582 int n1 = 0; 2583 int n2 = 0; 2584 sc_digit result = 0; 2585 int k = 0; 2586 if( reversed() ) { 2587 n1 = m_lo - i * SC_DIGIT_SIZE; 2588 n2 = sc_max( n1 - SC_DIGIT_SIZE, m_hi - 1 ); 2589 for( int n = n1; n > n2; n -- ) { 2590 result |= ((m_obj[n].value() & SC_DIGIT_TWO) >> 1) << k ++; 2591 } 2592 } else { 2593 n1 = m_lo + i * SC_DIGIT_SIZE; 2594 n2 = sc_min( n1 + SC_DIGIT_SIZE, m_hi + 1 ); 2595 for( int n = n1; n < n2; n ++ ) { 2596 result |= ((m_obj[n].value() & SC_DIGIT_TWO) >> 1) << k ++; 2597 } 2598 } 2599 return result; 2600} 2601 2602template <class X> 2603inline 2604void 2605sc_subref_r<X>::set_cword( int i, sc_digit w ) 2606{ 2607 int n1 = 0; 2608 int n2 = 0; 2609 int k = 0; 2610 if( reversed() ) { 2611 n1 = m_lo - i * SC_DIGIT_SIZE; 2612 n2 = sc_max( n1 - SC_DIGIT_SIZE, m_hi - 1 ); 2613 for( int n = n1; n > n2; n -- ) { 2614 m_obj.set_bit( n, sc_logic_value_t( 2615 ( ((w >> k ++) & SC_DIGIT_ONE) << 1 ) | 2616 ( m_obj[n].value() & SC_DIGIT_ONE ) ) ); 2617 } 2618 } else { 2619 n1 = m_lo + i * SC_DIGIT_SIZE; 2620 n2 = sc_min( n1 + SC_DIGIT_SIZE, m_hi + 1 ); 2621 for( int n = n1; n < n2; n ++ ) { 2622 m_obj.set_bit( n, sc_logic_value_t( 2623 ( ((w >> k ++) & SC_DIGIT_ONE) << 1 ) | 2624 ( m_obj[n].value() & SC_DIGIT_ONE ) ) ); 2625 } 2626 } 2627} 2628 2629 2630// other methods 2631 2632template <class X> 2633inline 2634bool 2635sc_subref_r<X>::is_01() const 2636{ 2637 int sz = size(); 2638 for( int i = 0; i < sz; ++ i ) { 2639 if( get_cword( i ) != SC_DIGIT_ZERO ) { 2640 return false; 2641 } 2642 } 2643 return true; 2644} 2645 2646 2647// r-value concatenation operators and functions 2648 2649template <class T1, class T2> 2650inline 2651sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> > 2652operator , ( sc_subref_r<T1> a, sc_bitref_r<T2> b ) 2653{ 2654 return sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >( 2655 *a.clone(), *b.clone(), 3 ); 2656} 2657 2658template <class T1, class T2> 2659inline 2660sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> > 2661operator , ( sc_subref_r<T1> a, sc_subref_r<T2> b ) 2662{ 2663 return sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >( 2664 *a.clone(), *b.clone(), 3 ); 2665} 2666 2667template <class T1, class T2, class T3> 2668inline 2669sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> > 2670operator , ( sc_subref_r<T1> a, sc_concref_r<T2,T3> b ) 2671{ 2672 return sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >( 2673 *a.clone(), *b.clone(), 3 ); 2674} 2675 2676template <class T1, class T2> 2677inline 2678sc_concref_r<sc_subref_r<T1>,T2> 2679operator , ( sc_subref_r<T1> a, const sc_proxy<T2>& b ) 2680{ 2681 return sc_concref_r<sc_subref_r<T1>,T2>( 2682 *a.clone(), b.back_cast(), 1 ); 2683} 2684 2685 2686template <class T1, class T2> 2687inline 2688sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> > 2689concat( sc_subref_r<T1> a, sc_bitref_r<T2> b ) 2690{ 2691 return sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >( 2692 *a.clone(), *b.clone(), 3 ); 2693} 2694 2695template <class T1, class T2> 2696inline 2697sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> > 2698concat( sc_subref_r<T1> a, sc_subref_r<T2> b ) 2699{ 2700 return sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >( 2701 *a.clone(), *b.clone(), 3 ); 2702} 2703 2704template <class T1, class T2, class T3> 2705inline 2706sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> > 2707concat( sc_subref_r<T1> a, sc_concref_r<T2,T3> b ) 2708{ 2709 return sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >( 2710 *a.clone(), *b.clone(), 3 ); 2711} 2712 2713template <class T1, class T2> 2714inline 2715sc_concref_r<sc_subref_r<T1>,T2> 2716concat( sc_subref_r<T1> a, const sc_proxy<T2>& b ) 2717{ 2718 return sc_concref_r<sc_subref_r<T1>,T2>( 2719 *a.clone(), b.back_cast(), 1 ); 2720} 2721 2722 2723#ifdef SC_DT_MIXED_COMMA_OPERATORS 2724 2725template <class T1, class T2> 2726inline 2727sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> > 2728operator , ( sc_subref_r<T1> a, sc_bitref<T2> b ) 2729{ 2730 return sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >( 2731 *a.clone(), *b.clone(), 3 ); 2732} 2733 2734template <class T1, class T2> 2735inline 2736sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> > 2737operator , ( sc_subref<T1> a, sc_bitref_r<T2> b ) 2738{ 2739 return sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >( 2740 *a.clone(), *b.clone(), 3 ); 2741} 2742 2743template <class T1, class T2> 2744inline 2745sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> > 2746operator , ( sc_subref_r<T1> a, sc_subref<T2> b ) 2747{ 2748 return sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >( 2749 *a.clone(), *b.clone(), 3 ); 2750} 2751 2752template <class T1, class T2> 2753inline 2754sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> > 2755operator , ( sc_subref<T1> a, sc_subref_r<T2> b ) 2756{ 2757 return sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >( 2758 *a.clone(), *b.clone(), 3 ); 2759} 2760 2761template <class T1, class T2, class T3> 2762inline 2763sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> > 2764operator , ( sc_subref_r<T1> a, sc_concref<T2,T3> b ) 2765{ 2766 return sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >( 2767 *a.clone(), *b.clone(), 3 ); 2768} 2769 2770template <class T1, class T2, class T3> 2771inline 2772sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> > 2773operator , ( sc_subref<T1> a, sc_concref_r<T2,T3> b ) 2774{ 2775 return sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >( 2776 *a.clone(), *b.clone(), 3 ); 2777} 2778 2779template <class T1, class T2> 2780inline 2781sc_concref_r<sc_subref_r<T1>,T2> 2782operator , ( sc_subref<T1> a, const sc_proxy<T2>& b ) 2783{ 2784 return sc_concref_r<sc_subref_r<T1>,T2>( 2785 *a.clone(), b.back_cast(), 1 ); 2786} 2787 2788template <class T1, class T2> 2789inline 2790sc_concref_r<sc_subref_r<T1>,T2> 2791operator , ( sc_subref_r<T1> a, sc_proxy<T2>& b ) 2792{ 2793 return sc_concref_r<sc_subref_r<T1>,T2>( 2794 *a.clone(), b.back_cast(), 1 ); 2795} 2796 2797 2798template <class T1, class T2> 2799inline 2800sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> > 2801concat( sc_subref_r<T1> a, sc_bitref<T2> b ) 2802{ 2803 return sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >( 2804 *a.clone(), *b.clone(), 3 ); 2805} 2806 2807template <class T1, class T2> 2808inline 2809sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> > 2810concat( sc_subref<T1> a, sc_bitref_r<T2> b ) 2811{ 2812 return sc_concref_r<sc_subref_r<T1>,sc_bitref_r<T2> >( 2813 *a.clone(), *b.clone(), 3 ); 2814} 2815 2816template <class T1, class T2> 2817inline 2818sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> > 2819concat( sc_subref_r<T1> a, sc_subref<T2> b ) 2820{ 2821 return sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >( 2822 *a.clone(), *b.clone(), 3 ); 2823} 2824 2825template <class T1, class T2> 2826inline 2827sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> > 2828concat( sc_subref<T1> a, sc_subref_r<T2> b ) 2829{ 2830 return sc_concref_r<sc_subref_r<T1>,sc_subref_r<T2> >( 2831 *a.clone(), *b.clone(), 3 ); 2832} 2833 2834template <class T1, class T2, class T3> 2835inline 2836sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> > 2837concat( sc_subref_r<T1> a, sc_concref<T2,T3> b ) 2838{ 2839 return sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >( 2840 *a.clone(), *b.clone(), 3 ); 2841} 2842 2843template <class T1, class T2, class T3> 2844inline 2845sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> > 2846concat( sc_subref<T1> a, sc_concref_r<T2,T3> b ) 2847{ 2848 return sc_concref_r<sc_subref_r<T1>,sc_concref_r<T2,T3> >( 2849 *a.clone(), *b.clone(), 3 ); 2850} 2851 2852template <class T1, class T2> 2853inline 2854sc_concref_r<sc_subref_r<T1>,T2> 2855concat( sc_subref<T1> a, const sc_proxy<T2>& b ) 2856{ 2857 return sc_concref_r<sc_subref_r<T1>,T2>( 2858 *a.clone(), b.back_cast(), 1 ); 2859} 2860 2861template <class T1, class T2> 2862inline 2863sc_concref_r<sc_subref_r<T1>,T2> 2864concat( sc_subref_r<T1> a, sc_proxy<T2>& b ) 2865{ 2866 return sc_concref_r<sc_subref_r<T1>,T2>( 2867 *a.clone(), b.back_cast(), 1 ); 2868} 2869 2870#endif 2871 2872 2873// ---------------------------------------------------------------------------- 2874// CLASS TEMPLATE : sc_subref<X> 2875// 2876// Proxy class for sc_proxy part selection (r-value and l-value). 2877// ---------------------------------------------------------------------------- 2878 2879// assignment operators 2880 2881// sc_subref<X>::operator = ( const sc_subref_r<X>& ) in sc_lv_base.h 2882// sc_subref<X>::operator = ( const sc_subref<X>& ) in sc_lv_base.h 2883 2884 2885// other methods 2886 2887template <class T> 2888inline 2889void 2890sc_subref<T>::scan( ::std::istream& is ) 2891{ 2892 std::string s; 2893 is >> s; 2894 *this = s.c_str(); 2895} 2896 2897 2898// l-value concatenation operators and functions 2899 2900template <class T1, class T2> 2901inline 2902sc_concref<sc_subref<T1>,sc_bitref<T2> > 2903operator , ( sc_subref<T1> a, sc_bitref<T2> b ) 2904{ 2905 return sc_concref<sc_subref<T1>,sc_bitref<T2> >( 2906 *a.clone(), *b.clone(), 3 ); 2907} 2908 2909template <class T1, class T2> 2910inline 2911sc_concref<sc_subref<T1>,sc_subref<T2> > 2912operator , ( sc_subref<T1> a, sc_subref<T2> b ) 2913{ 2914 return sc_concref<sc_subref<T1>,sc_subref<T2> >( 2915 *a.clone(), *b.clone(), 3 ); 2916} 2917 2918template <class T1, class T2, class T3> 2919inline 2920sc_concref<sc_subref<T1>,sc_concref<T2,T3> > 2921operator , ( sc_subref<T1> a, sc_concref<T2,T3> b ) 2922{ 2923 return sc_concref<sc_subref<T1>,sc_concref<T2,T3> >( 2924 *a.clone(), *b.clone(), 3 ); 2925} 2926 2927template <class T1, class T2> 2928inline 2929sc_concref<sc_subref<T1>,T2> 2930operator , ( sc_subref<T1> a, sc_proxy<T2>& b ) 2931{ 2932 return sc_concref<sc_subref<T1>,T2>( 2933 *a.clone(), b.back_cast(), 1 ); 2934} 2935 2936 2937template <class T1, class T2> 2938inline 2939sc_concref<sc_subref<T1>,sc_bitref<T2> > 2940concat( sc_subref<T1> a, sc_bitref<T2> b ) 2941{ 2942 return sc_concref<sc_subref<T1>,sc_bitref<T2> >( 2943 *a.clone(), *b.clone(), 3 ); 2944} 2945 2946template <class T1, class T2> 2947inline 2948sc_concref<sc_subref<T1>,sc_subref<T2> > 2949concat( sc_subref<T1> a, sc_subref<T2> b ) 2950{ 2951 return sc_concref<sc_subref<T1>,sc_subref<T2> >( 2952 *a.clone(), *b.clone(), 3 ); 2953} 2954 2955template <class T1, class T2, class T3> 2956inline 2957sc_concref<sc_subref<T1>,sc_concref<T2,T3> > 2958concat( sc_subref<T1> a, sc_concref<T2,T3> b ) 2959{ 2960 return sc_concref<sc_subref<T1>,sc_concref<T2,T3> >( 2961 *a.clone(), *b.clone(), 3 ); 2962} 2963 2964template <class T1, class T2> 2965inline 2966sc_concref<sc_subref<T1>,T2> 2967concat( sc_subref<T1> a, sc_proxy<T2>& b ) 2968{ 2969 return sc_concref<sc_subref<T1>,T2>( 2970 *a.clone(), b.back_cast(), 1 ); 2971} 2972 2973 2974template <class X> 2975inline 2976::std::istream& 2977operator >> ( ::std::istream& is, sc_subref<X> a ) 2978{ 2979 a.scan( is ); 2980 return is; 2981} 2982 2983 2984// ---------------------------------------------------------------------------- 2985// CLASS TEMPLATE : sc_concref_r<X,Y> 2986// 2987// Proxy class for sc_proxy concatenation (r-value only). 2988// ---------------------------------------------------------------------------- 2989 2990// destructor 2991 2992template <class X, class Y> 2993inline 2994sc_concref_r<X,Y>::~sc_concref_r() 2995{ 2996 if( -- m_refs == 0 ) { 2997 delete &m_refs; 2998 if( m_delete == 0 ) { 2999 return; 3000 } 3001 if( m_delete & 1 ) { 3002 delete &m_left; 3003 } 3004 if( m_delete & 2 ) { 3005 delete &m_right; 3006 } 3007 } 3008} 3009 3010 3011// common methods 3012 3013template <class X, class Y> 3014inline 3015sc_logic_value_t 3016sc_concref_r<X,Y>::get_bit( int n ) const 3017{ 3018 int r_len = m_right.length(); 3019 if( n < r_len ) { 3020 return m_right.get_bit( n ); 3021 } else if( n < r_len + m_left.length() ) { 3022 return m_left.get_bit( n - r_len ); 3023 } else { 3024 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 ); 3025 // never reached 3026 return Log_0; 3027 } 3028} 3029 3030template <class X, class Y> 3031inline 3032void 3033sc_concref_r<X,Y>::set_bit( int n, sc_logic_value_t v ) 3034{ 3035 int r_len = m_right.length(); 3036 if( n < r_len ) { 3037 m_right.set_bit( n, v ); 3038 } else if( n < r_len + m_left.length() ) { 3039 m_left.set_bit( n - r_len, v ); 3040 } else { 3041 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 ); 3042 } 3043} 3044 3045 3046template <class X, class Y> 3047inline 3048sc_digit 3049sc_concref_r<X,Y>::get_word( int i ) const 3050{ 3051 if( i < 0 || i >= size() ) { 3052 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 ); 3053 } 3054 // 0 <= i < size() 3055 Y& r = m_right; 3056 int r_len = r.length(); 3057 int border = r_len / SC_DIGIT_SIZE; 3058 if( i < border ) { 3059 return r.get_word( i ); 3060 } 3061 // border <= i < size() 3062 X& l = m_left; 3063 int shift = r_len % SC_DIGIT_SIZE; 3064 int j = i - border; 3065 if( shift == 0 ) { 3066 return l.get_word( j ); 3067 } 3068 // border <= i < size() && shift != 0 3069 int nshift = SC_DIGIT_SIZE - shift; 3070 if( i == border ) { 3071 sc_digit rl_mask = ~SC_DIGIT_ZERO >> nshift; 3072 return ( (r.get_word( i ) & rl_mask) | (l.get_word( 0 ) << shift) ); 3073 } 3074 // border < i < size() && shift != 0 3075 if ( j < l.size() ) 3076 return ( (l.get_word( j - 1 ) >> nshift) | (l.get_word( j ) << shift) ); 3077 else 3078 return (l.get_word( j - 1 ) >> nshift); 3079} 3080 3081template <class X, class Y> 3082inline 3083void 3084sc_concref_r<X,Y>::set_word( int i, sc_digit w ) 3085{ 3086 if( i < 0 || i >= size() ) { 3087 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 ); 3088 } 3089 // 0 <= i < size() 3090 Y& r = m_right; 3091 int r_len = r.length(); 3092 int border = r_len / SC_DIGIT_SIZE; 3093 if( i < border ) { 3094 r.set_word( i, w ); 3095 return; 3096 } 3097 // border <= i < size() 3098 X& l = m_left; 3099 int shift = r_len % SC_DIGIT_SIZE; 3100 int j = i - border; 3101 if( shift == 0 ) { 3102 l.set_word( j, w ); 3103 return; 3104 } 3105 // border <= i < size() && shift != 0 3106 int nshift = SC_DIGIT_SIZE - shift; 3107 sc_digit lh_mask = ~SC_DIGIT_ZERO << nshift; 3108 if( i == border ) { 3109 sc_digit rl_mask = ~SC_DIGIT_ZERO >> nshift; 3110 r.set_word( i, w & rl_mask ); 3111 l.set_word( 0, (l.get_word( 0 ) & lh_mask) | (w >> shift) ); 3112 return; 3113 } 3114 // border < i < size() && shift != 0 3115 sc_digit ll_mask = ~SC_DIGIT_ZERO >> shift; 3116 l.set_word( j - 1, (l.get_word( j - 1 ) & ll_mask) | (w << nshift) ); 3117 if ( j < l.size() ) 3118 l.set_word( j, (l.get_word( j ) & lh_mask) | (w >> shift) ); 3119} 3120 3121 3122template <class X, class Y> 3123inline 3124sc_digit 3125sc_concref_r<X,Y>::get_cword( int i ) const 3126{ 3127 if( i < 0 || i >= size() ) { 3128 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 ); 3129 } 3130 // 0 <= i < size() 3131 Y& r = m_right; 3132 int r_len = r.length(); 3133 int border = r_len / SC_DIGIT_SIZE; 3134 if( i < border ) { 3135 return r.get_cword( i ); 3136 } 3137 // border <= i < size() 3138 X& l = m_left; 3139 int shift = r_len % SC_DIGIT_SIZE; 3140 int j = i - border; 3141 if( shift == 0 ) { 3142 return l.get_cword( j ); 3143 } 3144 // border <= i < size() && shift != 0 3145 int nshift = SC_DIGIT_SIZE - shift; 3146 if( i == border ) { 3147 sc_digit rl_mask = ~SC_DIGIT_ZERO >> nshift; 3148 return ( (r.get_cword( i ) & rl_mask) | (l.get_cword( 0 ) << shift) ); 3149 } 3150 // border < i < size() && shift != 0 3151 if ( j < l.size() ) 3152 return ( (l.get_cword(j - 1) >> nshift) | (l.get_cword(j) << shift) ); 3153 else 3154 return (l.get_cword( j - 1 ) >> nshift); 3155} 3156 3157template <class X, class Y> 3158inline 3159void 3160sc_concref_r<X,Y>::set_cword( int i, sc_digit w ) 3161{ 3162 if( i < 0 || i >= size() ) { 3163 SC_REPORT_ERROR( sc_core::SC_ID_OUT_OF_BOUNDS_, 0 ); 3164 } 3165 // 0 <= i < size() 3166 Y& r = m_right; 3167 int r_len = r.length(); 3168 int border = r_len / SC_DIGIT_SIZE; 3169 if( i < border ) { 3170 r.set_cword( i, w ); 3171 return; 3172 } 3173 // border <= i < size() 3174 X& l = m_left; 3175 int shift = r_len % SC_DIGIT_SIZE; 3176 int j = i - border; 3177 if( shift == 0 ) { 3178 l.set_cword( j, w ); 3179 return; 3180 } 3181 // border <= i < size() && shift != 0 3182 int nshift = SC_DIGIT_SIZE - shift; 3183 sc_digit lh_mask = ~SC_DIGIT_ZERO << nshift; 3184 if( i == border ) { 3185 sc_digit rl_mask = ~SC_DIGIT_ZERO >> nshift; 3186 r.set_cword( i, w & rl_mask ); 3187 l.set_cword( 0, (l.get_cword( 0 ) & lh_mask) | (w >> shift) ); 3188 return; 3189 } 3190 // border < i < size() && shift != 0 3191 sc_digit ll_mask = ~SC_DIGIT_ZERO >> shift; 3192 l.set_cword( j - 1, (l.get_cword( j - 1 ) & ll_mask) | (w << nshift) ); 3193 if ( j < l.size() ) 3194 l.set_cword( j, (l.get_cword( j ) & lh_mask) | (w >> shift) ); 3195} 3196 3197 3198// r-value concatenation operators and functions 3199 3200template <class T1, class T2, class T3> 3201inline 3202sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> > 3203operator , ( sc_concref_r<T1,T2> a, sc_bitref_r<T3> b ) 3204{ 3205 return sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >( 3206 *a.clone(), *b.clone(), 3 ); 3207} 3208 3209template <class T1, class T2, class T3> 3210inline 3211sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> > 3212operator , ( sc_concref_r<T1,T2> a, sc_subref_r<T3> b ) 3213{ 3214 return sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >( 3215 *a.clone(), *b.clone(), 3 ); 3216} 3217 3218template <class T1, class T2, class T3, class T4> 3219inline 3220sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> > 3221operator , ( sc_concref_r<T1,T2> a, sc_concref_r<T3,T4> b ) 3222{ 3223 return sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >( 3224 *a.clone(), *b.clone(), 3 ); 3225} 3226 3227template <class T1, class T2, class T3> 3228inline 3229sc_concref_r<sc_concref_r<T1,T2>,T3> 3230operator , ( sc_concref_r<T1,T2> a, const sc_proxy<T3>& b ) 3231{ 3232 return sc_concref_r<sc_concref_r<T1,T2>,T3>( 3233 *a.clone(), b.back_cast(), 1 ); 3234} 3235 3236 3237template <class T1, class T2, class T3> 3238inline 3239sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> > 3240concat( sc_concref_r<T1,T2> a, sc_bitref_r<T3> b ) 3241{ 3242 return sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >( 3243 *a.clone(), *b.clone(), 3 ); 3244} 3245 3246template <class T1, class T2, class T3> 3247inline 3248sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> > 3249concat( sc_concref_r<T1,T2> a, sc_subref_r<T3> b ) 3250{ 3251 return sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >( 3252 *a.clone(), *b.clone(), 3 ); 3253} 3254 3255template <class T1, class T2, class T3, class T4> 3256inline 3257sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> > 3258concat( sc_concref_r<T1,T2> a, sc_concref_r<T3,T4> b ) 3259{ 3260 return sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >( 3261 *a.clone(), *b.clone(), 3 ); 3262} 3263 3264template <class T1, class T2, class T3> 3265inline 3266sc_concref_r<sc_concref_r<T1,T2>,T3> 3267concat( sc_concref_r<T1,T2> a, const sc_proxy<T3>& b ) 3268{ 3269 return sc_concref_r<sc_concref_r<T1,T2>,T3>( 3270 *a.clone(), b.back_cast(), 1 ); 3271} 3272 3273 3274#ifdef SC_DT_MIXED_COMMA_OPERATORS 3275 3276template <class T1, class T2, class T3> 3277inline 3278sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> > 3279operator , ( sc_concref_r<T1,T2> a, sc_bitref<T3> b ) 3280{ 3281 return sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >( 3282 *a.clone(), *b.clone(), 3 ); 3283} 3284 3285template <class T1, class T2, class T3> 3286inline 3287sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> > 3288operator , ( sc_concref<T1,T2> a, sc_bitref_r<T3> b ) 3289{ 3290 return sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >( 3291 *a.clone(), *b.clone(), 3 ); 3292} 3293 3294template <class T1, class T2, class T3> 3295inline 3296sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> > 3297operator , ( sc_concref_r<T1,T2> a, sc_subref<T3> b ) 3298{ 3299 return sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >( 3300 *a.clone(), *b.clone(), 3 ); 3301} 3302 3303template <class T1, class T2, class T3> 3304inline 3305sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> > 3306operator , ( sc_concref<T1,T2> a, sc_subref_r<T3> b ) 3307{ 3308 return sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >( 3309 *a.clone(), *b.clone(), 3 ); 3310} 3311 3312template <class T1, class T2, class T3, class T4> 3313inline 3314sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> > 3315operator , ( sc_concref_r<T1,T2> a, sc_concref<T3,T4> b ) 3316{ 3317 return sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >( 3318 *a.clone(), *b.clone(), 3 ); 3319} 3320 3321template <class T1, class T2, class T3, class T4> 3322inline 3323sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> > 3324operator , ( sc_concref<T1,T2> a, sc_concref_r<T3,T4> b ) 3325{ 3326 return sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >( 3327 *a.clone(), *b.clone(), 3 ); 3328} 3329 3330template <class T1, class T2, class T3> 3331inline 3332sc_concref_r<sc_concref_r<T1,T2>,T3> 3333operator , ( sc_concref<T1,T2> a, const sc_proxy<T3>& b ) 3334{ 3335 return sc_concref_r<sc_concref_r<T1,T2>,T3>( 3336 *a.clone(), b.back_cast(), 1 ); 3337} 3338 3339template <class T1, class T2, class T3> 3340inline 3341sc_concref_r<sc_concref_r<T1,T2>,T3> 3342operator , ( sc_concref_r<T1,T2> a, sc_proxy<T3>& b ) 3343{ 3344 return sc_concref_r<sc_concref_r<T1,T2>,T3>( 3345 *a.clone(), b.back_cast(), 1 ); 3346} 3347 3348 3349template <class T1, class T2, class T3> 3350inline 3351sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> > 3352concat( sc_concref_r<T1,T2> a, sc_bitref<T3> b ) 3353{ 3354 return sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >( 3355 *a.clone(), *b.clone(), 3 ); 3356} 3357 3358template <class T1, class T2, class T3> 3359inline 3360sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> > 3361concat( sc_concref<T1,T2> a, sc_bitref_r<T3> b ) 3362{ 3363 return sc_concref_r<sc_concref_r<T1,T2>,sc_bitref_r<T3> >( 3364 *a.clone(), *b.clone(), 3 ); 3365} 3366 3367template <class T1, class T2, class T3> 3368inline 3369sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> > 3370concat( sc_concref_r<T1,T2> a, sc_subref<T3> b ) 3371{ 3372 return sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >( 3373 *a.clone(), *b.clone(), 3 ); 3374} 3375 3376template <class T1, class T2, class T3> 3377inline 3378sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> > 3379concat( sc_concref<T1,T2> a, sc_subref_r<T3> b ) 3380{ 3381 return sc_concref_r<sc_concref_r<T1,T2>,sc_subref_r<T3> >( 3382 *a.clone(), *b.clone(), 3 ); 3383} 3384 3385template <class T1, class T2, class T3, class T4> 3386inline 3387sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> > 3388concat( sc_concref_r<T1,T2> a, sc_concref<T3,T4> b ) 3389{ 3390 return sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >( 3391 *a.clone(), *b.clone(), 3 ); 3392} 3393 3394template <class T1, class T2, class T3, class T4> 3395inline 3396sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> > 3397concat( sc_concref<T1,T2> a, sc_concref_r<T3,T4> b ) 3398{ 3399 return sc_concref_r<sc_concref_r<T1,T2>,sc_concref_r<T3,T4> >( 3400 *a.clone(), *b.clone(), 3 ); 3401} 3402 3403template <class T1, class T2, class T3> 3404inline 3405sc_concref_r<sc_concref_r<T1,T2>,T3> 3406concat( sc_concref<T1,T2> a, const sc_proxy<T3>& b ) 3407{ 3408 return sc_concref_r<sc_concref_r<T1,T2>,T3>( 3409 *a.clone(), b.back_cast(), 1 ); 3410} 3411 3412template <class T1, class T2, class T3> 3413inline 3414sc_concref_r<sc_concref_r<T1,T2>,T3> 3415concat( sc_concref_r<T1,T2> a, sc_proxy<T3>& b ) 3416{ 3417 return sc_concref_r<sc_concref_r<T1,T2>,T3>( 3418 *a.clone(), b.back_cast(), 1 ); 3419} 3420 3421#endif 3422 3423 3424// ---------------------------------------------------------------------------- 3425// CLASS TEMPLATE : sc_concref<X,Y> 3426// 3427// Proxy class for sc_proxy concatenation (r-value and l-value). 3428// ---------------------------------------------------------------------------- 3429 3430// other methods 3431 3432template <class T1, class T2> 3433inline 3434void 3435sc_concref<T1,T2>::scan( ::std::istream& is ) 3436{ 3437 std::string s; 3438 is >> s; 3439 *this = s.c_str(); 3440} 3441 3442 3443// l-value concatenation operators and functions 3444 3445template <class T1, class T2, class T3> 3446inline 3447sc_concref<sc_concref<T1,T2>,sc_bitref<T3> > 3448operator , ( sc_concref<T1,T2> a, sc_bitref<T3> b ) 3449{ 3450 return sc_concref<sc_concref<T1,T2>,sc_bitref<T3> >( 3451 *a.clone(), *b.clone(), 3 ); 3452} 3453 3454template <class T1, class T2, class T3> 3455inline 3456sc_concref<sc_concref<T1,T2>,sc_subref<T3> > 3457operator , ( sc_concref<T1,T2> a, sc_subref<T3> b ) 3458{ 3459 return sc_concref<sc_concref<T1,T2>,sc_subref<T3> >( 3460 *a.clone(), *b.clone(), 3 ); 3461} 3462 3463template <class T1, class T2, class T3, class T4> 3464inline 3465sc_concref<sc_concref<T1,T2>,sc_concref<T3,T4> > 3466operator , ( sc_concref<T1,T2> a, sc_concref<T3,T4> b ) 3467{ 3468 return sc_concref<sc_concref<T1,T2>,sc_concref<T3,T4> >( 3469 *a.clone(), *b.clone(), 3 ); 3470} 3471 3472template <class T1, class T2, class T3> 3473inline 3474sc_concref<sc_concref<T1,T2>,T3> 3475operator , ( sc_concref<T1,T2> a, sc_proxy<T3>& b ) 3476{ 3477 return sc_concref<sc_concref<T1,T2>,T3>( 3478 *a.clone(), b.back_cast(), 1 ); 3479} 3480 3481 3482template <class T1, class T2, class T3> 3483inline 3484sc_concref<sc_concref<T1,T2>,sc_bitref<T3> > 3485concat( sc_concref<T1,T2> a, sc_bitref<T3> b ) 3486{ 3487 return sc_concref<sc_concref<T1,T2>,sc_bitref<T3> >( 3488 *a.clone(), *b.clone(), 3 ); 3489} 3490 3491template <class T1, class T2, class T3> 3492inline 3493sc_concref<sc_concref<T1,T2>,sc_subref<T3> > 3494concat( sc_concref<T1,T2> a, sc_subref<T3> b ) 3495{ 3496 return sc_concref<sc_concref<T1,T2>,sc_subref<T3> >( 3497 *a.clone(), *b.clone(), 3 ); 3498} 3499 3500template <class T1, class T2, class T3, class T4> 3501inline 3502sc_concref<sc_concref<T1,T2>,sc_concref<T3,T4> > 3503concat( sc_concref<T1,T2> a, sc_concref<T3,T4> b ) 3504{ 3505 return sc_concref<sc_concref<T1,T2>,sc_concref<T3,T4> >( 3506 *a.clone(), *b.clone(), 3 ); 3507} 3508 3509template <class T1, class T2, class T3> 3510inline 3511sc_concref<sc_concref<T1,T2>,T3> 3512concat( sc_concref<T1,T2> a, sc_proxy<T3>& b ) 3513{ 3514 return sc_concref<sc_concref<T1,T2>,T3>( 3515 *a.clone(), b.back_cast(), 1 ); 3516} 3517 3518 3519template <class X, class Y> 3520inline 3521::std::istream& 3522operator >> ( ::std::istream& is, sc_concref<X,Y> a ) 3523{ 3524 a.scan( is ); 3525 return is; 3526} 3527 3528 3529// ---------------------------------------------------------------------------- 3530// CLASS TEMPLATE : sc_proxy<T> 3531// 3532// Base class template for bit/logic vector classes. 3533// (Barton/Nackmann implementation) 3534// ---------------------------------------------------------------------------- 3535 3536// r-value concatenation operators and functions 3537 3538template <class T1, class T2> 3539inline 3540sc_concref_r<T1,sc_bitref_r<T2> > 3541operator , ( const sc_proxy<T1>& a, sc_bitref_r<T2> b ) 3542{ 3543 return sc_concref_r<T1,sc_bitref_r<T2> >( 3544 a.back_cast(), *b.clone(), 2 ); 3545} 3546 3547template <class T1, class T2> 3548inline 3549sc_concref_r<T1,sc_subref_r<T2> > 3550operator , ( const sc_proxy<T1>& a, sc_subref_r<T2> b ) 3551{ 3552 return sc_concref_r<T1,sc_subref_r<T2> >( 3553 a.back_cast(), *b.clone(), 2 ); 3554} 3555 3556template <class T1, class T2, class T3> 3557inline 3558sc_concref_r<T1,sc_concref_r<T2,T3> > 3559operator , ( const sc_proxy<T1>& a, sc_concref_r<T2,T3> b ) 3560{ 3561 return sc_concref_r<T1,sc_concref_r<T2,T3> >( 3562 a.back_cast(), *b.clone(), 2 ); 3563} 3564 3565template <class T1, class T2> 3566inline 3567sc_concref_r<T1,T2> 3568operator , ( const sc_proxy<T1>& a, const sc_proxy<T2>& b ) 3569{ 3570 return sc_concref_r<T1,T2>( 3571 a.back_cast(), b.back_cast() ); 3572} 3573 3574 3575template <class T1, class T2> 3576inline 3577sc_concref_r<T1,sc_bitref_r<T2> > 3578concat( const sc_proxy<T1>& a, sc_bitref_r<T2> b ) 3579{ 3580 return sc_concref_r<T1,sc_bitref_r<T2> >( 3581 a.back_cast(), *b.clone(), 2 ); 3582} 3583 3584template <class T1, class T2> 3585inline 3586sc_concref_r<T1,sc_subref_r<T2> > 3587concat( const sc_proxy<T1>& a, sc_subref_r<T2> b ) 3588{ 3589 return sc_concref_r<T1,sc_subref_r<T2> >( 3590 a.back_cast(), *b.clone(), 2 ); 3591} 3592 3593template <class T1, class T2, class T3> 3594inline 3595sc_concref_r<T1,sc_concref_r<T2,T3> > 3596concat( const sc_proxy<T1>& a, sc_concref_r<T2,T3> b ) 3597{ 3598 return sc_concref_r<T1,sc_concref_r<T2,T3> >( 3599 a.back_cast(), *b.clone(), 2 ); 3600} 3601 3602template <class T1, class T2> 3603inline 3604sc_concref_r<T1,T2> 3605concat( const sc_proxy<T1>& a, const sc_proxy<T2>& b ) 3606{ 3607 return sc_concref_r<T1,T2>( 3608 a.back_cast(), b.back_cast() ); 3609} 3610 3611 3612#ifdef SC_DT_MIXED_COMMA_OPERATORS 3613 3614template <class T1, class T2> 3615inline 3616sc_concref_r<T1,sc_bitref_r<T2> > 3617operator , ( const sc_proxy<T1>& a, sc_bitref<T2> b ) 3618{ 3619 return sc_concref_r<T1,sc_bitref_r<T2> >( 3620 a.back_cast(), *b.clone(), 2 ); 3621} 3622 3623template <class T1, class T2> 3624inline 3625sc_concref_r<T1,sc_bitref_r<T2> > 3626operator , ( sc_proxy<T1>& a, sc_bitref_r<T2> b ) 3627{ 3628 return sc_concref_r<T1,sc_bitref_r<T2> >( 3629 a.back_cast(), *b.clone(), 2 ); 3630} 3631 3632template <class T1, class T2> 3633inline 3634sc_concref_r<T1,sc_subref_r<T2> > 3635operator , ( const sc_proxy<T1>& a, sc_subref<T2> b ) 3636{ 3637 return sc_concref_r<T1,sc_subref_r<T2> >( 3638 a.back_cast(), *b.clone(), 2 ); 3639} 3640 3641template <class T1, class T2> 3642inline 3643sc_concref_r<T1,sc_subref_r<T2> > 3644operator , ( sc_proxy<T1>& a, sc_subref_r<T2> b ) 3645{ 3646 return sc_concref_r<T1,sc_subref_r<T2> >( 3647 a.back_cast(), *b.clone(), 2 ); 3648} 3649 3650template <class T1, class T2, class T3> 3651inline 3652sc_concref_r<T1,sc_concref_r<T2,T3> > 3653operator , ( const sc_proxy<T1>& a, sc_concref<T2,T3> b ) 3654{ 3655 return sc_concref_r<T1,sc_concref_r<T2,T3> >( 3656 a.back_cast(), *b.clone(), 2 ); 3657} 3658 3659template <class T1, class T2, class T3> 3660inline 3661sc_concref_r<T1,sc_concref_r<T2,T3> > 3662operator , ( sc_proxy<T1>& a, sc_concref_r<T2,T3> b ) 3663{ 3664 return sc_concref_r<T1,sc_concref_r<T2,T3> >( 3665 a.back_cast(), *b.clone(), 2 ); 3666} 3667 3668template <class T1, class T2> 3669inline 3670sc_concref_r<T1,T2> 3671operator , ( const sc_proxy<T1>& a, sc_proxy<T2>& b ) 3672{ 3673 return sc_concref_r<T1,T2>( 3674 a.back_cast(), b.back_cast() ); 3675} 3676 3677template <class T1, class T2> 3678inline 3679sc_concref_r<T1,T2> 3680operator , ( sc_proxy<T1>& a, const sc_proxy<T2>& b ) 3681{ 3682 return sc_concref_r<T1,T2>( 3683 a.back_cast(), b.back_cast() ); 3684} 3685 3686 3687template <class T1, class T2> 3688inline 3689sc_concref_r<T1,sc_bitref_r<T2> > 3690concat( const sc_proxy<T1>& a, sc_bitref<T2> b ) 3691{ 3692 return sc_concref_r<T1,sc_bitref_r<T2> >( 3693 a.back_cast(), *b.clone(), 2 ); 3694} 3695 3696template <class T1, class T2> 3697inline 3698sc_concref_r<T1,sc_bitref_r<T2> > 3699concat( sc_proxy<T1>& a, sc_bitref_r<T2> b ) 3700{ 3701 return sc_concref_r<T1,sc_bitref_r<T2> >( 3702 a.back_cast(), *b.clone(), 2 ); 3703} 3704 3705template <class T1, class T2> 3706inline 3707sc_concref_r<T1,sc_subref_r<T2> > 3708concat( const sc_proxy<T1>& a, sc_subref<T2> b ) 3709{ 3710 return sc_concref_r<T1,sc_subref_r<T2> >( 3711 a.back_cast(), *b.clone(), 2 ); 3712} 3713 3714template <class T1, class T2> 3715inline 3716sc_concref_r<T1,sc_subref_r<T2> > 3717concat( sc_proxy<T1>& a, sc_subref_r<T2> b ) 3718{ 3719 return sc_concref_r<T1,sc_subref_r<T2> >( 3720 a.back_cast(), *b.clone(), 2 ); 3721} 3722 3723template <class T1, class T2, class T3> 3724inline 3725sc_concref_r<T1,sc_concref_r<T2,T3> > 3726concat( const sc_proxy<T1>& a, sc_concref<T2,T3> b ) 3727{ 3728 return sc_concref_r<T1,sc_concref_r<T2,T3> >( 3729 a.back_cast(), *b.clone(), 2 ); 3730} 3731 3732template <class T1, class T2, class T3> 3733inline 3734sc_concref_r<T1,sc_concref_r<T2,T3> > 3735concat( sc_proxy<T1>& a, sc_concref_r<T2,T3> b ) 3736{ 3737 return sc_concref_r<T1,sc_concref_r<T2,T3> >( 3738 a.back_cast(), *b.clone(), 2 ); 3739} 3740 3741template <class T1, class T2> 3742inline 3743sc_concref_r<T1,T2> 3744concat( const sc_proxy<T1>& a, sc_proxy<T2>& b ) 3745{ 3746 return sc_concref_r<T1,T2>( 3747 a.back_cast(), b.back_cast() ); 3748} 3749 3750template <class T1, class T2> 3751inline 3752sc_concref_r<T1,T2> 3753concat( sc_proxy<T1>& a, const sc_proxy<T2>& b ) 3754{ 3755 return sc_concref_r<T1,T2>( 3756 a.back_cast(), b.back_cast() ); 3757} 3758 3759#endif 3760 3761 3762// l-value concatenation operators and functions 3763 3764template <class T1, class T2> 3765inline 3766sc_concref<T1,sc_bitref<T2> > 3767operator , ( sc_proxy<T1>& a, sc_bitref<T2> b ) 3768{ 3769 return sc_concref<T1,sc_bitref<T2> >( 3770 a.back_cast(), *b.clone(), 2 ); 3771} 3772 3773template <class T1, class T2> 3774inline 3775sc_concref<T1,sc_subref<T2> > 3776operator , ( sc_proxy<T1>& a, sc_subref<T2> b ) 3777{ 3778 return sc_concref<T1,sc_subref<T2> >( 3779 a.back_cast(), *b.clone(), 2 ); 3780} 3781 3782template <class T1, class T2, class T3> 3783inline 3784sc_concref<T1,sc_concref<T2,T3> > 3785operator , ( sc_proxy<T1>& a, sc_concref<T2,T3> b ) 3786{ 3787 return sc_concref<T1,sc_concref<T2,T3> >( 3788 a.back_cast(), *b.clone(), 2 ); 3789} 3790 3791template <class T1, class T2> 3792inline 3793sc_concref<T1,T2> 3794operator , ( sc_proxy<T1>& a, sc_proxy<T2>& b ) 3795{ 3796 return sc_concref<T1,T2>( 3797 a.back_cast(), b.back_cast() ); 3798} 3799 3800 3801template <class T1, class T2> 3802inline 3803sc_concref<T1,sc_bitref<T2> > 3804concat( sc_proxy<T1>& a, sc_bitref<T2> b ) 3805{ 3806 return sc_concref<T1,sc_bitref<T2> >( 3807 a.back_cast(), *b.clone(), 2 ); 3808} 3809 3810template <class T1, class T2> 3811inline 3812sc_concref<T1,sc_subref<T2> > 3813concat( sc_proxy<T1>& a, sc_subref<T2> b ) 3814{ 3815 return sc_concref<T1,sc_subref<T2> >( 3816 a.back_cast(), *b.clone(), 2 ); 3817} 3818 3819template <class T1, class T2, class T3> 3820inline 3821sc_concref<T1,sc_concref<T2,T3> > 3822concat( sc_proxy<T1>& a, sc_concref<T2,T3> b ) 3823{ 3824 return sc_concref<T1,sc_concref<T2,T3> >( 3825 a.back_cast(), *b.clone(), 2 ); 3826} 3827 3828template <class T1, class T2> 3829inline 3830sc_concref<T1,T2> 3831concat( sc_proxy<T1>& a, sc_proxy<T2>& b ) 3832{ 3833 return sc_concref<T1,T2>( 3834 a.back_cast(), b.back_cast() ); 3835} 3836 3837} // namespace sc_dt 3838 3839// $Log: sc_bit_proxies.h,v $ 3840// Revision 1.10 2011/09/05 21:19:53 acg 3841// Philipp A. Hartmann: added parentheses to expressions to eliminate 3842// compiler warnings. 3843// 3844// Revision 1.9 2011/09/01 15:03:42 acg 3845// Philipp A. Hartmann: add parentheses to eliminate compiler warnings. 3846// 3847// Revision 1.8 2011/08/29 18:04:32 acg 3848// Philipp A. Hartmann: miscellaneous clean ups. 3849// 3850// Revision 1.7 2011/08/24 22:05:40 acg 3851// Torsten Maehne: initialization changes to remove warnings. 3852// 3853// Revision 1.6 2010/02/22 14:25:43 acg 3854// Andy Goodrich: removed 'mutable' directive from references, since it 3855// is not a legal C++ construct. 3856// 3857// Revision 1.5 2009/02/28 00:26:14 acg 3858// Andy Goodrich: bug fixes. 3859// 3860// Revision 1.4 2007/03/14 17:48:37 acg 3861// Andy Goodrich: fixed bug. 3862// 3863// Revision 1.3 2007/01/18 19:29:18 acg 3864// Andy Goodrich: fixed bug in concatenations of bit selects on sc_lv and 3865// sc_bv types. The offending code was in sc_bitref<X>::set_word and 3866// sc_bitref<X>::get_word. These methods were not writing the bit they 3867// represented, but rather writing an entire word whose index was the 3868// index of the bit they represented. This not only did not write the 3869// correct bit, but clobbered a word that might not even be in the 3870// variable the reference was for. 3871// 3872// Revision 1.2 2007/01/17 22:45:08 acg 3873// Andy Goodrich: fixed sc_bitref<X>::set_bit(). 3874// 3875// Revision 1.1.1.1 2006/12/15 20:31:36 acg 3876// SystemC 2.2 3877// 3878// Revision 1.3 2006/01/13 18:53:53 acg 3879// Andy Goodrich: added $Log command so that CVS comments are reproduced in 3880// the source. 3881// 3882 3883 3884#endif 3885